RAG y recuperación de conocimiento
RAG (Retrieval-Augmented Generation, Generación Aumentada por Recuperación) es una de las arquitecturas de implementación de LLM más populares en la actualidad.
La idea central de RAG es:Hacer que el LLM, al responder una pregunta, primero recupere contenido relevante de una base de conocimiento externa y luego genere la respuesta basándose en los resultados de la recuperación,en lugar de depender únicamente del conocimiento memorizado durante el entrenamiento del modelo.
Esto resuelve dos puntos críticos de los LLM: la fecha de corte del conocimiento (el modelo no sabe lo que ocurrió después del entrenamiento) y el problema de las alucinaciones (el modelo inventa respuestas cuando no está seguro).
Principios básicos de RAG
Un sistema RAG completo consta de dos pipelines:Pipeline de indexación fuera de línea(preprocesa documentos y los almacena en una base de vectores) yPipeline de consulta en línea(recibe la pregunta del usuario, recupera y genera).
En la fase fuera de línea, los documentos originales se dividen en fragmentos pequeños, se convierten en vectores mediante un modelo de Embedding y se almacenan en la base de datos vectorial.
En la fase en línea, la pregunta del usuario también se convierte en vector, se encuentran los fragmentos de documento más similares en la base de datos, se concatenan como contexto y se entregan al LLM para generar la respuesta.
La siguiente figura muestra el flujo de solicitud completo de RAG:
Preprocesamiento de datos y segmentación de documentos (Chunking)
Desafío previo: análisis de documentos complejos
Antes de realizar la segmentación, RAG a menudo se enfrenta al desafío delanálisis de formatoEspecialmente en tablas, imágenes y diseños de varias columnas en PDF, Word o escaneos, la extracción de texto ordinaria puede causar fácilmente confusión semántica.
Actualmente, la solución principal en la industria es introducirmotores de análisis de documentos(como LlamaParse, Unstructured) o modelos multimodales grandes, para convertir imágenes y texto complejos en Markdown estructurado, sentando las bases para una segmentación de alta calidad posterior.
Estrategias de segmentación de documentos
La segmentación de documentos es la base del rendimiento de RAG; la granularidad de la segmentación afecta directamente la calidad de la recuperación. Fragmentos demasiado grandes introducen ruido, y fragmentos demasiado pequeños pierden contexto. Las estrategias comunes son las siguientes:
| Estrategia de segmentación | Escenario aplicable | Ventajas | Desventajas |
|---|---|---|---|
| Segmentación de tamaño fijo | Texto general | Implementación simple y rápida | Puede cortar oraciones semánticamente completas |
| Segmentación recursiva por caracteres | Texto estructurado (Markdown, código) | Prioriza la segmentación por límites semánticos como párrafos y oraciones | Implementación ligeramente compleja; se debe definir una lista razonable de separadores |
| Segmentación semántica (Semantic) | Documentos largos, libros | Utiliza Embedding para calcular la similitud entre oraciones adyacentes y encuentra automáticamente puntos de transición semántica para segmentar | Alto costo computacional y preprocesamiento lento |
| Recuperación de documentos padre-hijo (Small-to-Big) |
Escenario de cobertura integral | Utiliza "fragmentos pequeños" para una recuperación vectorial de alta precisión; tras la coincidencia, devuelve el "fragmento grande" correspondiente (documento padre) al LLM, equilibrando la precisión de la recuperación y la integridad del contexto. | El costo de diseño y mantenimiento de la base de datos se duplica |
En la práctica, a menudo se agregasuperposición (overlap), es decir, los fragmentos adyacentes comparten algunos caracteres para evitar que información importante se trunque en los límites. Configuración típica: tamaño de fragmento de 512 tokens, superposición de 50 a 100 tokens.
Ejemplo: Segmentación recursiva con LangChain
splitter = RecursiveCharacterTextSplitter(
chunk_size=512, # Número máximo de tokens por fragmento
chunk_overlap=50, # Número de tokens de superposición entre fragmentos adyacentes, para evitar pérdida de información en los límites
separators=["\n\n", "\n", "。", ".", " ", ""] # Priorizar la segmentación por párrafos y oraciones
)
chunks = splitter.split_text(document_text)
print(f"Segmentado en {len(chunks)} fragmentos de documento")
Recuperación vectorial
Modelo de Embedding
El modelo de Embedding se encarga de convertir texto en vectores densos (generalmente arreglos de números flotantes de 768 o 1536 dimensiones). Los textos semánticamente similares están más cerca en el espacio vectorial, y esto es la base matemática de la recuperación por similitud.
Comparación de modelos de Embedding comunes:
| Modelo | Dimensión | Idiomas aplicables | Características |
|---|---|---|---|
text-embedding-3-small(OpenAI) |
1536 | Multilingüe | Alta relación calidad-precio, adecuado para indexación a gran escala |
text-embedding-3-large(OpenAI) |
3072 | Multilingüe | Mayor precisión, costo más alto |
BAAI/bge-m3 |
1024 | Chino e inglés | Código abierto, excelente rendimiento en chino, soporta múltiples idiomas |
sentence-transformers/all-MiniLM-L6-v2 |
384 | Inglés | Tamaño pequeño, rápido, adecuado para implementaciones locales muy ligeras |
Cálculo de similitud y algoritmos ANN
El núcleo de la recuperación es medir la distancia. La más utilizada es lasimilitud coseno (Cosine Similarity), que calcula el coseno del ángulo entre dos vectores, con un rango de [-1, 1]; cuanto más cercano a 1, más similares. También están el producto punto (Dot Product) y la distancia euclidiana (L2 Distance).
Para lograr una recuperación en milisegundos entre millones de vectores, las bases de datos suelen utilizaralgoritmos de vecino más cercano aproximado (ANN),(comoHNSW, IVF). HNSW es actualmente el algoritmo más popular; construye una red de grafos de salto multicapa y sacrifica muy poca precisión a cambio de una mejora de velocidad de búsqueda de órdenes de magnitud.
RAG Avanzado (Arquitectura avanzada)
La arquitectura básica (Naive RAG) a menudo enfrenta problemas como recuperación imprecisa y "inundación de contexto" debido al exceso de información redundante. Advanced RAG resuelve esto mediante unaoptimización previa a la recuperación → fusión de recuperación → optimización posterior a la recuperaciónarquitectura de tres etapas.
1. Pre-recuperación: Optimización de consultas
Las preguntas originales de los usuarios suelen ser poco precisas:
- Reescritura de consultas (Query Rewriting): usar el LLM para reescribir preguntas coloquiales en términos de búsqueda normalizados.
- HyDE(Hypothetical Document Embedding): hacer que el LLM primero "adivine" a ciegas una respuesta hipotética; dado que la respuesta generada suele contener más terminología de la industria que la pregunta original, usar el vector de esa respuesta hipotética para recuperar a menudo puede recuperar documentos de mayor calidad.
2. Búsqueda híbrida (Hybrid Search)
va aRecuperación vectorial(comprende la semántica, alta tolerancia a errores) yrecuperación por palabras clave(BM25, alta coincidencia) se fusionan por pesos. Esto es especialmente importante cuando se encuentran nombres propios, modelos de productos o fragmentos de código, porque la recuperación vectorial tradicional tiende a fallar con nombres propios específicos.
3. Optimización post-recuperación: Reordenamiento (Reranking)
Este es un diseño de dos etapas declasificación gruesa → clasificación fina. Aunque la recuperación vectorial es rápida, su puntuación no es lo suficientemente precisa. El reordenamiento (Reranking) introduce unmodelo Cross-Encoder.(Como `bge-reranker`), se ingresan la "pregunta" y el "documento" como un par al modelo para realizar una puntuación conjunta mediante razonamiento. Su carga computacional es alta y solo se encarga de refinar la selección del Top-20 al Top-5.
Ejemplo: Pseudocódigo del proceso de reordenamiento
reranker = CrossEncoder("BAAI/bge-reranker-v2-m3")
# 1. Clasificación inicial: recuperación ultrarrápida del Top-50 mediante búsqueda vectorial
candidates = vector_store.similarity_search(query, k=50)
# 2. Clasificación fina: construir pares [pregunta, documento] para una puntuación precisa
pairs = [[query, doc.page_content] for doc in candidates]
scores = reranker.predict(pairs)
# 3. Filtrar el Top-5 final que se pasará al LLM
ranked_docs = sorted(zip(scores, candidates), reverse=True)
final_docs = [doc for _, doc in ranked_docs[:5]]
4. Self-RAG y CRAG (RAG correctivo)
Se incorpora un mecanismo de autorreflexión. Por ejemplo, CRAG (Corrective RAG), tras obtener los resultados de la recuperación, hace que el LLM actúe primero como "juez" para puntuar. Si la base de conocimiento local no contiene el documento o su calidad es extremadamente baja, el sistema activa automáticamente la búsqueda web (Web Search), como la API de Google, como complemento, lo que reduce significativamente las alucinaciones.
GraphRAG: Fusión de grafo de conocimiento + recuperación
El RAG tradicional trata la base de conocimiento como fragmentos de texto independientes y no puede responder a preguntas como "encontrar todas las empresas que fueron fundadas por el actual CEO y que tienen una capitalización de mercado superior a los cien mil millones", que requierenrazonamiento multi-salto entre documentos. Son problemas complejos.GraphRAGSe introduce el grafo de conocimiento (Knowledge Graph), modelando explícitamente entidades y relaciones.
Pasos principales de GraphRAG
- Construcción de conocimiento: en la fase offline, se utiliza el LLM para extraer tripletas (sujeto, relación, objeto) de los documentos y escribirlas en bases de datos de grafos como Neo4j.
- Búsqueda de doble vía: para las entidades mencionadas en la pregunta, no solo se realiza la búsqueda vectorial tradicional, sino que también se activa la travesía del grafo (Graph Traversal) para extraer cadenas de relaciones multi-salto.
- Generación mediante fusión de grafo y texto: los "fragmentos" recuperados por la búsqueda vectorial y las "estructuras de ruta" recuperadas por la búsqueda en el grafo se ensamblan en el Prompt, lo que permite que el LLM tenga tanto una visión global como el dominio de los detalles concretos.
Referencia de contenido de GraphRAG:https://www.example.com/ai-agent/graphrag-usage.html
Recomendaciones de selección de tecnologías y bases de datos
| Selección de bases de datos / herramientas | Tipo | Escenarios de implementación recomendados |
|---|---|---|
| Pinecone / Zilliz Cloud | Servicio en la nube totalmente gestionado | Listo para usar, sin necesidad de mantener infraestructura. Junto con Cohere Rerank + GPT-4o, es la solución más rápida de llevar a producción comercial. |
| Qdrant | Código abierto + autohospedado | Escrito en Rust, con excelente gestión de memoria y muy alto rendimiento. Adecuado para el despliegue privado a nivel empresarial. |
| Weaviate / Elasticsearch | Código abierto + autohospedado | Incluye una búsqueda híbrida (Hybrid Search) de BM25 + vectorial extremadamente madura; es la opción preferida en escenarios con gran cantidad de terminología especializada. |
| Milvus | Código abierto distribuido | Adecuado para plataformas de recuperación empresarial de ultra gran escala, del orden de mil millones a diez mil millones. |
| Chroma / FAISS | Base de datos local / embebida | Extremadamente ligera, no requiere desplegar un servicio independiente. Muy adecuada para el desarrollo local y la validación de proyectos de bases de conocimiento personales. |
Métricas de evaluación de RAG (marco RAGAS)
La evaluación de los sistemas RAG no puede basarse únicamente en la intuición; la práctica habitual es utilizar el frameworkRAGASRAGAS, que realiza pruebas cuantitativas automatizadas desde las dos dimensiones de "recuperación" y "generación":
- Context Recall (tasa de recuperación de contexto): qué proporción de la información de la respuesta estándar puede recuperarse.
- Context Precision (precisión de recuperación de contexto): qué proporción de los documentos recuperados es realmente relevante.
- Faithfulness (fidelidad / métrica de alucinaciones): si las respuestas generadas están respaldadas por los documentos recuperados.
- Answer Relevance (relevancia de la respuesta): si la respuesta generada responde realmente a la pregunta del usuario, evitando respuestas que no vienen al caso.