LangChain BlogPublicación de la fuente

Context Engineering Starts with Retrieval

Para herramientas de búsqueda personalizadas (como RAG), usa "recuperar, descargar, delegar": guarda los resultados en archivos, devuelve las rutas y deja que los subagentes las lean. El agente principal solo ve lo que es relevante.

Key Takeaways

  • Los agentes trabajan con una ventana de contexto limitada, y la recuperación de información falla de tres maneras: búsquedas ineficientes, demasiado contexto a la vez y contexto irrelevante u obsoleto.
  • Los agentes trabajan con una ventana de contexto limitada, y la recuperación de información falla de tres maneras: búsquedas ineficientes, demasiado contexto de una sola vez y contexto irrelevante u obsoleto.
  • El harness de Deep Agents mantiene las búsquedas pequeñas desde el principio. Las herramientas integradas del sistema de archivos buscan antes de leer: glob busca coincidencias en nombres de archivos, grep encuentra líneas coincidentes y read_file lee una página a la vez. Los resultados de herramientas demasiado grandes se descargan: el resultado completo se guarda en archivos, pero el agente solo recibe la ruta y una vista previa.

Para herramientas de búsqueda personalizadas (como RAG), usa "recuperar, descargar, delegar": guarda los resultados en archivos, devuelve las rutas y deja que los subagentes las lean. El agente principal solo ve lo que es relevante. Imagina que estás haciendo un examen de libro abierto: técnicamente tienes todas las respuestas, pero de algún modo eso lo hace aún más difícil para encontrar la correcta.

  • ¿Por dónde empiezas siquiera a buscar?
  • ¿Cuándo sabes que tus fuentes son correctas?
  • ¿Cómo optimizas tu tiempo para no gastar toda tu energía en búsquedas redundantes?

Encontrar la información correcta de manera eficiente no es tan sencillo.

Dale a un agente una pregunta y quedará en una situación similar: tiene una ventana de contexto limitada, así que, como nosotros los humanos, tiene que recuperar información para completar ciertas tareas (en lugar de tenerlo todo memorizado). Al buscar, los agentes tienen problemas con:

  • Búsquedas ineficientes: cada búsqueda cuesta tokens y tiempo. Un agente que busca torpemente (por ejemplo, abre cada archivo solo para ver qué hay dentro, o sigue reformulando la misma consulta) puede llenar su contexto con resultados de búsqueda antes de encontrar algo útil.
  • Demasiado contexto de una sola vez: una sola búsqueda que vierta una exportación completa de datos o una docena de documentos llena la ventana de contexto de un solo golpe, sin dejar espacio para el trabajo en sí.
  • Contexto irrelevante u obsoleto: la información desactualizada o fuera de tema puede parecer tan convincente para un modelo como la respuesta correcta. Una vez que está en la ventana de contexto, el agente puede construirla sobre ella (y el error se arrastrará por cada paso posterior).

Afortunadamente, existen varias técnicas a disposición de un agente que le permiten recuperar la información correcta. Es tarea de un harness de agente aplicar estas técnicas estratégicamente para dar al modelo el contexto adecuado en el momento adecuado para la tarea dada.

Este blog cubre los desafíos de la recuperación en agentes (encontrar e incorporar solo la información necesaria para la tarea en cuestión), las técnicas a nuestra disposición para combatirlos y cómo tenerlas en cuenta al diseñar un harness de agente (usando como ejemplo el harness de Deep Agents de LangChain ).

Para saber más sobre cómo gestionar el contexto una vez que está en la ventana de contexto, consulta este blog sobre Ingeniería de Contexto.

Nuestro ejemplo: un agente de análisis competitivo

Veamos cómo se puede aplicar esto en un caso de uso del mundo real: un agente de análisis competitivo. Cada lunes, un agente investiga a cientos de competidores y redacta un informe en la plantilla del equipo. Necesita:

  • Encontrar las notas de la semana pasada sobre la Compañía A
  • Buscar un número de ingresos específico en una enorme exportación de datos de mercado
  • Buscar en un archivo de noticias cualquier novedad

