Agentic RAG: Deje que el agente busque

La aplicación que construimos es una aplicación RAG.

La receta es simple: fragmentar, incrustar, recuperar y luego responder.

Parece limpio sobre el papel. Pero una vez que lo usas en casos reales, las cosas se complican muy rápidamente: la búsqueda de similitud encuentra palabras similares pero no necesariamente fragmentos útiles, la evidencia correcta nunca aparece en el contexto recuperado porque ocupa un lugar demasiado bajo, o el contexto importante puede dividirse entre los límites de los fragmentos.

Con un contexto insuficiente, el LLM tiene poco espacio para recuperarse.

Entonces, ¿qué tal si hacemos que la recuperación sea iterativa? ¿Qué pasa si el modelo puede buscar, leer, decidir si tiene evidencia suficiente y volver a buscar cuando sea necesario? Probablemente ni siquiera necesitemos las incrustaciones de vectores en primer lugar.

Esa es la premisa del RAG agente.

En esta publicación, crearemos un flujo de trabajo RAG mini agente con el SDK de agentes OpenAI. Examinaremos cómo el agente busca, lee y fundamenta iterativamente su respuesta.

Al final, daremos un paso atrás y discutiremos brevemente las consideraciones para construir una solución RAG agente práctica.

1. Estudio de caso: Respondiendo una pregunta de política con Agentic RAG

Para nuestro estudio de caso, crearemos un agente RAG de políticas sobre una colección de documentos de políticas de la empresa.

1.1 Conservación de la colección de documentos

Aquí, creé seis documentos sintéticos de políticas empresariales. Todos son archivos de rebajas. Cada uno tiene un título, una fecha de vigencia, un breve resumen y el texto de la política.

Para ser realistas, esos documentos cubren seis áreas de políticas comunes de la empresa:

aprobacion_matrix.md, que contiene niveles de aprobación para decisiones comunes sobre viajes de negocios, a partir del 1 de julio de 2025. Conference_guidelines.md, que contiene reglas para asistir a eventos externos, a partir del 15 de mayo de 2025. faq.md, que contiene respuestas informales a preguntas comunes sobre viajes, a partir del 1 de septiembre de 2025. Policy_updates_2026.md, que contiene actualizaciones sobre alojamiento, viajes de conferencias y calendario de aprobación para 2026, a partir de 2026 el 1 de enero de 2026. remote_work_policy.md, que contiene reglas para el trabajo remoto, vigente desde el 1 de febrero de 2026. travel_policy.md, que contiene reglas estándar de reserva de viajes para vuelos, alojamiento, comidas y transporte, vigente desde el 1 de marzo de 2025.

Hicimos intencionalmente que la respuesta a una pregunta de política no se encuentre en un solo documento. Esto nos permite ver el comportamiento agente deseado.

Puede encontrar los documentos sintéticos completos y el cuaderno de implementación de Agentic RAG aquí.

1.2 Definición del agente

A continuación, configuramos el agente. Para eso, utilizamos el SDK de agentes de OpenAI.

En un nivel alto, el agente es simplemente este:

# pip install openai-agents from agentes import Agente agente = Agente( nombre=”Asistente de investigación de políticas”, instrucciones=INSTRUCCIONES, modelo=”gpt-5.4″, herramientas=[list_docs, search_docs, read_doc])

Debemos analizar dos partes: las instrucciones del agente y las herramientas a las que tiene acceso.

Primero, la instrucción. Aquí es donde definimos el comportamiento de búsqueda deseado:

# Nota: Esta instrucción se repite con AI INSTRUCCIONES = “””
[Role]
Eres un cuidadoso asistente de investigación de políticas internas.

[Research behavior]
Responda preguntas sobre políticas de empleados utilizando las herramientas de documentos. Encuentre suficiente evidencia relevante para respaldar la respuesta. Mantener las conclusiones basadas en los documentos de política.

