Renderz.Studio
El Arsenal
OperacionesAvanzado40 minGratis

Testing de Aplicaciones IA

Unit tests · evals · benchmarks · cómo saber si tu IA funciona

TestingEvalsQA
Guía gratuita · Acceso completo
01

Tipos de tests para aplicaciones IA

TipoQué testeaDeterministaFrecuencia
Unit testsParsers, validators, utilsSíCada commit
IntegrationAPI routes, DB queriesSíCada commit
EvalsCalidad de respuestas LLMNoDiario/semanal
RegressionQue no empeore con cambiosNoAntes de deploy

  Advertencia

No mockees el LLM en tests de eval. El punto es validar el comportamiento real del modelo con tu prompt.
02

Evals con datasets de golden examples

tests/evals/qa-eval.ts
import { describe, it, expect } from 'vitest'
import { generateAnswer } from '@/lib/ai/qa'

// Dataset de ejemplos "golden" - respuestas que sabemos correctas
const EVAL_DATASET = [
  {
    question: '¿Cuál es la capital de España?',
    expectedContains: ['Madrid'],
    expectedNotContains: ['Barcelona', 'Valencia'],
  },
  {
    question: '¿Qué es TypeScript?',
    expectedContains: ['JavaScript', 'tipos', 'Microsoft'],
    expectedNotContains: ['Python', 'Ruby'],
  },
]

describe('QA Evals', () => {
  for (const example of EVAL_DATASET) {
    it(`should answer: ${example.question.slice(0, 30)}...`, async () => {
      const answer = await generateAnswer(example.question)

      // Check expected content is present
      for (const expected of example.expectedContains) {
        expect(answer.toLowerCase()).toContain(expected.toLowerCase())
      }

      // Check unwanted content is absent
      for (const notExpected of example.expectedNotContains) {
        expect(answer.toLowerCase()).not.toContain(notExpected.toLowerCase())
      }
    }, 30000) // Timeout alto para llamadas a API
  }
})
03

LLM-as-judge para evaluación semántica

tests/evals/llm-judge.ts
import Anthropic from '@anthropic-ai/sdk'

const anthropic = new Anthropic()

interface EvalResult {
  score: number // 1-5
  reasoning: string
}

export async function evaluateWithLLM(
  question: string,
  answer: string,
  criteria: string
): Promise<EvalResult> {
  const response = await anthropic.messages.create({
    model: 'claude-sonnet-4-20250514',
    max_tokens: 500,
    messages: [{
      role: 'user',
      content: `Evalúa esta respuesta del 1 al 5.

Pregunta: ${question}
Respuesta: ${answer}
Criterio: ${criteria}

Responde en JSON: {"score": N, "reasoning": "..."}`
    }],
  })

  const text = response.content[0].type === 'text' ? response.content[0].text : ''
  return JSON.parse(text)
}

// Uso
const result = await evaluateWithLLM(
  '¿Cómo funciona React?',
  'React es una librería de JavaScript para construir interfaces...',
  'Precisión técnica y claridad'
)
console.log(result) // { score: 4, reasoning: "Respuesta correcta pero..." }

  Tip Pro

Usa un modelo diferente como judge del que genera las respuestas para evitar sesgo.

¿Quieres el sistema completo?

500+ páginas, 25 capítulos, código de producción, acceso a todas las guías del Arsenal.

Curso Completo · €29PayPal · Acceso inmediato
¿Hablamos?