Cada una de estas es un tipo diferente de recuperación y, por lo tanto, enfrenta problemas diferentes. Hemos construido nuestro agente usando el Deep Agents harness así que hay algunas técnicas que podemos aplicar de inmediato para minimizar estos problemas.

1. Búsqueda ineficiente

Nuestro agente tiene que encontrar tres cosas para cada competidor. Si cada una requiere una docena de intentos (abrir archivos solo para ver qué contienen, o reformular una búsqueda porque la fuente usa palabras diferentes), su ventana de contexto se llena de búsquedas fallidas antes incluso de escribir una palabra del informe.

Por lo tanto, la mejor búsqueda es la que el agente no tiene que repetir, y eso significa usar la herramienta adecuada para cada tarea.

Comenzar con las herramientas integradas del sistema de archivos

Una de las formas más comunes de que un agente busque información es mediante un sistema de archivos. Sin embargo, si nuestro agente abre cada archivo para ver qué contiene, está buscando de manera muy ineficiente: cada archivo que lee termina en su ventana de contexto, por lo que puede llenarse solo con mirar.

Un mejor enfoque es comprobar primero los nombres y las palabras clave (de la misma manera que hojearías el índice de un libro en lugar de leer cada página durante un examen de libro abierto). Dos herramientas comunes del sistema de archivos hacen exactamente eso:

  • glob encuentra archivos por patrón de nombre. Por ejemplo, **/company-a*.md encuentra las notas de la semana pasada sobre la Compañía A.
  • grep busca dentro de los archivos sin cargarlos en la ventana de contexto. Coincide con texto literal y puede devolver los archivos coincidentes, las líneas coincidentes o los conteos.

Cada agente profundo viene con estas herramientas integradas, junto con ls, read_file, write_file y edit_file. Las mismas herramientas funcionan sin importar dónde vivan los archivos (estado del agente, disco local, un almacén persistente o una sandbox), porque todos pasan por el backend.

Añade una herramienta de recuperación cuando las palabras clave no son suficientes

Grep es genial cuando sabes qué palabras buscar, pero solo coincide con el texto exacto que le das. Eso es un problema para el tercer trabajo de nuestro ejemplo: buscar en un archivo de noticias cualquier cosa nueva. Si nuestro agente busca con grep "Company A funding", se perderá un artículo titulado "Company A closes $50M Series B", aunque eso sea exactamente lo que busca.

Para buscar por significado en lugar de palabras exactas (búsqueda semántica), añades una herramienta de recuperación respaldada por un vector store. Una herramienta de recuperación es cualquier herramienta que el agente puede llamar para obtener información: recibe una consulta, la busca en alguna fuente de datos y devuelve lo que encuentra (las coincidencias más cercanas).

Cómo coincide una herramienta de recuperación depende de la fuente de datos detrás de ella. Respaldada por un vector store, coincide por significado, pero una herramienta de recuperación también puede apoyarse en otras fuentes de datos:

  • Una base de datos SQL, para búsquedas estructuradas (como cifras de ventas o registros de clientes)
  • Una API de búsqueda (para información fresca de la web)
  • Un servidor MCP (para herramientas que otra persona ya construyó, como una búsqueda de documentación)

Para una mirada más profunda sobre cómo funciona la búsqueda semántica, consulta la guía de LangChain.

Dejar que el agente decida cuándo buscar

Muchas configuraciones de recuperación buscan una vez al inicio y luego responden. Eso funciona para un bot de preguntas frecuentes (RAG de 2 pasos), pero no para nuestro agente. Digamos que, a mitad de la investigación sobre Company C, encuentra un artículo sobre un lanzamiento de producto que no conocía, y ahora necesita los precios de ese producto (que no podía saber que debía buscar al inicio). Con una sola búsqueda, el informe se envía sin esa información.