[Expected output]
Primero dé una respuesta directa. Luego explique brevemente la evidencia. Cite los nombres de archivos de los documentos utilizados para cada afirmación importante. “””.banda()

Para este caso de estudio, requerimos que el agente solo pueda acceder a los documentos a través de tres herramientas predefinidas:

La primera es una herramienta que le brinda al agente una descripción general rápida de los documentos que existen:

@function_tool def list_docs() -> lista[dict]: “””Enumera los documentos de políticas disponibles sin devolver el texto del cuerpo.””” return [
{
“doc_name”: doc[“doc_name”]”título”: documento[“title”]”efectivo”: doc.[“effective”]”resumen”: doc.[“summary”]} para doc en docs.values() ]

La segunda herramienta es una herramienta de búsqueda de palabras clave. Aquí lo mantenemos simple: cada documento se divide en fragmentos de párrafos y cada consulta se compara con esos fragmentos mediante superposición de tokens:

@function_tool def search_docs(consulta: str) -> lista[dict]: “””Buscar documentos de políticas y devolver los tres fragmentos breves principales.””” query_tokens = tokenize(consulta) puntuado = []

para fragmentos en fragmentos: puntuación = len(query_tokens & fragmento[“tokens”]) si puntuación: puntuación.append((puntuación, fragmento)) puntuación.sort(clave=lambda elemento: elemento[0]reverso=Verdadero) resultados = []
para puntuación, trozo en puntuado[:3]: fragmento = fragmento[“text”].replace(“\n”, ” “) si len(fragmento) > 420: fragmento = fragmento[:417].rstrip() + “…” resultados.append({ “doc_name”: fragmento[“doc_name”]”título”: fragmento[“title”]”sección”: fragmento[“section”]”snippet”: fragmento, “score”: round(score, 2), }) devuelve resultados

La última herramienta es la que permite al agente abrir un documento por nombre de archivo:

@function_tool def read_doc(doc_name: str) -> str: “””Leer un documento de política por nombre de archivo.””” si doc_name no está en docs: valid = “, “.join(sorted(docs)) return f”Documento desconocido: {doc_name}. Documentos válidos: {valid}” return docs[doc_name][“text”]

Ese es el agente RAG completo.

1.3 Ejecución de una pregunta de política

Ahora ponemos a prueba al agente con una pregunta concreta:

“Estoy asistiendo a una conferencia en Berlín. El organizador de la conferencia indica un hotel oficial, pero la tarifa por noche está por encima del límite de hotel normal. ¿Puedo reservar ese hotel y qué aprobación necesito antes de reservar?”

Ejecutamos el agente con:

de los agentes importar resultado del corredor = esperar Runner.run (agente, PROMPT, max_turns = 12)

El agente dio la respuesta correcta: sí, el empleado puede reservar el hotel oficial de la conferencia si existe una razón comercial práctica. Obtuvo esa información de Conference_guidelines.md.

Para la parte de aprobación, el agente primero identificó que se necesita aprobación ya que el hotel está por encima del límite normal. Luego dio las condiciones de aprobación correspondientes. El agente utilizó travel_policy.md, Approval_matrix.md y Policy_updates_2026.md para respaldar su respuesta, que es exactamente lo que esperaríamos.

La parte más interesante es el rastro, a partir del cual podemos aprender cómo piensa el agente. Podemos mostrar la traza de la siguiente manera:

para el elemento en result.new_items: print(tipo(elemento).__nombre__, elemento)

result.new_items contiene las llamadas a herramientas intermedias y las salidas de herramientas producidas por el agente. En mi ejecución, puedo ver que el agente primero llamó a search_docs() con palabras clave como hotel de conferencia, límite de hotel, aprobación y Berlín. Luego, llamó a list_docs() para inspeccionar los documentos de políticas disponibles. Después de eso, abrió los archivos relevantes con read_doc(). Sólo entonces produjo la respuesta final.

Este es exactamente el bucle agente que queríamos ver.

3. Qué decidir antes de crear Agentic RAG

