Advanced RAG: LongRAG, Self-RAG y GraphRAG Explicados

LongRAG, Self-RAG, GraphRAG - Técnicas de próxima generación

Índice

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.

a-pirate-captain 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:

  1. Dependencias de largo alcance: El contexto importante podría abarcar miles de tokens a través de múltiples fragmentos
  2. Confianza en la recuperación: El sistema no tiene forma de evaluar si el contenido recuperado es realmente relevante
  3. 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:

  1. Afinamiento supervisado en conjuntos de datos anotados con juicios de relevancia
  2. Aprendizaje por refuerzo con recompensas por predicciones precisas
  3. 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:

  1. Construir grafo inicial desde documentos usando extracción de entidades/relaciones basada en LLM
  2. Detectar comunidades usando el algoritmo Leiden o similar
  3. Generar resúmenes para cada comunidad usando LLMs
  4. Estructura jerárquica: Construir múltiples niveles de abstracción de comunidades
  5. 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

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

Referencias externas