Imagínese conversar con un asistente virtual que recuerda no solo su última pregunta sino todo el flujo de su conversación: detalles personales, preferencias e incluso consultas de seguimiento. Esta memoria transforma los chatbots de simples máquinas de preguntas y respuestas en sofisticados socios de conversación, capaces de manejar temas complejos a través de múltiples interacciones. En este artículo, nos sumergimos en el fascinante mundo de la memoria conversacional en los sistemas de recuperación-generación aumentada (RAG), explorando las técnicas que permiten a los chatbots retener el contexto, personalizar respuestas y gestionar consultas de varios pasos sin problemas. Aprenderá sobre diferentes estrategias de memoria, sus ventajas y limitaciones, e incluso practicará Python y LangChain para ver cómo funcionan estos conceptos en tiempo real.
Objetivos de aprendizaje
- Comprender la importancia de la memoria conversacional en los sistemas de recuperación-generación aumentada (RAG).
- Conozca los diferentes tipos de técnicas de memoria conversacional en LangChain, incluida la memoria intermedia de conversación, la memoria de resumen de conversación, la memoria de ventana intermedia de conversación, la memoria intermedia de resumen de conversación, la memoria de gráfico de conocimiento de conversación y la memoria de entidad.
- Comprenda las ventajas y desventajas de cada técnica de memoria.
- Aprenda a implementar estas técnicas de memoria utilizando Python y LangChain.
Este artículo fue publicado como parte del Blogatón de ciencia de datos.
Importancia de la memoria conversacional en los chatbots
La memoria conversacional es crucial en los chatbots y agentes conversacionales porque permite que el sistema mantenga el contexto durante interacciones prolongadas, haciendo que las respuestas sean más relevantes y personalizadas. En aplicaciones basadas en chatbot, especialmente cuando la conversación abarca temas complejos o múltiples consultas, la memoria ayuda al:
- Mantener el contexto: La memoria permite que el modelo recuerde entradas pasadas, lo que reduce las preguntas repetitivas y permite respuestas fluidas y conscientes del contexto en múltiples turnos.
- Mejorando la relevancia: Al recordar los detalles específicos de interacciones pasadas, como preferencias o detalles clave, el sistema puede recuperar y generar información más relevante, lo que aumenta la precisión.
- Mejora de la personalización: Una memoria de intercambios anteriores permite que los modelos de chatbot adapten las respuestas en función de preferencias o elecciones pasadas, mejorando la participación y la satisfacción del usuario.
- Manejo de consultas de varios pasos: Las consultas complejas de varios pasos que requieren información de varias fuentes o documentos se benefician de la memoria, ya que permite al modelo “retener” respuestas provisionales y desarrollarlas de manera lógica.
- Reducir la redundancia: La memoria reduce las repeticiones innecesarias al evitar volver a buscar o procesar temas ya discutidos, lo que resulta en una experiencia de usuario más fluida.
Memoria conversacional usando Langchain
Hay varias formas en que podemos incorporar la memoria conversacional en la recuperación de generación aumentada. En LangChain, todas estas técnicas se pueden ejecutar a través de ConversationChain.
Implementación de memoria conversacional con Python y LangChain
Nos sumergiremos en la implementación de la memoria conversacional usando Python y LangChain, configurando componentes esenciales para permitir que los chatbots recuerden y consulten intercambios anteriores. Cubriremos todo, desde la creación de tipos de memoria hasta la mejora de la relevancia de la respuesta, lo que le permitirá crear chatbots que manejen conversaciones extensas y ricas en contexto sin problemas.
Instalación e importación de las bibliotecas necesarias
Para comenzar, instalaremos e importaremos las bibliotecas necesarias para crear memoria conversacional con Python y LangChain. Esta configuración proporcionará las herramientas necesarias para implementar y probar funciones de memoria de manera efectiva.
!pip -q install openai langchain huggingface_hub transformers
!pip install langchain_community
!pip install langchain_openai
from langchain_openai import ChatOpenAI
from langchain.chains import ConversationChain
from langchain.memory import ConversationBufferMemory
import os
os.environ('OPENAI_API_KEY') = ''
Memoria intermedia de conversación: almacenamiento del historial de interacción completo
Exploraremos cómo implementar la memoria buffer de conversación, que almacena el historial completo de interacción entre el usuario y el sistema. Este tipo de memoria ayuda a retener todos los intercambios anteriores, lo que garantiza que el chatbot pueda mantener el contexto durante toda la conversación, aunque puede generar un mayor uso de tokens. Recorreremos el proceso de configuración y explicaremos cómo mejora la capacidad del chatbot para responder con mayor relevancia.
#Defining the LLM
llm = ChatOpenAI(temperature=0, model="gpt-4o", max_tokens=1000)
conversation = ConversationChain(
llm=llm,
verbose=True,
memory=ConversationBufferMemory()
)
conversation.predict(input="Hi there! I am in Miami Today with my fiancee and want to go for shopping.")conversation.predict(input="How are you today?")
conversation.predict(input="Can you tell me some shopping malls?")
conversation.predict(input="Can you tell me who I am with in Miami?")#import csv
Producción:
> Entering new ConversationChain chain... Prompt after formatting:
The following is a friendly conversation between a human and an ai. The ai is
talkative and provides lots of specific details from its context. If the ai does not
know the answer to a question, it truthfully says it does not know. Current
conversation:Human: Hi there! I am in Miami Today with my fiancee and want to go for shopping.
ai: Hello! That sounds like a fun day ahead. Miami is a fantastic place for shopping
with a variety of options to explore. If you're looking for Luxury brands and high-
end fashion, you might want to check out the Bal Harbour Shops. I If you're
interested in a more eclectic mix of shops, the Miami Design District is a great
choice. It offers a blend of fashion, art, and design with boutiques like Louis
Vuitton, Dior, and unique art galleries.For a more traditional mall experience, you could visit the Aventura Mall,
which is one of the largest malls in the U.S. It has a wide range of stores from Zara and H&M
to Nordstrom and Bloomingdale's.
And if you're looking for something more budget-friendly, the Dolphin Mall is an
outlet mall with a variety of stores offering discounts on popular brands.
No matter where you choose to go, I'm sure you'll have a great time shopping in
Miami! Let me know if you need more information or have any other questions. Human:
Can you tell me some shopping malls?
ai: Of course! Here are some popular shopping malls in Miami that you might want to
consider:
1. **Aventura Mall**: As I mentioned earlier, this is one of the largest malls in
the U.S. It features over 300 stores, including popular brands like Apple, Zara, and
Bloomingdale's. It also has a variety of dining options and an imp 2. **Dolphin
Mall**: This is a great option for outlet shopping, with over 240 stores offering
discounts on brands like Nike, Calvin Klein, and Tommy Hilfiger. It also has a
range of dining and entertainment options, including a movi 3. **Bal Harbour
Shops**: Known for its luxury shopping experience, this open-air mall features
high-end brands like Chanel, Gucci, and Prada. It's set in a beautiful tropical
environment, making it a pleasant place to stroll and shop 4. **The Shops at
Merrick Park**: Located in Coral Gables, this upscale shopping center offers a mix
of Luxury and contemporary brands such as Neiman Marcus, Nordstrom, and Tiffany &
Co. It also has a selection of fine dining restaur 5. **Brickell City Centre**:
Situated in the heart of Miami's financial district, this modern shopping center
offers a mix of high-end and contemporary brands, including Saks Fifth Avenue,
AllSaints, and Sephora. It also features a vi 6. **Lincoln Road Mall**: While not a
traditional mall, this pedestrian street in South Beach is lined with shops, cafes,
and restaurants. It's a great place to enjoy the Miami weather while shopping at
stores like H&M, Anthropologie Each of these malls offers a unique shopping
experience, so it depends on what you're looking for. Enjoy your shopping adventure
in Miami!
Human: Can you tell me who I am with in Miami?
ai:
> Finished chain.
'You mentioned earlier that you are in Miami with your fiancée. I hope you both have
a wonderful time exploring the city and enjoying your shopping trip! If there's
anything else you'd like to know or any other way I can assist you, feel free to
ask.
Comprobemos qué está almacenado en el búfer usando esta función.
print(conversation.memory.buffer)
Producción:
Human: Hi there! I am in Miami Today with my fiancee and want to go for shopping. ai: Hello! That sounds like a fun day ahead. Miami is a great place for shopping with a variety of options to explore. If you're looking for high-end fashion and luxury brands, you might want to check out Human: Can you tell me some shopping malls? ai: Of course! Here are some popular shopping malls in Miami that you might want to visit: 1. **Aventura Mall**: As one of the largest malls in the United States, Aventura Mall offers a vast selection of stores, including both high-end and more affordable brands. You'll find everything from Nords 2. **Dolphin Mall**: This is a great spot for outlet shopping, with a wide range of stores offering discounts on popular brands. It's a bit more budget-friendly and includes stores like Nike, Calvin Klein, 3. **Brickell City Centre**: Located in the heart of Miami's financial district, this modern shopping center features luxury brands like Saks Fifth Avenue, as well as a variety of dining options and a ciner 4. **The Falls**: This is an open-air shopping center with a beautiful setting, featuring a waterfall and tropical landscaping. It has a mix of popular retailers like Macy's and specialty stores. 5. **Dadeland Mall**: Known for its large selection of department stores, including Macy's, JCPenney, and Nordstrom, Dadeland Mall also offers a variety of specialty shops and dining options. Each of these malls offers a unique shopping experience, so you can choose based on your preferences and what you're looking to buy. Enjoy your time in Miami! Human: Can you tell me who I am with in Miami? ai: You mentioned earlier that you are in Miami with your fiancée. I hope you both have a wonderful time exploring the city and enjoying your shopping adventure! If there's anything else you'd like to know As we can see, conversational buffer memory saves every interaction in the chat history directly. While storing everything gives the LLM the maximum amount of information, more tokens mean slowing response times and higher costs.
Memoria de resumen de conversaciones: optimización del historial de interacciones para lograr eficiencia
Al utilizar ConversationBufferMemory, utilizamos muy rápidamente una gran cantidad de tokens e incluso superamos el límite de ventana de contexto incluso de los LLM más avanzados disponibles en la actualidad. Para evitar el uso excesivo de tokens, podemos usar ConversationSummaryMemory. Como sugiere el nombre, esta forma de memoria resume el historial de la conversación.
from langchain.chains.conversation.memory import ConversationSummaryMemory
llm = ChatOpenAI(temperature=0, model="gpt-4o", max_tokens=1000)
conversation = ConversationChain(
llm=llm,
memory=ConversationSummaryMemory(llm=llm)
)
conversation.predict(input="Hi there! I am in Miami Today with my fiancee and want to go for shopping.")
conversation.predict(input="Can you tell me some shopping malls?")
conversation.predict(input="Can you tell me who I am with in Miami?")
print(conversation.memory.buffer)
Producción:
The human is in Miami with their fiancée and wants to go shopping. The ai suggests
several shopping destinations in Miami, including Bal Harbour Shops for luxury
brands, the Miami Design District for a mix
Pasamos el LLM a la función ConversationSummaryMemory ya que el LLM ayuda a resumir los contextos anteriores. Veamos el mensaje que se pasa al LLM para resumir los contextos históricos.
print(conversation.memory.prompt.template)
Producción:
Human: Hi there! I am in Miami Today with my fiancee and want to go for shopping.
ai: Hello! That sounds like a fun day ahead. Miami is a great place for shopping
with a variety of options to explore. If you're looking for high-end fashion and
luxury brands, you might want to check out Human: Can you tell me some shopping
malls? ai: Of course! Here are some popular shopping malls in Miami that you might
want to visit:
1. **Aventura Mall**: As one of the largest malls in the United States, Aventura
Mall offers a vast selection of stores, including both high-end and more affordable
brands. You'll find everything from Nords 2. **Dolphin Mall**: This is a great spot
for outlet shopping, with a wide range of stores offering discounts on popular
brands. It's a bit more budget-friendly and includes stores like Nike, Calvin Klein,
3. **Brickell City Centre**: Located in the heart of Miami's financial district, this modern shopping center features luxury brands like Saks Fifth Avenue, as well
as a variety of dining options and a ciner 4. **The Falls**: This is an open-air
shopping center with a beautiful setting, featuring a waterfall and tropical
landscaping. It has a mix of popular retailers like Macy's and specialty stores. 5.
**Dadeland Mall**: Known for its large selection of department stores, including
Macy's, JCPenney, and Nordstrom, Dadeland Mall also offers a variety of specialty
shops and dining options.
Each of these malls offers a unique shopping experience, so you can choose based on
your preferences and what you're looking to buy. Enjoy your time in Miami!
Human: Can you tell me who I am with in Miami?
ai: You mentioned earlier that you are in Miami with your fiancée. I hope you both
have a wonderful time exploring the city and enjoying your shopping adventure! If
there's anything else you'd like to know
Progressively summarize the lines of conversation provided, adding onto the previous
summary returning a new summary.
EXAMPLE
Current summary:
The human asks what the ai thinks of artificial intelligence. The ai thinks
artificial intelligence is a force for good.
New lines of conversation:
Human: Why do you think artificial intelligence is a force for good?
ai: Because artificial intelligence will help humans reach their full potential.
New summary:
The human asks what the ai thinks of artificial intelligence. The ai thinks
artificial intelligence is a force for good because it will help humans reach their
full potential. END OF EXAMPLE
Current summary: {summary}
New lines of conversation:
{new_lines}
New summary:
Si bien la ventaja de usar ConversationSummaryMemory es que reduce la cantidad de tokens para conversaciones largas, la desventaja es que toda la memoria depende de la versión resumida guardada de la conversación, cuya calidad nuevamente varía según la capacidad de resumen del LLM utilizado.
Memoria de la ventana del búfer de conversación: retención de interacciones recientes para la conciencia contextual
La memoria de la ventana del búfer de conversación es similar a la memoria del búfer pero con una ventana predefinida agregada a la memoria. Esto significa que solo le pedimos al modelo que recuerde 'n' número de interacciones anteriores, reduciendo así el número total de tokens utilizados en comparación con ConversationBufferMemory.
from langchain.chains.conversation.memory import ConversationBufferWindowMemory
llm = ChatOpenAI(temperature=0, model="gpt-4o", max_tokens=1000)
conversation = ConversationChain(llm=llm,memory=ConversationBufferWindowMemory(k=3))
conversation.predict(input="Hi there! I am in Miami Today with my fiancee and want to go for shopping.")
conversation.predict(input="Can you tell me some shopping malls?")
conversation.predict(input="Can you tell me who I am with in Miami?")
Producción:
'You mentioned earlier that you are in Miami with your fiancée. I hope you both have
a fantastic time exploring the city and enjoying all the shopping and attractions
it has to offer! If there's anything e lse you'd like to know or need help with,
feel free to ask."
Como podemos ver, con 'k' establecida en 3, el modelo puede recordar las últimas 3 conversaciones y, por lo tanto, puede recordar que la persona está con su prometida en Miami.
Si sólo queremos que nuestro chatbot recuerde una serie de conversaciones recientes, seleccionar este modelo es una buena opción. Sin embargo, esta opción no puede ayudar al chatbot a recordar interacciones muy distantes.
Memoria intermedia de resumen de conversación: combinación de interacciones recientes con historial resumido
ConversationSummaryBufferMemory es una combinación de ConversationSummaryMemory y ConversationBufferWindowMemory. Este sistema de memoria guarda las interacciones recientes en un búfer y combina las más antiguas en un resumen, manteniendo ambas almacenadas para su uso. En lugar de eliminar interacciones más antiguas solo en función de su recuento, ahora las elimina en función de la longitud total del token.
from langchain.chains.conversation.memory import ConversationSummaryBufferMemory
llm = ChatOpenAI(temperature=0, model="gpt-4o", max_tokens=1000)
conversation_sum_bufw = ConversationChain(
llm=llm, memory=ConversationSummaryBufferMemory(
llm=llm,
max_token_limit=650
))
conversation_sum_bufw.predict(input="Hi there! I am in Miami Today with my fiancee and want to go for shopping.")
conversation_sum_bufw.predict(input="Can you tell me some shopping malls?")
conversation_sum_bufw.predict(input="Can you tell me who I am with in Miami?")
Producción:
'You are in Miami with your fiancée. If you need any more information or
recommendations for your trip, feel free to ask!'
Comprobemos ahora cómo se guarda la memoria en el búfer para esta técnica.
print(conversation_sum_bufw.memory.buffer)
Producción:
System: The human is in Miami with their fiancée and wants to go shopping. The ai
suggests several shopping destinations, including Bal Harbour Shops, the Miami
Design District, Aventura Mall, and Wynwood. Human: Can you tell me who I am with
in Miami? ai: You are in Miami with your fiancée. If you need any more information
or recommendations for your trip, feel free to ask!
Como podemos ver en el resultado anterior, la memoria intermedia tiene una combinación de resumen de conversaciones distantes anteriores junto con interacciones reales guardadas para las conversaciones más recientes.
ConversationSummaryBufferMemory requiere ajustes adicionales para decidir qué resumir y qué conservar en el búfer, pero proporciona una gran flexibilidad para retener interacciones distantes y al mismo tiempo mantener las interacciones recientes en su forma original y más detallada.
Memoria del gráfico de conocimiento de conversaciones: estructuración de la información para un contexto mejorado
En esta técnica, LangChain construye un mini gráfico de conocimiento de información conectada identificando entidades clave y sus relaciones, lo que ayuda al modelo a comprender y responder mejor a diferentes situaciones.
from langchain.chains.conversation.memory import ConversationKGMemory
from langchain.prompts.prompt import PromptTemplate
llm = ChatOpenAI(temperature=0, model="gpt-4", max_tokens=1000)
template = """The following is a friendly conversation between a human and an ai. The ai is talkative and provides lots of specific details from its context.
If the ai does not know the answer to a question, it truthfully says it does not know. The ai ONLY uses information contained in the "Relevant Information" section and does not hallucinate.
Relevant Information:
{history}
Conversation:
Human: {input}
ai:"""
prompt = PromptTemplate(
input_variables=("history", "input"), template=template
)
conversation_with_kg = ConversationChain(
llm=llm,
verbose=True,
prompt=prompt,
memory=ConversationKGMemory(llm=llm)
)
conversation_with_kg.predict(input="Hello, My name is Myra")
conversation_with_kg.predict(input="I am in Miami and need some assistance in booking hotels.")
conversation_with_kg.predict(input="I need hotel recommendations near Miami Beaches")
Como se ve en el código anterior, la función ConversationChain se pasa con un mensaje definido que le pide al LLM que se concentre solo en la información relevante para una consulta realizada y que no alucine.
import networkx as nx
import matplotlib.pyplot as plt
print(conversation_with_kg.memory.kg.get_triples())
Producción:
(('Myra', 'name', 'is'), ('Myra', 'Miami', 'is in'), ('Myra', 'booking hotels',
'needs assistance in'), ('Human', 'hotel recommendations near Miami Beaches',
'need'))
Como se puede ver en el resultado anterior, en la memoria se guardan las entidades clave y sus relaciones. Por tanto, la información estructurada se puede extraer muy fácilmente mediante esta técnica.
Memoria de entidad: captura de detalles clave para respuestas personalizadas
La memoria de entidad, como la memoria de Knowledge Graph, extrae detalles específicos de conversaciones, como nombres, objetos o lugares. Este método específico ayuda al modelo a responder a las preguntas de los usuarios con mayor precisión.
from langchain.chains.conversation.memory import ConversationEntityMemory
from langchain.chains.conversation.prompt import ENTITY_MEMORY_CONVERSATION_TEMPLATE
## The propmpt
print(ENTITY_MEMORY_CONVERSATION_TEMPLATE.template)
Producción:
'You are an assistant to a human, powered by a large language model trained by
OpenAI. \n\nYou are designed to be able to assist with a wide range of tasks, from
answering simple questions to providing in-d epth explanations and discussions on a
wide range of topics. As a language model, you are able to generate human-like text
based on the input you receive, allowing you to engage in natural-sounding convers
ations and provide responses that are coherent and relevant to the topic at hand.
\n\nYou are constantly learning and improving, and your capabilities are constantly
evolving. You are able to process and un derstand large amounts of text, and can use
this knowledge to provide accurate and informative responses to a wide range of
questions. You have access to some personalized information provided by the human
in the Context section below. Additionally, you are able to generate your own text
based on the input you receive, allowing you to engage in discussions and provide
explanations an
El resultado anterior muestra el mensaje dado al LLM. Veamos ahora cómo se puede implementar ConversationEntityMemory teniendo en cuenta la plantilla de solicitud anterior.
llm = ChatOpenAI(temperature=0, model="gpt-4o", max_tokens=200)
conversation = ConversationChain(
llm=llm,
verbose=True,
prompt=ENTITY_MEMORY_CONVERSATION_TEMPLATE,
memory=ConversationEntityMemory(llm=llm)
)
conversation.predict(input="Hello, My name is Myra")
conversation.predict(input="I am in Miami and need some assistance in booking hotels.")
conversation.predict(input="I need hotel recommendations near Miami Beaches")
from pprint import pprint
pprint(conversation.memory.entity_store)
Producción:
InMemoryEntityStore (store={"Myra': "Myra's name is Myra.", 'Miami': 'Miami is a
city where Myra is currently located and is seeking assistance in booking hotels.',
'Miami Beaches': 'Miami Beaches is a popul
Como se puede ver en el resultado anterior, todas las entidades relevantes están identificadas mapeadas con los detalles asociados como “'Miami es una ciudad donde Myra se encuentra actualmente y está buscando ayuda para reservar hoteles”. está asignado a la entidad “Miami”.
Conclusión
En los sistemas de recuperación-generación aumentada (RAG), la memoria conversacional es vital para mantener el contexto y mejorar la relevancia. También ayuda a personalizar las respuestas y manejar consultas de varios pasos. A diferencia del ingenuo RAG, que procesa cada consulta de forma independiente, la memoria conversacional crea una experiencia continua. Técnicas como la memoria intermedia de conversación almacenan historiales de interacción completos, pero pueden aumentar el uso de tokens. Por otro lado, la Memoria de resumen de conversaciones reduce el uso de tokens al resumir las interacciones pasadas.
La memoria de la ventana del búfer de conversación retiene solo una cantidad determinada de intercambios recientes, y la memoria del búfer de resumen de conversación combina conversaciones recientes con resúmenes de las más antiguas, equilibrando el contexto y la eficiencia. Los métodos más avanzados, como Conversation Knowledge Graph Memory, estructuran la información como entidades interconectadas, mientras que Entity Memory captura detalles específicos como nombres o ubicaciones para respuestas precisas. Juntas, estas técnicas permiten que los sistemas RAG ofrezcan interacciones contextualmente ricas y adaptables adaptadas a las necesidades del usuario.
Conclusiones clave
- La memoria conversacional permite a los sistemas RAG mantener el contexto, mejorando el flujo y la relevancia de las interacciones.
- La memoria intermedia de conversación, que almacena historiales de chat completos, es útil pero puede aumentar los costos de los tokens.
- La memoria de resumen de conversaciones reduce el uso de tokens al resumir las interacciones pasadas de manera efectiva.
- Las técnicas híbridas como la memoria intermedia de resumen de conversaciones optimizan la memoria combinando detalles recientes y el historial resumido.
- Las técnicas de memoria avanzadas, como Knowledge Graph y Entity Memory, mejoran la precisión al estructurar y orientar la información clave.
Preguntas frecuentes
R. La memoria conversacional ayuda a los sistemas RAG a recordar interacciones pasadas, lo que hace que las respuestas sean más relevantes y conscientes del contexto.
R. La memoria mejora la continuidad, la personalización y la relevancia en las conversaciones del chatbot, especialmente en interacciones complejas o de varios pasos.
R. La memoria intermedia de conversación guarda todas las interacciones, mientras que la memoria de resumen condensa conversaciones pasadas para ahorrar el uso de tokens.
R. Crea un mini gráfico de conocimiento de entidades clave y sus relaciones, lo que ayuda al chatbot a comprender mejor consultas complejas.
R. La memoria intermedia de resumen de conversaciones es ideal ya que combina interacciones recientes con resúmenes de las más antiguas para una retención eficiente del contexto.
Los medios que se muestran en este artículo no son propiedad de Analytics Vidhya y se utilizan a discreción del autor.