Un agente de indexación
Un sistema de recuperación debe devolver la evidencia que requiere la pregunta. La estructura de los datos ayuda a elegir cómo buscarlos.
Un agente de indexación aplica la idea de flujo de trabajo a una fuente de conocimiento externo mediante un pipeline definido por el desarrollador. Primero genera embeddings e indexa información; después recupera fragmentos de información pertinentes (según la entrada recibida) que usa como contexto para producir una respuesta. El ejemplo muestra primero este proceso para texto no estructurado y luego presenta la recuperación como una herramienta que puede ser invocada por un bucle ReAct externo. Esta sección profundiza más tarde en diferentes formatos de datos.
- La generación sin recuperación responde con el contexto actual y el entrenamiento del modelo.
- El RAG tradicional ejecuta un paso fijo de recuperación antes de cada respuesta generada.
- La recuperación controlada por el agente expone la recuperación como herramienta, de modo que el bucle decide si necesita otra consulta.
¿Seguir la evolución de RAG desde el entrenamiento conjunto hasta la recuperación?
El origen de RAG: un sistema entrenado de extremo a extremo
Cuando Lewis y sus colegas dieron nombre a la generación aumentada por recuperación en 2020, entrenaron el recuperador y el generador conjuntamente para la tarea. Lee la figura de izquierda a derecha antes de observar la flecha de la parte superior.
La clave del diseño está en la flecha «Retropropagación de extremo a extremo por q y pθ». Una sola función de coste (loss) actualizaba ambas partes. El codificador de consultas aprendía qué fragmentos de información podía aprovechar el generador, y el generador aprendía a apoyarse en la evidencia recuperada en vez de depender solo de su memoria.
El recuperador nació como parte del modelo y se adaptaba a la tarea, mucho antes de que se describiera como una herramienta de búsqueda colocada delante de un modelo.
Uso de modelos preentrenados para RAG
Una API de inferencia no proporciona acceso para actualizar los pesos del modelo. Entrenar conjuntamente un recuperador y un generador autoalojados requiere los pesos del modelo, datos de entrenamiento y recursos de cómputo.
El flujo de trabajo de este ejemplo utiliza modelos preentrenados sin actualizar sus pesos. Un recuperador selecciona pasajes para incluirlos en el prompt de generación. Puedes modificar la recuperación e inspeccionar sus resultados sin entrenar el generador.
El pipeline de recuperación y generación que vas a construir
El recuperador trabaja antes del modelo congelado en dos momentos distintos. Primero se construye el índice; después se atienden las solicitudes consultándolo. La figura siguiente muestra ambas fases.
Offline: construye el índice una vez, genera los embeddings de cada fragmento de datos y los guarda para realizar búsquedas rápidas.
En vivo: genera el embedding de una pregunta, recupera los K mejores fragmentos de datos y se los entrega al modelo junto con la pregunta.
El resto de esta sección construye este recorrido por partes.
¿Elegir paquetes, límites y formas de datos?
Define el paquete de contexto antes de elegir el almacenamiento
Antes de elegir una primitiva de recuperación, define un paquete: el conjunto completo y acotado de contexto que circulará por el pipeline.
- Para un sistema sencillo de preguntas y respuestas de un solo turno, el paquete puede ser pequeño: la pregunta, unos pocos fragmentos recuperados y la respuesta.
- Para un agente autónomo, el paquete es la memoria de trabajo que conserva durante varios turnos: restricciones, decisiones anteriores, resultados parciales, herramientas disponibles y reglas operativas.
- Para un agente de indexación de alcance arbitrario, el paquete de salida puede contener solo los fragmentos recuperados, sus fuentes, puntuaciones de relevancia y quizá un resumen. Un paquete interno distinto puede representar el pipeline lineal de la solicitud o un bucle ReAct que evalúa la relevancia y reintenta hasta reunir suficiente contexto.
El principio del paquete de contexto orienta la planificación: define el paquete antes de elegir la base de datos. La tabla siguiente ayuda a comprobar si el mecanismo elegido puede proporcionar el contexto que necesita tu tarea.
Dónde encaja MCP en un sistema de recuperación
MCP le proporciona a un sistema de recuperación una interfaz definida para descubrir y consultar fuentes de contexto externas. Sin embargo, el agente todavía necesita un motor de ejecución que decida cuándo recuperar esa información, valide los resultados y los integre con el estado actual de la tarea en curso. Otras interfaces se encargan de los componentes restantes del sistema: los paquetes de habilidades (skills) agrupan instrucciones de capacidades reutilizables, el sistema A2A (Agent-to-Agent) puede derivar el trabajo a especialistas remotos, y los protocolos de interfaz de usuario transmiten en tiempo real (stream) el estado generado de vuelta a la aplicación.
La figura separa esas fronteras. Léela de izquierda a derecha para seguir la entrada de contexto mediante MCP y la entrega de tareas mediante A2A; de abajo arriba, para seguir la intermediación de capacidades mediante skills, la ejecución en el runtime y la experiencia generada. Elige la frontera que corresponda al paquete y al estado del sistema que debe transportar.
Asocia una primitiva de recuperación a la forma de los datos
La tabla enumera opciones de recuperación para distintas formas de datos. Elige a partir de preguntas representativas, la evidencia que necesita cada respuesta y el coste de recuperarla; evalúa si los resultados devueltos cubren esa evidencia.
| Forma | Ejemplos | Opción a considerar |
|---|---|---|
| Prosa no estructurada | Documentos, artículos, comentarios de código, transcripciones | Vector denso y reranking con cross-encoder |
| Documentos jerárquicos | Contratos legales, manuales técnicos, especificaciones anidadas | Índice de árbol con punteros al elemento padre |
| Tablas estructuradas o gobernadas | Registros de clientes, libros contables, tablas de recursos humanos | Capa semántica sobre la fuente de verdad |
| Datos relacionales o grafos | Organigramas, dependencias de código, grafos de conocimiento | Recorrido de grafos (Cypher, GraphQL o personalizado) |
El ejemplo de prosa no estructurada recupera pasajes de un corpus y pide al modelo que responda a partir de ellos. Comprueba si esos pasajes respaldan la respuesta.
Cada solicitud recorre los mismos cuatro pasos:
- Convertir la consulta en un vector mediante un embedding.
- Buscar en el índice los fragmentos más similares.
- Añadir esos fragmentos al prompt.
- Generar una respuesta con una instrucción para usar esos pasajes.
Otros recuperadores pueden usar búsquedas por palabras clave o consultas estructuradas. Elige el método de recuperación adecuado para tus datos y después inspecciona qué evidencia proporciona al generador.
Representar texto mediante embeddings para buscar por similitud
Este recuperador vectorial representa los fragmentos de texto y las consultas mediante embeddings. Un embedding es una representación numérica aprendida de un fragmento de texto: un vector de longitud fija situado de forma que los textos semánticamente similares queden próximos en el espacio vectorial. Esto tiene dos consecuencias prácticas:
Ambas operaciones usan el modelo de embeddings, al que este curso llama mediante helpers.embed.
Configura el endpoint de embeddings y la credencial que requiera en el panel del modelo.
El navegador envía el texto por la ruta seleccionada. Si el servicio de embeddings no está disponible,
inspecciona la solicitud y el error devuelto.
¿Revisar el contrato de solicitud de embeddings?
El endpoint acepta una solicitud JSON con tres campos y devuelve un array de vectores:
inputcontiene un conjunto (batch) de textos, con tipostring[].modelidentifica el modelo de embeddings, con tipostring.input_typees"query"o bien"passage".- La respuesta contiene un array
data; cada entrada del mismo incluye unembeddingde tiponumber[].
El modelo de embeddings de NVIDIA utiliza input_type para distinguir consultas de pasajes. Su entrenamiento para recuperación busca relacionar preguntas con pasajes que las responden. Intercambiar "query" y "passage" puede cambiar las puntuaciones y reducir la calidad de la recuperación sin provocar un error de API. Comprueba los tipos y evalúa los pasajes devueltos.
Un recuperador completo en treinta líneas de top-K por coseno
Una «base de datos vectorial» presenta una interfaz elaborada para una tarea sencilla: almacena cada pasaje junto a su embedding y devuelve los top-K más cercanos al embedding de la consulta según la similitud coseno. En el navegador, el núcleo cabe en treinta líneas de JavaScript.
La celda siguiente construye un agente de indexación sobre unos pocos documentos. Edita el corpus y la consulta; después observa qué pasajes llegan a las primeras posiciones y por qué.
Un índice vectorial almacena en caché las salidas de un modelo de embeddings. Los sistemas de producción deben protegerse contra varios fallos:
- Al cambiar el modelo, cada vector almacenado pierde su significado hasta que se vuelvan a generar los embeddings de todos los pasajes.
- Si el proveedor actualiza el modelo silenciosamente, las puntuaciones pueden cambiar sin error.
- Si dos servicios comparten un índice pero fijan identificadores de modelo distintos, uno recibirá resultados sin sentido.
Un índice fiable registra el identificador del modelo junto a cada vector y se niega a mezclar versiones. El modelo fijado en este curso es
nvidia/nemotron-3-embed-1b, servido por integrate.api.nvidia.com a través del proxy del curso.
¿Recuperar fragmentos pequeños con su contexto superior?
Buscar fragmentos pequeños y devolver el documento padre
Un agente de indexación top-K básico afronta una tensión entre recall y precisión que ningún modelo de embeddings elimina. Debes elegir entre fragmentos breves y documentos largos:
- Los fragmentos cortos centran el embedding en un pasaje más acotado, pero pueden omitir contexto necesario para responder la pregunta.
- Los documentos largos incluyen más contexto, pero representar varios temas en un solo embedding puede diluir la coincidencia con una pregunta específica.
Una opción consiste en indexar en dos niveles. Se generan embeddings de fragmentos pequeños para la recuperación; una coincidencia selecciona el documento padre para aportar más contexto a una etapa posterior de generación.
El ejercicio usa tres documentos padre, cada uno dividido en fragmentos breves, y una consulta que devuelve el documento padre correspondiente.
¿Dejar que el modelo decida cuándo recuperar información?
Presenta el índice como una herramienta que el modelo puede invocar
Un índice aislado solo responde cuando algo lo consulta. Se convierte en un agente de indexación cuando se presenta como una herramienta que el modelo puede elegir. Así, el modelo decide cuándo merece la pena recuperar datos. La celda lo hace en cinco etapas:
- El corpus se procesa una vez y se conserva en un índice en memoria.
- Se declara una herramienta
retrieve(question, k)mediante un esquema JSON. - El agente recibe la pregunta y decide si invoca la herramienta.
- Si la invoca, ejecuta la recuperación por coseno; los pasajes top-K se añaden como mensaje de herramienta.
- Una segunda llamada al LLM redacta la respuesta final a partir de los pasajes recuperados.
Puedes conservar la interfaz de la herramienta y sustituir la búsqueda por coseno en memoria por un ejecutor de servidor con FAISS+BM25+reranking. Valida sus resultados y su comportamiento ante fallos antes de incorporarlo al ciclo.
¿Comparar las demás formas de índice?
Cómo se construyen las otras tres formas
Ya has construido la vía de la prosa no estructurada desde el corpus hasta la respuesta. Las otras tres aparecen aquí para que puedas reconocerlas y elegir la primitiva adecuada. Cada una tiene un patrón de producción establecido:
- Documentos jerárquicos. Un segmentador conserva la jerarquía de títulos y combina extracción atómica de tablas, punteros al elemento padre y un índice doble para búsqueda estructural y semántica. Se indexan fragmentos hijos para mejorar el recall y se recupera el padre correspondiente para que el modelo lea la cláusula dentro de su sección.
- Recuperación de imágenes de página para figuras y gráficos. Una configuración con dos espacios vectoriales genera embeddings de la página renderizada y de su texto. Así, la consulta también puede recuperar una figura o diapositiva cuando la respuesta esté en el contenido visual.
- Tablas estructuradas y gobernadas. No se construyen en este curso. El patrón de producción sitúa una capa semántica entre el agente y los datos por fila, y expone solo las métricas seleccionadas que requiere el paquete.
- Datos relacionales o grafos. En lugar de un almacén vectorial, el agente invoca una herramienta de recorrido de grafos escrita en Cypher, GraphQL o una interfaz propia. Recibe un subgrafo cuyas aristas explícitas llegan al prompt y conservan las relaciones entre entidades.
¿Explorar la recuperación sobre todo el corpus con GraphRAG?
Cuando top-K es la herramienta equivocada: GraphRAG y preguntas globales
Cada recuperador de esta página responde a una pregunta local cuya respuesta aparece en unos pocos pasajes que top-K puede encontrar, como qué dice un contrato sobre la rescisión o qué artículo introdujo HyDE. Otra clase de pregunta no tiene respuesta en ningún pasaje aislado. Si preguntas por los temas principales de mil documentos, la respuesta emerge del corpus completo.
Con K fijado en 3, top-K devuelve tres coincidencias del ejemplo de mil pasajes. La generación recibe esos pasajes seleccionados, que pueden no cubrir temas presentes en otras partes del corpus. GraphRAG (Edge et al. 2024) cambia la forma del problema en lugar de aumentar K. Utiliza un LLM durante la indexación para:
- leer el corpus y extraer entidades y las relaciones entre ellas en un grafo de conocimiento;
- detectar las comunidades del grafo, es decir, grupos de entidades densamente conectadas;
- resumir cada comunidad por separado.
En el momento de la consulta, el sistema resume las comunidades pertinentes y reduce las respuestas parciales a una sola. Es un proceso map-reduce sobre la estructura, no una búsqueda por similitud.
La celda siguiente compara, en un corpus pequeño, la recuperación top-K con la fase de resúmenes de comunidades usada en GraphRAG. Los grupos son etiquetas definidas por el autor, no un grafo extraído por el modelo. La ruta de resúmenes recibe todos los grupos y sus nombres; top-K recibe solo los pasajes seleccionados. Comprueba qué afirmaciones respalda cada respuesta y después cambia K, los grupos o la pregunta.
Una selección top-K pequeña puede omitir evidencia necesaria para preguntas sobre todo el corpus. Los resúmenes de comunidades pueden ampliar la cobertura, pero también hay que evaluar sus agrupaciones y resúmenes. Este ejemplo los genera en cada ejecución; un sistema mayor puede crearlos y almacenarlos antes de recibir consultas.
Antes de continuar
- La similitud coseno puntúa dos vectores de la misma manera sin importar cuál sea la consulta. El modelo de NVIDIA usa
input_typepara distinguir consulta y pasaje. ¿Qué aporta esa asimetría? - El índice genera una vez los embeddings del corpus, mientras que la ruta en vivo procesa cada pregunta. ¿Qué cambios exigen reindexar el corpus y cuáles solo requieren un nuevo embedding de consulta?
- Top-K siempre devuelve K pasajes, aunque todas las puntuaciones sean débiles. ¿Qué señal debería examinar el agente antes de incorporarlos al prompt?
¿Rastrear las fuentes de investigación sobre recuperación?
Referencias
- Lewis et al., Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks (NeurIPS 2020). Artículo canónico sobre recuperación seguida de generación; la figura anterior se redibujó a partir de él.
- Karpukhin et al., Dense Passage Retrieval (EMNLP 2020). Formulación de doble codificador que sustenta la asimetría entre embeddings de consulta y pasaje.
- Johnson, Douze & Jégou, Billion-scale similarity search with GPUs (FAISS, 2017). Una biblioteca para buscar similitud entre vectores densos.
- Gao et al., HyDE: Precise Zero-Shot Dense Retrieval without Relevance Labels (2022). Genera una respuesta hipotética y obtiene su embedding para la recuperación.
- Lin et al., Pretrained Transformers for Text Ranking (2020). Patrón de reranking que un stack de recuperación usa como segunda etapa.
- Edge et al., From Local to Global: A Graph RAG Approach to Query-Focused Summarization (2024). Construye un grafo de conocimiento con un LLM y resume sus comunidades para responder preguntas globales sobre el corpus.
Lista completa en Para ir más lejos · Referencias.
Prueba · recuperación en vivo
Formula una pregunta. El artefacto usa el mismo endpoint de la página para generar su embedding y clasifica un corpus pequeño mediante similitud coseno. Las barras muestran todas las puntuaciones. Después, el modelo responde a partir de los pasajes mejor clasificados y los cita. Cambia la pregunta y observa cómo varía el orden.
El corpus se procesó offline y se distribuye junto a la página como índice preconstruido; solo la pregunta necesita un embedding en vivo. Así puedes observar la separación entre indexación y servicio. Las preguntas de ejemplo también incluyen vectores preconstruidos y recuperan resultados antes de añadir una clave; al editar un pasaje, solo se vuelve a procesar ese pasaje.