El panorama de la inteligencia artificial (IA), en particular la IA generativa, ha experimentado avances significativos recientemente. Los modelos de lenguaje de gran tamaño (LLM) han sido verdaderamente transformadores en este sentido. Un enfoque popular para crear una aplicación LLM es la generación aumentada por recuperación (RAG), que combina la capacidad de aprovechar los datos de una organización con las capacidades generativas de estos LLM. Los agentes son una forma popular y útil de introducir un comportamiento autónomo en las aplicaciones LLM.
¿Qué es Agentic RAG?
Agentic RAG representa una evolución avanzada en los sistemas de IA, donde los agentes autónomos utilizan técnicas RAG para mejorar sus capacidades de toma de decisiones y respuestaA diferencia de los modelos RAG tradicionales, que a menudo dependen de la información del usuario para activar acciones, los sistemas RAG basados en agentes adoptan un enfoque proactivo. Estos agentes buscan de forma autónoma información relevante, la analizan y la utilizan para generar respuestas o tomar acciones específicas. Un agente está equipado con un conjunto de herramientas y Puede seleccionar y utilizar juiciosamente las herramientas apropiadas para el problema dado.
Este comportamiento proactivo es particularmente valioso en muchos casos de uso, como el servicio al cliente, la asistencia en la investigación y los escenarios de resolución de problemas complejos. Al integrar la capacidad generativa de los LLM con sistemas de recuperación avanzados, Agentic RAG ofrece una solución de IA mucho más eficaz.
Características principales de RAG que utilizan agentes
1. Descomposición de tareas:
Los agentes pueden dividir tareas complejas en subtareas manejables, y gestionar la recuperación y la generación paso a paso. Este enfoque mejora la coherencia y la relevancia del resultado final.
2. Conciencia contextual:
Los agentes de RAG mantienen la conciencia contextual durante las interacciones, lo que garantiza que la información recuperada se alinee con la conversación o tarea en curso. Esto genera respuestas más coherentes y contextualmente adecuadas.
3. Estrategias de recuperación flexibles:
Los agentes pueden adaptar sus estrategias de recuperación en función del contexto, por ejemplo, alternando entre recuperación densa y dispersa o empleando enfoques híbridos. Esta optimización equilibra la relevancia y la velocidad.
4. Bucles de retroalimentación:
Los agentes a menudo incorporan mecanismos para utilizar la retroalimentación de los usuarios con el fin de refinar futuras recuperaciones y generaciones, lo que es crucial para las aplicaciones que requieren aprendizaje y adaptación continuos.
5. Capacidades multimodales:
Los agentes RAG avanzados están comenzando a admitir capacidades multimodales, que permiten gestionar y generar contenido en distintos tipos de medios (texto, imágenes, videos). Esta versatilidad es útil para diversos casos de uso.
6. Escalabilidad:
La arquitectura del agente permite que los sistemas RAG escalen de manera eficiente, administrando recuperaciones a gran escala y manteniendo la calidad del contenido, lo que los hace adecuados para aplicaciones de nivel empresarial.
7. Explicabilidad:
Algunos agentes RAG están diseñados para proporcionar explicaciones sobre sus decisiones, particularmente en aplicaciones de alto riesgo, lo que mejora la confianza y la transparencia en los resultados del sistema.
Esta publicación de blog es un tutorial de introducción que guía al usuario a través de la creación de un sistema RAG de agente utilizando Cadena de langostinos con IBM Watsonx.ai (tanto para capacidades de integración como de generación) y Milvus Servicio de base de datos vectorial proporcionado a través de Datos de IBM Watsonx (para almacenar los fragmentos de conocimiento vectorizados). Para este tutorial, hemos creado un agente ReAct.
Paso 1: Instalación del paquete
Primero, instalemos los paquetes de Python necesarios, que incluyen Langchain, integraciones con IBM Watson, paquetes de integración con milvus y BeautifulSoup4 para el rastreo web.
%pip install langchain
%pip install langchain_ibm
%pip install BeautifulSoup4
%pip install langchain_community
%pip install langgraph
%pip install pymilvus
%pip install langchain_milvus
Paso 2: Importaciones
A continuación importamos las librerías necesarias para configurar el entorno y configurar nuestro LLM.
import bs4
from Langchain.tools.retriever import create_retriever_tool
from Langchain_community.document_loaders import WebBaseLoader
from Langchain_core.chat_history import BaseChatMessageHistory
from Langchain_core.prompts import ChatPromptTemplate
from Langchain_text_splitters import CharacterTextSplitter
from pymilvus import MilvusClient, DataType
import os, re
Aquí, estamos importando módulos para raspado web, historial de chat, división de texto y almacenamiento de vectores (milvus)
Paso 3: Configuración de variables de entorno
Necesitamos configurar variables de entorno para IBM Watsonx, que se utilizarán para acceder al LLM proporcionado por Watsonx.ai
os.environ["WATSONX_APIKEY"] = "<Your_API_Key>"
os.environ["PROJECT_ID"] = "<Your_Project_ID>"
os.environ["GRPC_DNS_RESOLVER"] = "<Your_DNS_Resolver>"
Asegúrese de reemplazar los valores del marcador de posición con sus credenciales reales.
Paso 4: Inicialización de Watsonx LLM
Con el entorno configurado, inicializamos IBM Watsonx LLM con parámetros específicos para controlar el proceso de generación. Aquí utilizamos la clase ChatWatsonx con mistralai/mixtral-8x7b-instrucciones-v01 modelo de watsonx.ai.
from Langchain_ibm import ChatWatsonxllm = ChatWatsonx(
model_id="mistralai/mixtral-8x7b-instruct-v01",
url="https://us-south.ml.cloud.ibm.com",
project_id=os.getenv("PROJECT_ID"),
params={
"decoding_method": "sample",
"max_new_tokens": 5879,
"min_new_tokens": 2,
"temperature": 0,
"top_k": 50,
"top_p": 1,
}
)
Esta configuración configura el LLM para la generación de texto. Podemos ajustar los parámetros de inferencia aquí para generar las respuestas deseadas. Más información sobre los parámetros de inferencia del modelo y sus valores permitidos aquí
Paso 5: Cargar y dividir documentos
Cargamos los documentos desde una página web y los dividimos en fragmentos para facilitar su recuperación eficiente. Los fragmentos generados se almacenan en la instancia de milvus que hemos aprovisionado.
loader = WebBaseLoader(
web_paths=("https://lilianweng.github.io/posts/2023-06-23-agent/",),
bs_kwargs=dict(
parse_only=bs4.SoupStrainer(
class_=("post-content", "post-title", "post-header")
)
),
)
docs = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1500, chunk_overlap=200)
splits = text_splitter.split_documents(docs)
Este código extrae contenido de una página web específica y luego divide el contenido en segmentos más pequeños, que luego se indexarán para su recuperación.
Descargo de responsabilidad: Hemos confirmado que este sitio permite el scraping, pero es importante comprobar siempre los permisos del sitio antes de hacerlo. Los sitios web pueden actualizar sus políticas, así que asegúrate de que tus acciones cumplan con sus términos de uso y las leyes pertinentes.
Paso 6: Configuración del retriever
Establecemos una conexión con Milvus para almacenar las incrustaciones de documentos y permitir una recuperación rápida.
from AdpativeClient import InMemoryMilvusStrategy, RemoteMilvusStrategy, BasicRAGHandlerdef adapt(number_of_files=0, total_file_size=0, data_size_in_kbs=0.0):
strategy = InMemoryMilvusStrategy()
if(number_of_files > 10 or total_file_size > 10 or data_size_in_kbs > 0.25):
strategy = RemoteMilvusStrategy()
client = strategy.connect()
return client
client = adapt(total_size_kb)
handler = BasicRAGHandler(client)
retriever = handler.create_index(splits)
Esta función decide si utilizar una instancia de Milvus en memoria o remota en función del tamaño de los datos, lo que garantiza la escalabilidad y la eficiencia.
La clase BasicRAGHandler cubre las siguientes funcionalidades a un alto nivel:
· Inicializa el controlador con un cliente Milvus, lo que permite la interacción con la base de datos vectorial Milvus suministrada a través de IBM Watsonx.data
· Genera incrustaciones de documentos, define un esquema y crea un índice en Milvus para una recuperación eficiente.
· Inserta documentos, sus incrustaciones y metadatos en una colección en Milvus.
Paso 7: Definición de las herramientas
Una vez que se ha establecido el sistema de recuperación, ahora definimos el recuperador como una herramienta. Esta herramienta será utilizada por el LLM para realizar la recuperación de información basada en el contexto.
tool = create_retriever_tool(
retriever,
"blog_post_retriever",
"Searches and returns excerpts from the Autonomous Agents blog post.",
)
tools = [tool]
Paso 8: Generar respuestas
Finalmente, ahora podemos generar respuestas a las consultas de los usuarios, aprovechando el contenido recuperado.
from langgraph.prebuilt import create_react_agent
from Langchain_core.messages import HumanMessageagent_executor = create_react_agent(llm, tools)
response = agent_executor.invoke({"messages": [HumanMessage(content="What is ReAct?")]})
raw_content = response["messages"][1].content
En este tutorial (enlace a código), hemos demostrado cómo construir un sistema RAG de Agentic de muestra utilizando Langchain e IBM Watsonx. Los sistemas RAG de Agentic marcan un avance significativo en IA, ya que combinan el poder generativo de los LLM con la precisión de técnicas de recuperación sofisticadas. Su capacidad para proporcionar de forma autónoma información contextualmente relevante y precisa los hace cada vez más valiosos en varios dominios.
A medida que aumenta la demanda de soluciones de IA más inteligentes e interactivas, será esencial dominar la integración de los LLM con las herramientas de recuperación. Este enfoque no solo mejora la precisión de las respuestas de IA, sino que también crea una interacción más dinámica y centrada en el usuario, allanando el camino para la próxima generación de aplicaciones impulsadas por IA.
NOTA: Este contenido no está afiliado ni respaldado por IBM y no constituye de ninguna manera documentación oficial de IBM. Es un proyecto personal que se lleva adelante por interés personal y la información se comparte para beneficiar a la comunidad.