Comparativa Naive RAG vs ReAct Agent utilizando LlamaIndex
Introducción
En el ámbito de la Inteligencia Artificial Generativa (IAG), las técnicas de Generación Aumentada por Recuperación (RAG) han demostrado ser cruciales para mejorar la capacidad de los modelos de lenguaje. Sin embargo, la aproximación Naive RAG muestra limitaciones significativas cuando se enfrenta a preguntas complejas y grandes volúmenes de datos. En este artículo, exploraremos cómo la transición de Naive RAG a sistemas más avanzados como ReAct Agent nos permiten pasar una aplicación LLM a producción de manera confiable.
Background: Entendiendo Naive RAG
El Naive RAG es el pilar en aplicaciones simples de preguntas y respuestas, proporcionando resultados adecuados para conjuntos limitados de datos. A pesar de su utilidad, su enfoque en la búsqueda directa lo hace insuficiente para tareas más complejas y profundas, como la síntesis de textos largos o el análisis comparativo detallado.
Por ejemplo, esta aproximación no resuelve preguntas como:
- Preguntas de resumen extenso, como solicitar un resumen completo de informes anuales.
- Comparaciones complejas entre entidades, como evaluar contribuciones de diferentes individuos en proyectos de código abierto.
RAG Avanzado: Introducción al ReAct Agent
Para superar estas limitaciones, proponemos adoptar la aproximación ReAct Agent, una evolución en el procesamiento de IA que integra comprensión contextual y capacidad de planificación en las consultas. Esta aproximación no solo entiende mejor la naturaleza de las preguntas, sino que también adapta sus respuestas basándose en un contexto más amplio y dinámico.
El flujo es similar al que conocemos,ya que los pasos son los mismo:
- Carga y Transformación de Datos: Utilización de herramientas como LlamaIndex para la ingestión y preparación eficiente de datos.
- Indexación y Recuperación: Empleo de índices vectoriales para una recuperación precisa y contextualizada mediante una planificación de las tareas y el uso de herramientas para recuperar o acceder a información externa.
- Interacción Dinámica con LLM: ReAct Agent utiliza modelos de lenguaje para generar respuestas que no solo son relevantes, sino también profundamente integradas con el conocimiento acumulado en interacciones previas.
Hands-On
Vamos a ver un ejemplo de implementación. Puedes ver el Notebook con el paso a paso y descargar el código aquí.
#ReAct Agent: https://docs.llamaindex.ai/en/stable/examples/agent/react_agent_with_query_engine/
from llama_index.core import (
VectorStoreIndex,
SimpleDirectoryReader,
StorageContext,
)
from llama_index.core import SummaryIndex
# load documents
documents = SimpleDirectoryReader("./data/paul_graham").load_data()
from llama_index.core import Settings
# initialize settings (set chunk size)
Settings.chunk_size = 1024
nodes = Settings.node_parser.get_nodes_from_documents(documents)
# initialize storage context (by default it's in-memory)
storage_context = StorageContext.from_defaults()
storage_context.docstore.add_documents(nodes)
summary_index = SummaryIndex(nodes, storage_context=storage_context)
vector_index = VectorStoreIndex(nodes, storage_context=storage_context)
from llama_index.core.tools import QueryEngineTool
list_query_engine = summary_index.as_query_engine(
response_mode="tree_summarize", use_async=True
)
vector_query_engine = vector_index.as_query_engine(
response_mode="tree_summarize", use_async=True
)
list_tool = QueryEngineTool.from_defaults(
query_engine=list_query_engine,
description="Useful for questions asking for a biography of the author.",
)
vector_tool = QueryEngineTool.from_defaults(
query_engine=vector_query_engine,
description=(
"Useful for retrieving specific snippets from the author's life, like"
" his time in college, his time in YC, or more."
),
)
# Setup ReAct Agent
# Here we setup two ReAct agents: one powered by standard gpt-3.5-turbo, and the other powered by gpt-3.5-turbo-instruct.
# You can optionally specify context which will be added to the core ReAct system prompt
from llama_index.core.agent import ReActAgent
from llama_index.llms.openai import OpenAI
# context = """System Prompt"""
agent = ReActAgent.from_tools(
[list_tool, vector_tool],
verbose=True,
# context=context
)
response = agent.chat("What were noteable events and people from the authors time at Interleaf and YC?")
print(str(response))
Conclusión
El paso de Naive RAG a ReAct Agent representa una evolución significativa en la manera en que interactuamos y aprovechamos la potencia de la Inteligencia Artificial Generativa. Al adoptar enfoques más sofisticados y contextualmente conscientes, podemos expandir significativamente las capacidades de los sistemas de IA para abordar problemas más complejos y variados.
What’s Next, próximos pasos:
- Extracción de datos estructurados con Gemini Pro Vision y Pydantic
- Data mining: extracción de información, topics, keywords y etiquetas
Comparte tu experiencia:
Estoy abierto a colaborar y discutir sobre las posibilidades que ofrece la inteligencia artificial y cómo trabajar juntos para explorar y construir soluciones en diferentes sectores. Si tienes ideas, preguntas o simplemente quieres hablar de ello, escríbeme:
- GitHub: https://github.com/albertgilopez
- LinkedIn: https://www.linkedin.com/in/albertgilopez/
- Inteligencia Artificial Generativa en español: https://www.codigollm.es/
CREDITS
El contenido está extraído de la presentación LlamaIndex Talk: “Beyond RAG: Building Advanced Context-Augmented LLM Applications de Jerry Liu, LlamaIndex co-founder/CEO” y de fuentes oficiales de la página web https://www.llamaindex.ai/