Objetivo técnico
Al terminar podrás escribir un test pequeño para una regla de RAG y diagnosticar en qué frontera falla. Testing comprueba una expectativa repetible; debugging busca evidencia para explicar un resultado inesperado.
Antes de empezar
Necesitas un proyecto TypeScript con Vitest. Instálalo con npm install -D vitest y agrega "test": "vitest run" a scripts. La función del ejemplo no llama servicios externos.
Paso a paso
- Crea
src/answer.ts:
export function canAnswer(chunks: string[]): boolean {
return chunks.length > 0;
}
- Crea
src/answer.test.ts:
import { describe, expect, it } from 'vitest';
import { canAnswer } from './answer';
describe('canAnswer', () => {
it('rejects a question without retrieved evidence', () => {
expect(canAnswer([])).toBe(false);
});
it('allows an answer when evidence exists', () => {
expect(canAnswer(['chunk relevante'])).toBe(true);
});
});
- Ejecuta
npm test. - Cambia temporalmente la implementación por
return true. Mira fallar el primer test y lee: nombre del caso, valor recibido y esperado. - Restaura la regla. Si un sistema real falla, registra
requestId, cantidad de chunks y etapa; no el documento completo.
Verificación
Primero debes observar un fallo causado deliberadamente y después dos tests verdes. Eso demuestra que el test detecta la regresión, no que pasa por accidente.
Errores frecuentes
- Probar el mock en vez de la regla del dominio.
- Cambiar test e implementación a la vez y perder la señal roja.
- Loggear demasiado sin identificar la etapa: ingestión, retrieval o generación.
Práctica
Agrega una regla: un array con strings vacíos tampoco permite responder. Escribe el test primero, observa rojo, implementa el filtro y vuelve a verde.
Puente al RAG
Las evaluaciones del Bloque 5 necesitan diferenciar “no recuperó evidencia” de “generó una mala respuesta”. Este test crea la primera frontera observable.