Ir al contenido

Errores comunes en tu primer RAG

Si esto es tu primer RAG, vas a cometer al menos tres de estos errores. Lo digo con cariño — los cometí yo, los cometen mis colegas senior, los cometen los tutoriales online. Conocerlos de antemano te ahorra horas de debugging confuso.

1. Modelo de embeddings distinto en ingest vs query

Sección titulada «1. Modelo de embeddings distinto en ingest vs query»

Síntoma: Scores siempre muy bajos (top-1 < 0.4) para queries que deberían matchear obvio. La respuesta del LLM es inútil.

Causa: El modelo que usaste para embedear chunks NO es el mismo que usaste para embedear la query. Los vectores viven en espacios distintos — son incomparables.

Fix: Usá una constante compartida (OLLAMA_EMBED en este repo, en @rag-lab/shared/config.ts). Si tenés que cambiar de modelo, re-indexá todo.

Síntoma A (chunks muy chicos, ej. 200 chars): top-K trae chunks parciales que no responden la pregunta. El LLM dice “no tengo suficiente contexto”.

Síntoma B (chunks muy grandes, ej. 3000 chars): la respuesta del LLM es vaga, mete temas de la pregunta mezclados con otros. Pierde foco.

Fix: Empezá con 800 chars / 100 overlap (el default del repo). Después, medí: probá 400 / 50, 1200 / 150, y comparte respuestas. El sweet spot depende del corpus.

Síntoma: Scores raros (negativos cuando esperás 0-1, o todos parecidos).

Causa: Creaste la collection con distance: 'Euclid' o 'Dot' en vez de 'Cosine'.

Fix: Para texto, siempre cosine salvo que sepás muy bien qué hacés. Verificá la collection con curl http://localhost:6333/collections/rag_vercel.

4. Prompt sin instrucciones anti-alucinación

Sección titulada «4. Prompt sin instrucciones anti-alucinación»

Síntoma: El LLM responde con info que no está en el corpus. Inventa con confianza.

Causa: Tu prompt no le dice explícitamente que se restrinja al contexto. Frases tipo “Answer the question” sin más son insuficientes.

Fix: Las dos frases mágicas del prompt template del repo:

Answer the question using ONLY the context below.
If the context does not contain enough information, say so.

Ambas son obligatorias. La primera restringe; la segunda habilita admitir ignorancia.

5. Mismatch de idioma corpus / query / modelo

Sección titulada «5. Mismatch de idioma corpus / query / modelo»

Síntoma: Scores bajos consistentemente, sin importar la pregunta.

Causa: Corpus en español + query en inglés + nomic-embed-text monolingual = retrieval pobre.

Fix: Mantené idioma consistente. Si necesitás multilingual, usá multilingual-e5-small o BGE-M3 (Ollama tiene varios). El paquete 05-web-demo del repo usa el primero como referencia.

Síntoma: Las respuestas del LLM se vuelven vagas o se contradicen.

Causa: Trayendo 10-15 chunks, varios son ruido. El LLM intenta integrar todo y se pierde.

Fix: Empezá con K = 4 (default del repo). Subí a 6-8 solo si tu corpus es grande y heterogéneo. Más allá de 10, casi siempre estás dilutando señal.

7. No re-indexar después de cambiar algo importante

Sección titulada «7. No re-indexar después de cambiar algo importante»

Síntoma: Cambiaste el chunker o el modelo y los resultados no mejoran.

Causa: Qdrant todavía tiene los vectores viejos. Cualquier cambio de upstream (chunker, modelo, dimensión) requiere borrar y recrear la collection.

Fix: El script ingest.ts del repo ya lo hace por vos (recreateCollection()). Si trabajás con tu propio pipeline, agregá ese paso explícitamente.

Si llegaste hasta acá:

  • Tenés el stack 100% local funcionando
  • Indexaste el corpus
  • Hiciste tu primera query
  • Sabés inspeccionar y debuggear
  • Conocés los 7 errores más comunes

Eso ya es más de lo que sabe el 80% de la gente que dice que “trabaja con RAG”. Posta.

Tu RAG anda. Sabés mirar adentro, sabés reconocer los errores típicos. Pero “me parece que está OK” no escala. Si cambiás el chunk size o el TOP_K, ¿está mejor o peor? ¿Cuánto?

Para responder eso necesitás métricas reproducibles. Eso es Nivel 2 — Calidad y evaluación: eval harness propio, faithfulness, golden sets, datasets sintéticos. Cuando termines, vas a poder cambiar parámetros y medir la diferencia en lugar de adivinarla.

(Después, los Niveles 3 y 4 te llevan a producción — técnicas avanzadas y operación. El cierre del curso es la comparativa side-by-side de los 4 frameworks del repo, en el último nivel.)

Siguiente nivel Nivel 2 — Calidad y evaluación Eval harness propio, faithfulness, golden sets y datasets sintéticos. Cambiar configs y medir, no adivinar.