Los agentes de investigación necesitan recuperación agéntica (en lugar de RAG de 2 pasos): el agente decide cuándo buscar, qué buscar y si necesita más. Con Deep Agents, ya funciona así por defecto: el agente se ejecuta en un bucle y puede llamar a cualquier herramienta tantas veces como necesite.

Empaqueta tu conocimiento de búsqueda como una skill

Para ayudar al agente a buscar bien, puedes empaquetar tus conocimientos de búsqueda como un habilidad: un conjunto de instrucciones para una tarea específica (como qué índice usar, cómo formular las consultas y cómo dar formato a las citas).

El agente solo ve el nombre de cada habilidad y una breve descripción hasta que una tarea la requiere; entonces carga las instrucciones completas, de modo que el conocimiento especializado está disponible cuando se necesita sin ocupar contexto el resto del tiempo (una técnica llamada divulgación progresiva). Aquí hay un explicación en video.

Revelación progresiva (animada)

2. Demasiado contexto a la vez

Sin embargo, a pesar de optimizar el proceso de búsqueda, incluso el derecha La búsqueda puede devolver demasiado. Nuestro agente necesita un solo número de la exportación de datos de mercado (los ingresos trimestrales de la Compañía B), pero cargar las 40,000 filas para encontrarlo llenaría su ventana de contexto. Nuestra herramienta de recuperación tiene el mismo problema: si devuelve cada artículo de noticias directamente al modelo, cuatro resultados por búsqueda en cinco empresas se acumulan rápido.

Leer archivos grandes una página a la vez

Las herramientas del sistema de archivos están diseñadas para devolver lo menos posible. read_file lee un archivo de una página a la vez (100 líneas por defecto), y el agente puede establecer un offset (desde qué línea empezar) y un limit (cuántas líneas leer) para saltar a la parte que necesita. Así, para encontrar los ingresos de la Compañía B, el agente hace grep para buscarlos y luego lee solo las pocas líneas alrededor de la coincidencia.

Permita que el harness descargue los resultados de gran tamaño

A veces una herramienta devuelve más de lo esperado de todos modos. Cuando el resultado de una herramienta es demasiado grande (más de unos 20,000 tokens), el harness lo guarda en un archivo bajo /large_tool_results/ y le entrega al agente la ruta junto con una breve vista previa (las primeras y últimas líneas). El agente puede entonces leer solo las partes que necesita con read_fileel offset y el limit de.

Haz que tu herramienta de recuperación devuelva rutas de archivo

Puede aplicar la misma idea a su propia herramienta de recuperación en lugar de esperar al límite de tamaño: haga que escriba cada resultado en un archivo y devuelva solo las rutas. Esta es la primera parte de un patrón llamado «recuperar, descargar, delegar» (Guía de RAG de LangChain recorre todo el proceso).

Aquí hay una herramienta de recuperación simplificada. Ejecuta la búsqueda, guarda cada resultado como un archivo en el backenddel agente, y devuelve solo la lista de rutas de archivos:

backend = StateBackend()

@tool
def search_news(query: str) -> str:
    """Search the news archive and save each result to a file."""
    docs = vector_store.similarity_search(query, k=4)
    files = [(f"/retrieved/result_{i}.md", doc.page_content.encode()) for i, doc in enumerate(docs)]
    backend.upload_files(files)
    return "Saved results to: " + ", ".join(path for path, _ in files)

Ahora el agente principal ve cuatro rutas cortas en lugar de cuatro artículos completos.

3. Contexto irrelevante u obsoleto

Los resultados pequeños no sirven de nada si son los incorrectos . Cualquiera de esos cuatro archivos podría tratar sobre una empresa diferente con un nombre similar, o ser una historia de hace dos años. El texto fuera de tema u obsoleto resulta tan convincente para un modelo como la respuesta correcta, así que el objetivo es mantenerlo completamente fuera del contexto del agente principal.

Deja que los subagentes filtren los resultados

