Advanced RAG: LongRAG, Self-RAG y GraphRAG Explicados
LongRAG, Self-RAG, GraphRAG - Técnicas de próxima generación
Generación Aumentada por Recuperación (RAG) ha evolucionado mucho más allá de la búsqueda simple de similitud de vectores. LongRAG, Self-RAG y GraphRAG representan el estado del arte de estas capacidades.
Los sistemas RAG modernos deben manejar documentos masivos, comprender relaciones complejas de entidades y mucho más.
Esta imagen agradable fue generada por modelo AI Flux 1 dev.
La Evolución Más Allá del RAG Básico
Los sistemas RAG tradicionales siguen un patrón simple: dividir documentos, incrustarlos en vectores, recuperar fragmentos similares mediante similitud del coseno y alimentarlos a un LLM. Aunque efectivo para muchos casos de uso, este enfoque tiene dificultades con tres escenarios críticos:
- Dependencias de largo alcance: El contexto importante podría abarcar miles de tokens a través de múltiples fragmentos
- Confianza en la recuperación: El sistema no tiene forma de evaluar si el contenido recuperado es realmente relevante
- Complejidad de relaciones: La similitud de vectores no puede capturar conexiones intricadas entre entidades
Las variantes avanzadas de RAG abordan estas limitaciones con arquitecturas especializadas adaptadas a desafíos específicos.
LongRAG: Conquistando el Contexto Extendido
Visión General de la Arquitectura
LongRAG reinterpreta fundamentalmente la estrategia de fragmentación al aprovechar LLM con ventanas de contexto extendidas (32K, 100K o incluso 1M tokens). En lugar de dividir documentos en pequeños fragmentos de 512 tokens, LongRAG utiliza un enfoque jerárquico:
Incrustración a Nivel de Documento: El documento completo (o secciones muy grandes) se procesa como una sola unidad. Una incrustación a nivel de documento captura el significado semántico general, manteniendo el texto completo para el procesamiento posterior.
Fragmentación Mínima: Cuando es necesario fragmentar, LongRAG utiliza fragmentos mucho más grandes (4K-8K tokens) con un gran solapamiento (20-30%). Esto preserva el flujo narrativo y reduce la fragmentación del contexto.
Asamblea de Contexto: Durante la recuperación, LongRAG devuelve documentos completos o secciones coherentes grandes en lugar de fragmentos dispersos. El LLM recibe un contexto continuo que preserva las relaciones estructurales y semánticas.
Estrategia de Implementación
Aquí hay una implementación conceptual usando Python y modelos de incrustación modernos:
from typing import List, Dict
import numpy as np
class LongRAGRetriever:
def __init__(self, model, chunk_size=8000, overlap=1600):
self.model = model
self.chunk_size = chunk_size
self.overlap = overlap
self.doc_embeddings = []
self.documents = []
def create_long_chunks(self, text: str) -> List[str]:
"""Crear fragmentos grandes con solapamiento"""
chunks = []
start = 0
while start < len(text):
end = start + self.chunk_size
chunk = text[start:end]
chunks.append(chunk)
start += (self.chunk_size - self.overlap)
return chunks
def index_document(self, doc: str, metadata: Dict):
"""Indexar documento con incrustación jerárquica"""
# Incrustar todo el documento
doc_embedding = self.model.embed(doc)
# Crear fragmentos grandes con solapamiento
chunks = self.create_long_chunks(doc)
chunk_embeddings = [self.model.embed(c) for c in chunks]
self.doc_embeddings.append({
'doc_id': len(self.documents),
'doc_embedding': doc_embedding,
'chunk_embeddings': chunk_embeddings,
'chunks': chunks,
'full_text': doc,
'metadata': metadata
})
self.documents.append(doc)
def retrieve(self, query: str, top_k: int = 3) -> List[Dict]:
"""Recuperar contenido de larga forma relevante"""
query_embedding = self.model.embed(query)
# Puntuar primero a nivel de documento
doc_scores = [
np.dot(query_embedding, doc['doc_embedding'])
for doc in self.doc_embeddings
]
# Obtener los mejores documentos
top_doc_indices = np.argsort(doc_scores)[-top_k:][::-1]
results = []
for idx in top_doc_indices:
doc_data = self.doc_embeddings[idx]
# Para cada documento, encontrar el mejor fragmento
chunk_scores = [
np.dot(query_embedding, emb)
for emb in doc_data['chunk_embeddings']
]
best_chunk_idx = np.argmax(chunk_scores)
# Devolver contexto extendido alrededor del mejor fragmento
context_chunks = self._get_extended_context(
doc_data['chunks'],
best_chunk_idx
)
results.append({
'text': ''.join(context_chunks),
'score': doc_scores[idx],
'metadata': doc_data['metadata']
})
return results
def _get_extended_context(self, chunks: List[str],
center_idx: int) -> List[str]:
"""Obtener contexto extendido alrededor del fragmento relevante"""
start = max(0, center_idx - 1)
end = min(len(chunks), center_idx + 2)
return chunks[start:end]
Casos de Uso y Rendimiento
LongRAG destaca en escenarios donde el contexto importa:
- Análisis de documentos legales: Contratos y memorandos legales suelen tener dependencias que abarcan docenas de páginas
- Recuperación de artículos de investigación: Entender la metodología requiere secciones coherentes, no párrafos aislados
- Repositorios de código: Funciones y clases deben entenderse dentro de su contexto de módulo
Características de rendimiento:
- Latencia: Mayor debido al procesamiento de fragmentos grandes (2-5 veces más lento que el RAG estándar)
- Precisión: Mejora del 15-25% en benchmarks de QA de larga forma
- Memoria: Requiere 3-4 veces más memoria para ventanas de contexto
Self-RAG: Recuperación Reflexiva
Principios Fundamentales
Self-RAG introduce una capa metacognitiva a los sistemas RAG. En lugar de recuperar y generar de forma ciega, el sistema reflexiona activamente sobre sus propios procesos a través de tokens de reflexión especiales:
Token de Recuperación: Decide si es necesario recuperar para una consulta dada Token de Relevancia: Evalúa si los documentos recuperados son realmente relevantes Token de Apoyo: Verifica si la respuesta generada está respaldada por el contenido recuperado Token de Crítica: Evalúa la calidad general de la respuesta generada
Componentes de la Arquitectura
La arquitectura de Self-RAG consta de tres fases intercaladas:
class SelfRAGSystem:
def __init__(self, retriever, generator, critic):
self.retriever = retriever
self.generator = generator
self.critic = critic
def generate_with_reflection(self, query: str,
max_iterations: int = 3):
"""Generar respuesta con autorreflexión"""
# Fase 1: Decidir si se necesita recuperación
retrieve_decision = self.critic.should_retrieve(query)
if not retrieve_decision:
# Generación directa sin recuperación
return self.generator.generate(query)
# Fase 2: Recuperar y evaluar relevancia
retrieved_docs = self.retriever.retrieve(query)
relevant_docs = []
for doc in retrieved_docs:
relevance_score = self.critic.assess_relevance(
query, doc
)
if relevance_score > 0.7: # Umbral
relevant_docs.append(doc)
if not relevant_docs:
# Retroceso a la generación sin recuperación
return self.generator.generate(query)
# Fase 3: Generar y verificar apoyo
best_answer = None
best_score = -1
for _ in range(max_iterations):
# Generar respuesta candidata
answer = self.generator.generate(
query, context=relevant_docs
)
# Evaluar apoyo y calidad
support_score = self.critic.check_support(
answer, relevant_docs
)
quality_score = self.critic.assess_quality(answer)
total_score = 0.6 * support_score + 0.4 * quality_score
if total_score > best_score:
best_score = total_score
best_answer = answer
# Parada temprana si se alcanza una alta calidad
if total_score > 0.9:
break
return {
'answer': best_answer,
'confidence': best_score,
'sources': relevant_docs,
'reflections': {
'retrieved': retrieve_decision,
'relevance': len(relevant_docs),
'support': support_score
}
}
Entrenamiento de los Mecanismos de Reflexión
Self-RAG requiere entrenar el componente crítico para hacer evaluaciones confiables. Esto generalmente implica:
- Afinamiento supervisado en conjuntos de datos anotados con juicios de relevancia
- Aprendizaje por refuerzo con recompensas por predicciones precisas
- Aprendizaje contrastivo para distinguir afirmaciones respaldadas de las no respaldadas
Los tokens de reflexión pueden implementarse como:
- Tokens especiales en el vocabulario (como
[RECUPERAR],[RELEVANTE]) - Encabezados separados en el modelo
- Modelos críticos externos (enfoque de conjunto)
Consideraciones de Producción
Cuando se implementa Self-RAG en sistemas de producción:
Compromisos de Latencia: Cada paso de reflexión agrega un 20-40% de sobrecarga de inferencia. Equilibrar la profundidad con los requisitos de tiempo de respuesta.
Umbral de Confianza: Ajustar los umbrales de reflexión según su caso de uso. Las aplicaciones legales o médicas necesitan mayor confianza que los chatbots generales.
Monitoreo: Rastrear las decisiones de reflexión para identificar patrones. Si rara vez se necesita recuperación, podría beneficiarse de una arquitectura más simple.
GraphRAG: Recuperación con Mejora de Grafos de Conocimiento
Fundamento Conceptual
GraphRAG transforma el problema de recuperación desde la similitud de vectores hasta el recorrido de grafos. En lugar de encontrar fragmentos de texto semánticamente similares, GraphRAG identifica subgrafos relevantes de entidades y relaciones conectadas.
Extracción de Entidades: Identificar entidades con nombre, conceptos y sus tipos Mapeo de Relaciones: Extraer relaciones entre entidades (temporales, causales, jerárquicas) Construcción de Grafos: Construir un grafo de conocimiento con entidades como nodos y relaciones como aristas Recuperación de Subgrafos: Dada una consulta, encontrar subgrafos conectados relevantes
Pipeline de Construcción de Grafos
Construir un grafo de conocimiento a partir de texto no estructurado implica varias etapas:
class GraphRAGBuilder:
def __init__(self, entity_extractor, relation_extractor):
self.entity_extractor = entity_extractor
self.relation_extractor = relation_extractor
self.graph = NetworkGraph()
def build_graph(self, documents: List[str]):
"""Construir grafo de conocimiento a partir de documentos"""
for doc in documents:
# Extraer entidades
entities = self.entity_extractor.extract(doc)
# Añadir entidades como nodos
for entity in entities:
self.graph.add_node(
entity['text'],
entity_type=entity['type'],
context=entity['surrounding_text']
)
# Extraer relaciones
relations = self.relation_extractor.extract(
doc, entities
)
# Añadir relaciones como aristas
for rel in relations:
self.graph.add_edge(
rel['source'],
rel['target'],
relation_type=rel['type'],
confidence=rel['score'],
evidence=rel['text_span']
)
def enrich_graph(self):
"""Añadir relaciones derivadas y metadatos"""
# Calcular importancia de nodos (PageRank, etc.)
self.graph.compute_centrality()
# Identificar comunidades/clústeres
self.graph.detect_communities()
# Añadir orden temporal si están disponibles marcas de tiempo
self.graph.add_temporal_edges()
Procesamiento de Consultas con Grafos
Las consultas GraphRAG implican razonamiento de múltiples saltos a través del grafo de conocimiento:
class GraphRAGRetriever:
def __init__(self, graph, embedder):
self.graph = graph
self.embedder = embedder
def retrieve_subgraph(self, query: str,
max_hops: int = 2,
max_nodes: int = 50):
"""Recuperar subgrafo relevante para consulta"""
# Identificar entidades de semilla en consulta
query_entities = self.entity_extractor.extract(query)
# Encontrar nodos coincidentes en grafo
seed_nodes = []
for entity in query_entities:
matches = self.graph.find_similar_nodes(
entity['text'],
similarity_threshold=0.85
)
seed_nodes.extend(matches)
# Expandir subgrafo mediante recorrido
subgraph = self.graph.create_subgraph()
visited = set()
for seed in seed_nodes:
self._expand_from_node(
seed,
subgraph,
visited,
current_hop=0,
max_hops=max_hops
)
# Clasificar nodos por relevancia
ranked_nodes = self._rank_subgraph_nodes(
subgraph, query
)
# Extraer y formatear contexto
context = self._format_graph_context(
ranked_nodes[:max_nodes],
subgraph
)
return context
def _expand_from_node(self, node, subgraph, visited,
current_hop, max_hops):
"""Expandir recursivamente el subgrafo"""
if current_hop >= max_hops or node in visited:
return
visited.add(node)
subgraph.add_node(node)
# Obtener vecinos
neighbors = self.graph.get_neighbors(node)
for neighbor, edge_data in neighbors:
# Añadir arista al subgrafo
subgraph.add_edge(node, neighbor, edge_data)
# Expandir recursivamente
self._expand_from_node(
neighbor,
subgraph,
visited,
current_hop + 1,
max_hops
)
def _format_graph_context(self, nodes, subgraph):
"""Convertir subgrafo en contexto textual"""
context_parts = []
for node in nodes:
# Añadir contexto del nodo
context_parts.append(f"Entidad: {node.text}")
context_parts.append(f"Tipo: {node.entity_type}")
# Añadir información de relación
edges = subgraph.get_edges(node)
for edge in edges:
context_parts.append(
f"- {edge.relation_type} -> {edge.target.text}"
)
return "\n".join(context_parts)
Implementación de GraphRAG de Microsoft
La implementación de GraphRAG de Microsoft toma un enfoque único al generar resúmenes de comunidades:
- Construir grafo inicial desde documentos usando extracción de entidades/relaciones basada en LLM
- Detectar comunidades usando el algoritmo Leiden o similar
- Generar resúmenes para cada comunidad usando LLMs
- Estructura jerárquica: Construir múltiples niveles de abstracción de comunidades
- Durante la consulta: Recuperar comunidades relevantes y recorrer a entidades específicas
Este enfoque es especialmente efectivo para:
- Consultas exploratorias ("¿Cuáles son los temas principales en este corpus?")
- Razonamiento de múltiples saltos ("¿Cómo está A conectado a C a través de B?")
- Análisis temporal ("¿Cómo evolucionaron las relaciones de esta entidad?")
Análisis Comparativo
Cuándo Usar Cada Variante
Usar LongRAG cuando:
- Los documentos tienen coherencia interna fuerte
- Las ventanas de contexto de su LLM admiten entradas grandes (32K+)
- Las respuestas a las consultas requieren comprender dependencias de largo alcance
- Está trabajando con documentos estructurados (informes, artículos, libros)
Usar Self-RAG cuando:
- La precisión y la confiabilidad son críticas
- Se necesita decisiones de recuperación explicables
- Los falsos positivos de recuperación irrelevante son costosos
- La complejidad de las consultas varía ampliamente (algunas necesitan recuperación, otras no)
Usar GraphRAG cuando:
- Su dominio tiene relaciones ricas de entidades
- Las consultas implican razonamiento de múltiples saltos
- Las relaciones temporales o jerárquicas importan
- Se necesita entender conexiones entre entidades
Comparación de Métricas de Rendimiento
| Métrica | RAG Estándar | LongRAG | Self-RAG | GraphRAG |
|---|---|---|---|---|
| Tiempo de Indexación | 1x | 0.8x | 1.1x | 3-5x |
| Latencia de Consulta | 1x | 2-3x | 1.4x | 1.5-2x |
| Uso de Memoria | 1x | 3-4x | 1.2x | 2-3x |
| Precisión (QA) | línea base | +15-25% | +20-30% | +25-40%* |
| Interpretabilidad | Baja | Media | Alta | Alta |
*Las mejoras de GraphRAG dependen fuertemente del dominio
Enfoques Híbridos
Los sistemas de producción más poderosos suelen combinar múltiples técnicas:
LongRAG + GraphRAG: Usar la estructura de grafo para identificar clusters de documentos relevantes, luego recuperar documentos completos en lugar de fragmentos
Self-RAG + GraphRAG: Aplicar mecanismos de reflexión a decisiones de recorrido de grafo (cuáles caminos seguir, cuándo detener la expansión)
Pipeline de tres etapas: Usar GraphRAG para recuperación inicial basada en entidades → Self-RAG para filtrado de relevancia → LongRAG para ensamblaje de contexto
Consideraciones de Implementación
Modelos de Incrustación
Diferentes variantes de RAG tienen diferentes requisitos de incrustación:
LongRAG: Necesita incrustaciones que funcionen bien a nivel de documento y fragmento. Considere modelos entrenados con aprendizaje contrastivo en secuencias largas.
Self-RAG: Beneficia de incrustaciones que capturen matices semánticos para evaluaciones de relevancia finas.
GraphRAG: Requiere incrustaciones conscientes de entidades. Modelos afinados en tareas de vinculación de entidades funcionan mejor.
La elección del modelo de incrustación impacta significativamente el rendimiento. Cuando se trabaja con modelos locales, herramientas como Ollama ofrecen una forma sencilla de experimentar con diferentes modelos de incrustación antes de comprometerse a una implementación de producción.
Estrategias de Fragmentación Revisadas
La fragmentación tradicional de tamaño fijo es insuficiente para RAG avanzado:
Fragmentación semántica: Romper en límites naturales (párrafos, secciones, cambios de tema) Fragmentación recursiva: Crear fragmentos jerárquicos con relaciones padre-hijo Ventana deslizante: Usar fragmentos superpuestos para preservar contexto en los límites Consciente de estructura: Respetar la estructura del documento (encabezados de markdown, etiquetas XML, bloques de código)
Para implementaciones en Python, bibliotecas como LangChain y LlamaIndex ofrecen soporte integrado para estas estrategias de fragmentación.
Integración de Reclasificación
La reclasificación mejora significativamente la calidad de recuperación en todas las variantes de RAG. Después de la recuperación inicial, un modelo especializado de reclasificación revalora los resultados basándose en características de interacción consulta-documento. Esto proporciona un gran aumento de precisión (10-20%) con un impacto mínimo en la latencia cuando se integra pensado cuidadosamente.
Escalado a Producción
Pipeline de indexación:
- Usar procesamiento distribuido (Ray, Dask) para grandes corpora de documentos
- Implementar indexación incremental para actualizaciones en tiempo real
- Almacenar incrustaciones en bases de datos vectoriales optimizadas (Pinecone, Weaviate, Qdrant)
Optimización de consultas:
- Cachear consultas frecuentes y sus resultados
- Implementar enrutamiento de consultas (diferentes variantes de RAG para diferentes tipos de consulta)
- Usar búsqueda de vecinos más cercanos aproximada para escalado sublineal
Monitoreo:
- Rastrear puntajes de relevancia de recuperación
- Monitorear decisiones de reflexión en Self-RAG
- Medir caminos y profundidades de recorrido de grafos
- Registrar puntajes de confianza y retroalimentación del usuario
Aplicaciones del Mundo Real
Búsqueda en Documentación Técnica
Un proveedor principal de nube implementó GraphRAG para su documentación:
- Entidades: puntos finales de API, parámetros, códigos de error, nombres de servicios
- Relaciones: dependencias, compatibilidades de versión, rutas de migración
- Resultado: reducción del 35% en tickets de soporte, tiempo de resolución 45% más rápido
Descubrimiento Legal
Una empresa de tecnología legal combinó Self-RAG con LongRAG:
- Self-RAG filtra documentos irrelevantes temprano
- LongRAG preserva el contexto en documentos conservados
- Los abogados revisan un 60% menos de falsos positivos
- La preservación de contexto crítica mejoró del 71% al 94%
Revisión de Literatura Académica
Motor de búsqueda académico usando enfoque híbrido:
- GraphRAG identifica redes de citas y comunidades de investigación
- LongRAG recupera secciones completas manteniendo el contexto de metodología
- Mejora del 40% en descubrimiento de artículos relevantes
- Reducción del tiempo de revisión de literatura de semanas a días
Temas Avanzados
RAG Multimodal
Extender estas variantes para manejar imágenes, tablas y código:
- Anclaje visual: Vincular entidades de texto a imágenes en documentos
- Comprensión de tablas: Parsear datos estructurados en formato de grafo
- Análisis de código: Construir gráficos de dependencia desde bases de código
RAG Adaptativo
Selección dinámica de estrategia de RAG según características de la consulta:
- Clasificador de complejidad de consulta
- Detectores de tipo de documento
- Optimizador de costo-beneficio para selección de estrategia
RAG con Preservación de Privacidad
Implementar estas variantes con restricciones de privacidad:
- Recuperación federada a través de silos de datos
- Privacidad diferencial en incrustaciones
- Búsqueda de similitud encriptada
Comenzando
Inicio rápido con Python
Para aquellos que buscan implementar estas técnicas, comenzar con una base sólida en Python es esencial. La rica ecosistema de Python para el aprendizaje automático lo convierte en la elección natural para el desarrollo de RAG.
Aquí tienes un punto de partida simple para experimentar:
# Instalar dependencias
# pip install sentence-transformers faiss-cpu langchain
from sentence_transformers import SentenceTransformer
import faiss
import numpy as np
# Configuración básica para experimentar con fragmentos largos
model = SentenceTransformer('all-MiniLM-L6-v2')
documents = [
# Tus documentos de larga extensión aquí
]
# Crear embeddings
embeddings = model.encode(documents)
# Construir índice FAISS
dimension = embeddings.shape[1]
index = faiss.IndexFlatL2(dimension)
index.add(embeddings.astype('float32'))
# Consulta
query = "Tu pregunta aquí"
query_embedding = model.encode([query])
distances, indices = index.search(
query_embedding.astype('float32'), k=3
)
Selección de marcos
LangChain: Ideal para prototipado rápido, con integraciones extensas
LlamaIndex: Optimizado para el indexado y recuperación de documentos
Haystack: Listo para producción, con fuertes abstracciones de pipelines
Personalizado: Cuando necesitas control total y optimización
Marco de evaluación
Implementa una evaluación rigurosa antes del despliegue en producción:
Métricas de recuperación:
- Precisión@K, Recall@K, MRR (Mean Reciprocal Rank)
- NDCG (Normalized Discounted Cumulative Gain)
Métricas de generación:
- ROUGE, BLEU para similitud de texto
- BERTScore para similitud semántica
- Evaluación humana para la valoración de calidad
Métricas de fin a fin:
- Tasa de éxito de tarea
- Puntuaciones de satisfacción del usuario
- Percentiles de latencia (p50, p95, p99)
Conclusión
El paisaje de los sistemas RAG ha madurado significativamente más allá de la búsqueda de similitud vectorial básica. LongRAG, Self-RAG y GraphRAG abordan cada uno limitaciones específicas de los enfoques tradicionales:
LongRAG resuelve el problema de fragmentación del contexto al adoptar ventanas de contexto extendidas y un mínimo de fragmentación. Es la opción ideal cuando la coherencia del documento importa y cuentas con los recursos computacionales para manejar contextos grandes.
Self-RAG agrega una conciencia crítica a los sistemas de recuperación. Al reflexionar sobre sus propias decisiones, reduce los falsos positivos e mejora la confiabilidad—esencial para aplicaciones de alto riesgo donde la precisión importa más que la velocidad.
GraphRAG desbloquea el poder de la representación estructurada del conocimiento. Cuando tu dominio implica relaciones complejas entre entidades, la recuperación basada en gráficos puede revelar conexiones que la similitud vectorial completamente ignora.
El futuro de RAG probablemente involucrará enfoques híbridos que combinen las fortalezas de estas variantes. Un sistema de producción podría usar GraphRAG para identificar clusters de entidades relevantes, Self-RAG para filtrar y validar recuperaciones, y LongRAG para ensamblar contexto coherente para el LLM.
A medida que los LLMs continúen mejorando y las ventanas de contexto se expandan, veremos aún más variantes avanzadas de RAG. La clave es entender tus requisitos específicos de caso de uso—estructura del documento, patrones de consulta, demandas de precisión y restricciones computacionales—y seleccionar la técnica o combinación adecuada.
El ecosistema de herramientas está madurando rápidamente, con marcos como LangChain, LlamaIndex y Haystack proporcionando un soporte cada vez más sofisticado para estos patrones avanzados. Combinado con poderosas implementaciones locales de LLM y modelos de embedding, nunca ha sido más fácil experimentar y desplegar sistemas RAG de producción.
Empieza con lo básico, mide el rendimiento rigurosamente y evoluciona tu arquitectura según lo requieran los requisitos. Las variantes avanzadas de RAG cubiertas aquí proporcionan un mapa de ruta para esa evolución.
Enlaces útiles
- Hoja de trucos de Python
- Reclasificación con modelos de embedding
- LLMs y salida estructurada: Ollama, Qwen3 y Python o Go
- Proveedores de LLM en la nube
- Comparación de LLMs: Qwen3:30b vs GPT-OSS:20b
Referencias externas
- Microsoft GraphRAG: Un sistema modular basado en gráficos para recuperación de generación aumentada
- Self-RAG: Aprender a recuperar, generar y criticar mediante la reflexión
- LongRAG: Mejorando la generación aumentada con LLMs de contexto largo
- Generación aumentada para modelos de lenguaje grandes: Una revisión
- FAISS: Una biblioteca para búsqueda de similitud eficiente
- Documentación de LangChain: Técnicas avanzadas de RAG
- HuggingFace: Transformers de oraciones para modelos de embedding
- Revisión de RAG: Análisis completo de generación aumentada con recuperación