El estudio de caso que acabamos de ver sólo araña la superficie. Para construir realmente una solución RAG agente práctica, según mi experiencia, le sugiero que responda las siguientes 5 preguntas:

P1: ¿Cuánta libertad debe tener el agente?

Una opción común es exactamente lo que hicimos en el estudio de caso anterior: expusimos un par de herramientas cuidadosamente seleccionadas y el agente solo puede usar esas herramientas para realizar la investigación. Esto es sencillo en términos de control, prueba y auditoría.

Pero también podemos darle al agente un acceso más amplio, como el shell y el sistema de archivos. De esta manera, el agente puede ejecutar scripts directamente para buscar e inspeccionar archivos, y tal vez incluso realizar un procesamiento adicional de datos para generar artefactos útiles, todo por sí solo.

Este patrón puede ser mucho más poderoso, pero también aumenta el riesgo y hace que el comportamiento sea más difícil de predecir.

Entonces, para la mayoría de las aplicaciones RAG, comenzaría primero con herramientas seleccionadas y solo agregaría acceso al shell/sistema de archivos cuando la complejidad de la tarea lo justifique.

P2: ¿El agente debería buscar únicamente texto sin formato?

La mayoría de los proyectos RAG pueden comenzar con texto plano como archivos PDF, páginas wiki, manuales, etc. Eso está bien.

Pero en la práctica, a menudo podemos facilitar la recuperación generando una capa de conocimiento sobre los textos sin formato.

Esos artefactos de conocimiento derivados pueden ser metadatos de documentos, resúmenes, enlaces entre documentos, o podemos ir más allá e implementar un gráfico de conocimiento adecuado.

Estos artefactos de conocimiento derivados ayudan al agente a navegar por el corpus, mientras que los textos sin procesar siguen siendo la fuente de la verdad.

P3: ¿Todavía necesitamos incrustaciones?

Agentic RAG no significa necesariamente que las incrustaciones hayan desaparecido.

Las incrustaciones de vectores siguen siendo una forma eficaz de encontrar textos semánticamente relevantes y, a menudo, superan a una estrategia de búsqueda pura de palabras clave.

En el RAG agente, lo que cambió esencialmente es que la recuperación se convierte en una “acción” que el agente puede realizar. Bajo este marco, la “acción” aún puede ser impulsada por un recuperador basado en incrustaciones, uno basado en palabras clave o incluso uno híbrido.

Por tanto, las incrustaciones pueden seguir siendo útiles. Son sólo una forma posible de potenciar la herramienta de búsqueda del agente.

P4: ¿Debería un agente encargarse de todo?

La configuración de RAG agente más simple es que solo un agente realiza la búsqueda, lee y responde.

Pero a medida que la tarea se vuelve más compleja, es posible que desee dividir el trabajo entre varios agentes. Más concretamente, es posible que deba adoptar una estrategia de múltiples agentes.

Puedes dividir el trabajo por rol. Por ejemplo, la división planificador-retriever-escritor, donde el planificador decide qué evidencia se necesita, el recuperador la recopila y el escritor produce la respuesta final utilizando la evidencia recopilada.

También puede dividir por tipo de fuente, donde cada agente está equipado con herramientas personalizadas y se enfoca en un tipo específico de fuente.

Solo tenga en cuenta: una configuración de múltiples agentes agrega complejidad de coordinación y no hay garantía de que funcione mejor que una configuración de un solo agente. Las pruebas empíricas son muy importantes.

P5: ¿Deberíamos utilizar siempre RAG agente?

Quizás no siempre.

El hecho de que el RAG agente se convierta en un tema de moda no significa necesariamente que siempre debas utilizarlo por defecto.

Agentic RAG ofrece más flexibilidad, pero eso conlleva costes. Ese costo no se trata sólo de la latencia o el costo del token, sino también del comportamiento menos predecible de los agentes.

Empiece siempre de forma sencilla y luego agregue bucles agentes cuando la pregunta realmente necesite una recuperación iterativa.