Sin embargo, el agente principal aún tiene que leer esos archivos para descubrir cuáles importan (y cada artículo fuera de tema que abre sí termina en su contexto). Ahí es donde entra en juego la parte de "delegar" del patrón "recuperar, descargar, delegar": un subagente lee cada archivo recuperado y devuelve solo los hechos clave.

  1. Define el subagente: la descripción le indica al agente principal cuándo usarlo (un archivo por llamada), y el prompt del sistema le indica al subagente qué hacer con ese archivo.
chunk_analyst = {
		"name": "chunk-analyst",
		"description": "Analyze one retrieved file. Pass the question and a single path under /retrieved/.",
		"system_prompt": "Use read_file to read the assigned file. Return the key facts and the source URL.",
}
  1. Dale al agente principal la herramienta de recuperación y el subagente. Pasa el mismo backend que usaste en search_news, para que el subagente pueda leer los archivos que la herramienta guardó.
agent = create_deep_agent(
		model=model,
		tools=[search_news],
		backend=backend,  # same instance, so read_file can see /retrieved/
		subagents=[chunk_analyst],
)

Ahora el flujo es:

  1. Buscar: el agente principal llama a search_news y recibe cuatro rutas.
  2. Delegar: envía cada ruta a un subagente analista de fragmentos, y estos pueden ejecutarse en paralelo.
  3. Sintetizar: cada analista devuelve un resumen breve con su fuente. El agente principal los combina y busca de nuevo si falta algo.

Los resultados en bruto van a archivos, la lectura ruidosa ocurre en subagentes con sus propias ventanas de contexto, y el agente principal solo ve conclusiones. Todo lo que esté fuera de tema se queda en el contexto del subagente, ¡y la ventana de contexto del agente principal se mantiene despejada!

Recurre a fuentes actualizadas

El filtrado sí mantiene fuera los resultados fuera de tema, pero no puede arreglar los resultados desactualizados. Nuestro agente de análisis competitivo se ejecuta todos los lunes, así que el índice del mes pasado no capturará las noticias de esta semana.

Una solución: una API de búsqueda o un servidor MCP podría darle al agente información actual (en lugar de lo que se indexó hace meses). Si tus datos tienen fechas, filtrar por fecha en la herramienta de recuperación también mantendría fuera los resultados antiguos.

Ten cuidado con el texto recuperado

Por otro lado, ¡los resultados relevantes y actuales también pueden causar problemas! Dado que el texto recuperado es datos, no instrucciones, cualquier cosa que recuperes podría contener una inyección de prompt (y ninguna estrategia de prompt o delimitadores lo previene por completo). Asegúrate de validar las salidas: verifica que las respuestas citen las fuentes que esperas y que las afirmaciones coincidan con ellas.

Estrategias de recuperación a tener en cuenta

Esto es lo que debes vigilar (independientemente del harness que estés usando):

  • Usa la herramienta más eficiente que funcione. Si conoces las palabras, grep supera una búsqueda por embeddings. Guarda la búsqueda semántica para cuando realmente la necesites.
  • Pagina en lugar de cargar. Lee archivos grandes por partes en lugar de todo a la vez.
  • Devuelve punteros en lugar de cargas de datos. Escribe el contenido recuperado en archivos y entrega al agente las rutas.
  • Delega la lectura. Permite que los subagentes lean y resuman para que el agente principal solo vea las conclusiones.
  • Verifica la fundamentación. Comprueba las respuestas contra lo que se recuperó y trata el texto recuperado como no confiable.

Pruébalo

uv add deepagents

¿Quieres aprender más de la mano de un instructor en vivo? Lo cubriré el 9 de noviembre: Regístrate AQUÍ!

‍

La recuperación es solo la mitad de la historia: cómo la información llega al agente. ¿Cómo gestionamos la ventana de contexto del agente a medida que empieza a acumular información con el tiempo?

Para saber más, consulta:

Fuente original

LangChain Blog

Notas sobre el contenido

La publicación original y los derechos pertenecen a la fuente.

Traducción automática · Consulte el original