Creación de un sistema de generación de recuperación de agentes aumentada (RAG) con IBM Watsonx y Langchain | de Lakshmi Narayanan | agosto 2024

Creación de un sistema de generación de recuperación de agentes aumentada (RAG) con IBM Watsonx y Langchain | de Lakshmi Narayanan | agosto 2024

Un tutorial de inicio rápido

Imagen generada por IA (generada por GPT-4o)

El panorama de la inteligencia artificial (IA), en particular la IA generativa, ha experimentado avances significativos recientemente. Los modelos de lenguajes grandes (LLM) han sido verdaderamente transformadores en este sentido. Un enfoque popular para crear una aplicación LLM es la generación aumentada de 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 las aportaciones del usuario para desencadenar acciones, los sistemas RAG 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 útil en muchos casos de uso, como servicio al cliente, soporte de búsqueda y escenarios de resolución de problemas complejos. Al integrar la capacidad generativa de los LLM con sistemas de búsqueda avanzados, Agentic RAG ofrece una solución de inteligencia artificial mucho más eficaz.

Características principales de RAG utilizando agentes.

1. Desglose de tareas:

Los agentes pueden dividir tareas complejas en subtareas manejables, manejando la recuperación y generación paso a paso. Este enfoque mejora la coherencia y relevancia del resultado final.

2. Conciencia contextual:

Los agentes de RAG mantienen el conocimiento contextual durante las interacciones, asegurando que la información recuperada sea relevante para la conversación o tarea en cuestión. Esto conduce a respuestas más coherentes y contextualmente apropiadas.

3. Estrategias de recuperación flexibles:

Los agentes pueden adaptar sus estrategias de recuperación según el contexto, por ejemplo, pasando de una recuperación densa a una recuperación dispersa o utilizando enfoques híbridos. Esta optimización equilibra relevancia y velocidad.

4. Bucles de retroalimentación:

Los agentes a menudo incorporan mecanismos para utilizar los comentarios de los usuarios para perfeccionar las recuperaciones y las generaciones futuras, lo cual es crucial para aplicaciones que requieren aprendizaje y adaptación continuos.

5. Capacidades multimodales:

Los agentes RAG avanzados están comenzando a admitir capacidades multimodales, administrando y generando contenido en diferentes 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 escale de manera eficiente, manejando recuperaciones a gran escala mientras mantiene la calidad del contenido, lo que los hace adecuados para aplicaciones de nivel empresarial.

7. Explicabilidad:

Algunos agentes RAG están diseñados para brindar explicaciones sobre sus decisiones, particularmente en aplicaciones de alto riesgo, mejorando así 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 en la construcción de un sistema RAG agente utilizando cadena de idioma con IBM Watsonx.ai (tanto para capacidades de integración como de generación) y milvus servicio de base de datos vectorial proporcionado por Datos de IBM Watsonx (para almacenar conocimientos vectorizados). Para este tutorial, creamos un agente ReAct.

Paso 1: instalar el paquete

Comencemos instalando los paquetes de Python necesarios. Estos incluyen Langchain, integraciones de IBM Watson, paquetes de integración milvus y BeautifulSoup4 para web scraping.

%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 bibliotecas 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í importamos módulos para web scraping, historial de chat, división de texto y almacenamiento de vectores (milvus)

Paso 3: configurar 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

Una vez configurado el entorno, inicializamos IBM Watsonx LLM con parámetros específicos para controlar el proceso de construcción. Aquí usamos la clase ChatWatsonx con mistralai/mixtral-8x7b-instruct-v01 plantilla de watsonx.ai.

from Langchain_ibm import ChatWatsonx

llm = 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. Aquí podemos modificar los parámetros de inferencia 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 documentos desde una página web y los dividimos en partes para facilitar una 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 lo divide 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 verificar siempre los permisos del sitio antes de realizar el scraping. Los sitios web pueden actualizar sus políticas, así que asegúrese de que sus acciones cumplan con sus términos de servicio y las leyes aplicables.

Paso 6: Configurar el recopilador

Establecemos una conexión con Milvus para almacenar documentos incrustados y permitir una recuperación rápida.

from AdpativeClient import InMemoryMilvusStrategy, RemoteMilvusStrategy, BasicRAGHandler

def 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 se utiliza una instancia de Milvus remota o en memoria según el tamaño de los datos, lo que garantiza escalabilidad y eficiencia.

La clase BasicRAGHandler cubre la siguiente funcionalidad en un alto nivel:

· Inicializa el administrador con un cliente Milvus, permitiendo 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 sus metadatos en una colección en Milvus.

Paso 7: Definición de herramientas

Con el sistema de búsqueda implementado, ahora definimos el buscador como una herramienta. El LLM utilizará esta herramienta 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, utilizando el contenido recuperado.

from langgraph.prebuilt import create_react_agent
from Langchain_core.messages import HumanMessage

agent_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), mostramos cómo construir un sistema Agentic RAG de ejemplo utilizando Langchain e IBM Watsonx. Los sistemas Agentic RAG marcan un avance significativo en la IA, combinando 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 diversos campos.

A medida que continúa aumentando la demanda de soluciones de IA más inteligentes e interactivas, será esencial dominar la integración de los LLM con herramientas de investigación. Este enfoque no sólo mejora la precisión de las respuestas de la 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 la IA.

NOTA: Este contenido no está afiliado ni respaldado por IBM y no constituye documentación oficial de IBM. Este es un proyecto personal impulsado por el interés propio y la información se comparte en beneficio de la comunidad.