RAG: darle al modelo los datos que no tiene
La generación aumentada por recuperación busca los fragmentos relevantes con embeddings y los pega al prompt. Es la forma más barata de que un modelo hable de tus datos sin reentrenarlo.
- #rag
- #embeddings
- #busqueda
El problema
Un modelo de lenguaje sabe lo que había en sus datos de entrenamiento hasta cierta fecha. No sabe qué dice tu manual interno, tu contrato o el ticket que abrieron esta mañana. Y si le preguntas, inventará una respuesta plausible con total seguridad.
Hay dos formas de arreglarlo: reentrenar el modelo con tus datos (caro, lento, y hay que repetirlo cada vez que cambian) o darle los datos en el momento de la pregunta. Lo segundo es RAG: Retrieval-Augmented Generation.
Las tres etapas
1. Indexar documentos → trozos → embeddings → índice
2. Recuperar pregunta → embedding → los k trozos más cercanos
3. Generar prompt = instrucciones + trozos recuperados + pregunta → modelo
La magia está en la etapa 2, y no es magia: es la similitud coseno entre embeddings aplicada a gran escala. La pregunta se convierte en un vector; los trozos cuyo vector está más cerca son los que probablemente contienen la respuesta.
El detalle que decide si funciona: el troceado
Los documentos no se indexan enteros. Se cortan en fragmentos (chunks) de unos cientos de tokens. El tamaño importa más de lo que parece:
| Fragmentos | Ventaja | Problema |
|---|---|---|
| Pequeños (100–200 tokens) | Muy precisos: el vector representa una sola idea. | Pierden contexto: "él firmó" sin saber quién es él. |
| Grandes (800+ tokens) | Conservan el contexto. | El vector se diluye entre varias ideas; recupera peor. |
Un punto de partida razonable: 300–500 tokens con solapamiento del 10–20 % entre fragmentos consecutivos, para que ninguna frase quede partida sin contexto.
Qué le dices al modelo
El prompt final no es solo "responde esto". Es una instrucción con reglas:
Responde SOLO con la información de los fragmentos siguientes.
Si la respuesta no está en ellos, di "no lo sé con estos datos".
Cita el fragmento que usaste.
[Fragmento 1] ...
[Fragmento 2] ...
Pregunta: ...
Ese "si no está, di que no lo sabes" es lo que convierte RAG en algo fiable. Sin esa instrucción, el modelo rellena los huecos con su entrenamiento y vuelves al problema original.
Lo que RAG no resuelve
- Preguntas que requieren leer todo. "¿Cuántas veces aparece X en el corpus?" no se responde con los 5 fragmentos más cercanos.
- Recuperación mala = respuesta mala. Si el fragmento correcto no aparece entre los recuperados, el modelo no puede usarlo. La mayoría de los fallos de RAG son fallos de búsqueda, no de generación.
- Datos contradictorios. Si dos fragmentos dicen cosas distintas, el modelo elegirá uno o mezclará ambos. Hace falta limpiar el corpus, no ajustar el prompt.
Para llevarte
RAG es búsqueda semántica + un prompt con reglas. La calidad depende del troceado y de la recuperación mucho más que del modelo. Si algo falla, mira primero qué fragmentos se recuperaron; casi siempre el problema está ahí.