LLM scaled

En este artículo, recorreremos un chatbot de Generación de Recuperación-Aumentada (RAG) implementado utilizando LangChain, Mistral LLM, incrustaciones de Hugging Face y búsqueda vectorial. Este chatbot permite a los usuarios hacer preguntas y recibir respuestas basadas en información recuperada de un conjunto de datos personalizado, como un documento PDF.

Tabla de contenidos

Visión general del chatbot

El chatbot está construido utilizando Mistral LLM para el procesamiento del lenguaje natural, Hugging Face embeddings para la recuperación de documentos basada en vectores, y LangChain para la estructuración del agente conversacional. Las principales capacidades de este chatbot incluyen:

  • Retrieval-Augmented Generation (RAG): Combina la búsqueda basada en la recuperación con la IA generativa para proporcionar respuestas más relevantes.
  • Búsqueda vectorial con almacenamiento en memoria: Recupera información de forma eficiente utilizando la búsqueda semántica en incrustaciones de documentos.
  • Procesamiento de documentos PDF: Carga y procesa documentos PDF para extraer e indexar contenidos relevantes.
  • Memoria conversacional: Recuerda interacciones previas dentro de una sesión utilizando el MemorySaver de LangGraph.

Desglosemos los componentes de la aplicación.

Instalación

pip install --quiet --upgrade langchain-text-splitters langchain-community langgraph langchain[mistralai]

1. Inicialización del Chatbot

El chatbot está encapsulado en una clase ChatBot, que inicializa los componentes necesarios:

class ChatBot():
def __init__(self):
# Create memory storage
self.memory = MemorySaver()

# Load Mistral LLM
self.model = init_chat_model("mistral-large-latest", model_provider="mistralai")

# Initialize vector search with Hugging Face embeddings
self.embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2")
self.vector_store = InMemoryVectorStore(self.embeddings)

# Load and process PDF data
self.load_data("data/administratoreecaf3b490e2d43d2e3b50c0c068b5d7.pdf") # Define prompt for question-answering
self.prompt = hub.pull("rlm/rag-prompt")

# Define retrieval tool
self.tools = ToolNode([self.retrieve])

# Create the conversational agent
self.agent_executor = create_react_agent(self.model, self.tools, checkpointer=self.memory)

Componentes clave

  1. Inicialización de Mistral LLM: El chatbot utiliza el modelo «mistral-large-latest» de MistralAI para generar respuestas.
  2. Hugging Face Embeddings para la búsqueda de vectores: El chatbot utiliza sentence-transformers/all-mpnet-base-v2 para generar incrustaciones y almacenarlas en una base de datos de vectores en memoria.
  3. Gestión de memoria: MemorySaver de LangGraph almacena interacciones anteriores, lo que permite la comprensión contextual.
  4. Integración de herramientas: El chatbot utiliza ToolNode para integrar una función de recuperación que obtiene información relevante de documentos indexados.

2. Carga y procesamiento de datos PDF

El chatbot puede procesar un documento PDF, dividirlo en trozos más pequeños y almacenar los textos incrustados para la recuperación.

def load_data(self, pdf_path):
# Load and chunk contents of the PDF
loader = PyPDFLoader(pdf_path)
docs = loader.load()

# Split text into manageable chunks
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
all_splits = text_splitter.split_documents(docs)
# Index chunks in vector store
_ = self.vector_store.add_documents(documents=all_splits)

Cómo funciona

  • PyPDFLoader extrae el texto del PDF.
  • El RecursiveCharacterTextSplitter divide el texto en trozos de 1000 caracteres, con un solapamiento de 200 caracteres para preservar el contexto.
  • El texto procesado se convierte en incrustaciones y se almacena en la base de datos vectorial.

De este modo, cuando un usuario hace una pregunta, el chatbot puede buscar las secciones pertinentes del documento en lugar de escanear todo el PDF.

3. Recuperación de información relevante

Cuando un usuario formula una pregunta, el chatbot recupera fragmentos de texto similares del contenido PDF almacenado.

def retrieve(self, state: State):
"""Retrieve information related to a query."""
retrieved_docs = self.vector_store.similarity_search(state["question"])
return {"context": retrieved_docs}

Cómo funciona la recuperación

  1. Entrada del usuario: El chatbot recibe una pregunta del usuario.
  2. Búsqueda vectorial: La pregunta se convierte en un vector de incrustación y se compara con los vectores de documentos almacenados mediante una búsqueda por similitud.
  3. Se obtienen las coincidencias más importantes: Se recuperan las secciones de documentos más relevantes y se utilizan como contexto para generar una respuesta.

4. Respuesta a las preguntas de los usuarios

El chatbot procesa las consultas de los usuarios y genera respuestas utilizando el Mistral LLM y el contexto recuperado.

def ask(self, message: str, thread_id: str = "abc123"):
# Use the agent
config = {"configurable": {"thread_id": thread_id}}
response = self.agent_executor.invoke(
{"messages": [HumanMessage(content=message)]},
config)
return response["messages"][-1].content

Cómo funciona

  1. La función recibe el mensaje del usuario.
  2. Envía el mensaje al agente LangChain, junto con el contexto recuperado.
  3. El modelo Mistral genera una respuesta basada en el contexto.
  4. El chatbot devuelve la respuesta final.

De este modo, se garantiza que las respuestas sean conscientes del contexto, lo que mejora la precisión a la hora de responder a preguntas específicas del dominio.

Conclusión

Este chatbot es un potente asistente que aprovecha Mistral LLM, RAG y la recuperación basada en vectores para proporcionar respuestas precisas basadas en datos personalizados de la empresa.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *