Un modelo de lenguaje solo sabe lo que vio durante su . Nunca leyó tu manual interno, ni la política de reembolsos que cambió el martes, ni los nombres de producto que tu equipo inventó el año pasado. Reentrenarlo cada vez que cambia un documento no es práctico, y pegar todos los documentos en la pregunta tampoco funciona: no caben y, si cupieran, costaría demasiado.
(Retrieval-Augmented Generation) toma un camino más simple, parecido a un examen a libro abierto. Antes de que el modelo responda, el sistema busca los pocos fragmentos de tus documentos que importan para esa pregunta y se los entrega, con la instrucción de responder a partir de ellos y decir de dónde sale cada afirmación. El modelo no cambia; solo cambia lo que le damos a leer.
- Preguntalo que alguien consulta
- Búsquedaencuentra los pocos fragmentos que importan
- Instruccionespregunta + fragmentos + "cita tus fuentes"
- Respuestaescrita a partir de los fragmentos, con citas
Esta lección cubre las cuatro ideas que deciden si RAG funciona: cómo el sistema encuentra fragmentos por significado, cómo se preparan los documentos, cómo combinar dos tipos de búsqueda y cómo saber qué falló cuando una respuesta es mala.
Buscar texto por significado
Una búsqueda normal compara palabras. Si preguntas "¿cuánto tarda el reembolso?", no encontrará una página titulada "plazo para recibir tu dinero", porque no comparten palabras. RAG necesita una búsqueda que entienda que dicen lo mismo.
Eso es lo que aporta un . Un modelo de embeddings lee un texto y lo convierte en una larga lista de números que funciona como coordenadas en un mapa de significados. Los textos que dicen cosas parecidas quedan cerca en ese mapa, aunque usen palabras distintas. Para buscar, el sistema convierte también la pregunta en coordenadas y elige los fragmentos más cercanos. La cercanía se suele medir con similitud coseno, un puntaje de qué tanto apuntan en la misma dirección dos de esas listas.
Los fragmentos y sus coordenadas se guardan en un vector store, una base de datos hecha para responder rápido "¿cuáles de estos están más cerca de este punto?", incluso entre millones de entradas.
Preparar los documentos
Antes de poder buscar, los documentos pasan por la ingestión: extraer el texto de cada archivo, cortarlo en fragmentos llamados chunks, calcular sus coordenadas y guardarlos. Cómo se corta importa más de lo que parece:
- Chunks demasiado grandes mezclan varios temas y terminan sin parecerse a ninguna pregunta concreta.
- Chunks demasiado pequeños pierden contexto: "el plazo es de 30 días" dice poco si no se sabe de qué plazo habla.
- Un poco de solapamiento entre chunks vecinos evita que una idea quede partida justo en el corte.
- ArchivoPDF, Word, página web
- Textoextraído del archivo
- Chunksfragmentos cortos, con algo de solapamiento
- Coordenadasun embedding por chunk
- Vector storeguardado y listo para buscar
Combinar significado y palabras exactas
La búsqueda por significado tiene un punto ciego: los identificadores exactos. Un código de producto como QX-4471, un apellido o el número de una cláusula no tienen un "significado" que el mapa pueda captar. La búsqueda clásica por palabras clave tiene el perfil opuesto: encuentra coincidencias exactas y no entiende sinónimos. El ranking por palabras más usado se llama , y bases como Postgres o Elasticsearch lo ofrecen.
La recuperación híbrida ejecuta ambas búsquedas y combina los resultados. Las dos producen puntajes en escalas distintas, así que no se pueden sumar sin más. La solución habitual, Reciprocal Rank Fusion (RRF), ignora los puntajes y mira solo las posiciones: un fragmento que aparece arriba en ambas listas sube al primer lugar.
Un último paso, opcional, es el . Un modelo más lento y cuidadoso lee la pregunta y cada uno de los mejores candidatos juntos y los reordena. Es demasiado lento para recorrer toda la colección, así que solo ve la lista corta.
- Dos búsquedasen paralelo
- Por significado
- Por palabras exactas
- Combinar por posicióngana lo que está arriba en ambas listas
- Rerankingun modelo cuidadoso lee pregunta y fragmento juntos
- Lista cortalos fragmentos que leerá el modelo
Lograr que el modelo use lo que encontró
Encontrar los fragmentos correctos es la mitad del trabajo; el modelo todavía tiene que apoyarse en ellos. El patrón habitual es numerar los fragmentos en las instrucciones, pedirle al modelo que responda solo con ellos y cite los números, y devolver la lista de fuentes junto con la respuesta para que una persona pueda verificar.
Cuando RAG da una mala respuesta
Antes de culpar al modelo, divide el problema en dos: ¿el fragmento correcto llegó al modelo? ¿El modelo lo usó bien?
| Lo que ves | Causa probable | Dónde mirar |
|---|---|---|
| Respuesta inventada, fuentes irrelevantes | Nunca se encontró el fragmento correcto | Calidad de la búsqueda y del corte |
| Fragmento correcto presente, respuesta errónea | El modelo lo usó mal | Instrucciones, tamaño del modelo, exceso de ruido |
| Dato desactualizado | El índice no se actualizó | Reindexar cuando cambian los archivos |
| Un código exacto nunca aparece | Solo búsqueda por significado | Agregar búsqueda por palabras |
| Resultados extraños tras cambiar de modelo | Coordenadas viejas y nuevas mezcladas | Reindexar todo |
La última fila es fácil de pasar por alto: las coordenadas de dos modelos de embeddings distintos no son comparables, así que cambiar ese modelo obliga a reindexar toda la colección. Adapta lo verifica: si el modelo de embeddings configurado ya no coincide con el que se usó para indexar una colección, se detiene con un error claro en lugar de devolver resultados equivocados sin avisar (Operations Runbook).
Los archivos subidos también son entrada no confiable. Un archivo comprimido puede estar hecho para expandirse a gigabytes o para escribir fuera de la carpeta donde se descomprime, y un documento puede esconder instrucciones dirigidas al modelo. Ese último riesgo, la indirecta, se ve en Sandboxing y seguridad de agentes. Adapta protege sus archivos de imágenes subidos contra los dos primeros (extract_bundle en adapta/services/training.py), y la subida de documentos tiene un límite de tamaño, así que un archivo demasiado grande se rechaza antes de guardarse.
En la práctica
- Mide la búsqueda por separado. Guarda un conjunto pequeño de preguntas reales con el documento que cada una debería encontrar. Sin eso, nadie puede saber si un cambio ayudó. Lo vemos en Evaluar modelos.
- Elige dónde viven los vectores. Si el equipo ya opera Postgres, pgvector evita sumar un sistema. Un vector store dedicado se justifica por escala o por funciones que de verdad necesitas.
- Revisa el idioma. Muchos modelos de embeddings y de reranking por defecto se entrenaron sobre todo en inglés. Para contenido en español o mixto, elige modelos multilingües y mídelos.
- Aplica los permisos en la búsqueda. Si no todos pueden ver todos los documentos, fíltralos antes de que lleguen al modelo. Una instrucción en el no es control de acceso.
Para profundizar
La documentación de Adapta explica las mismas ideas con su código como ejemplo (en inglés):
- Learning the system construye RAG desde cero: embeddings, el vector store, la recuperación híbrida y el ciclo completo.
- Stack and decisions compara cada pieza de la recuperación con las opciones que se descartaron, y explica por qué.
- Knowledge and behavior muestra RAG y trabajando juntos en un mismo asistente, paso a paso.
Para llevar
- RAG agrega conocimiento sin reentrenar: encontrar los fragmentos relevantes, dárselos al modelo y pedirle que cite.
- Los embeddings encuentran texto por significado; la búsqueda por palabras encuentra términos exactos. Combinarlas cubre el punto ciego de cada una.
- Cómo se cortan y se mantienen al día los documentos causa tantas fallas como el modelo.
- Cuando una respuesta está mal, pregunta primero si el fragmento correcto llegó a encontrarse.
Comprueba lo aprendido
¿Por qué una búsqueda por significado no encuentra de forma confiable un código como QX-4471?
Un identificador exacto casi no tiene significado que el embedding pueda captar, así que sus coordenadas no quedan cerca de las de la pregunta. La búsqueda por palabras clave, que compara el texto literal, cubre ese caso.
¿Por qué la recuperación híbrida combina posiciones en lugar de sumar los dos puntajes?
Las dos búsquedas puntúan en escalas distintas y no comparables. Las posiciones en cada lista sí son comparables, así que un fragmento que aparece arriba en ambas sube al primer lugar.
El fragmento correcto está en lo que recibió el modelo, pero la respuesta es incorrecta. ¿Dónde miras?
Del lado de la generación: las instrucciones, la cantidad de texto irrelevante alrededor del fragmento y la capacidad del modelo. La búsqueda ya hizo su trabajo.