本笔记本介绍了 LangChain 对记忆的理解方式。
记忆涉及在用户与语言模型的交互过程中保持状态的概念。用户与语言模型的交互被捕捉在 ChatMessage 的概念中,因此这涉及到对一系列聊天消息进行摄取、捕捉、转换和提取知识。有许多不同的方法可以实现这一点,每种方法都存在作为自己的记忆类型。
通常情况下,对于每种类型的记忆,有两种理解使用记忆的方法。一种是独立的函数,从一系列消息中提取信息,另一种是在链中使用这种类型的记忆的方法。
记忆可以返回多个信息(例如,最近的 N 条消息和所有先前消息的摘要)。返回的信息可以是字符串或消息列表。
在本笔记本中,我们将介绍最简单形式的记忆:"缓冲"记忆,它只涉及保持先前所有消息的缓冲区。我们将展示如何在这里使用模块化的实用函数,然后展示它如何在链中使用(返回字符串和消息列表两种形式)。
#ChatMessageHistory
在大多数(如果不是全部)记忆模块的核心实用类之一是 ChatMessageHistory 类。这是一个超轻量级的包装器,提供了保存人类消息、AI 消息以及获取所有消息的便捷方法。
如果您在链外管理记忆,则可以直接使用此类。
from langchain.memory import ChatMessageHistory
history = ChatMessageHistory()
history.add_user_message("hi!")
history.add_ai_message("whats up?")
history.messages
[HumanMessage(content='hi!', additional_kwargs={}, example=False),
AIMessage(content='whats up?', additional_kwargs={}, example=False)]
#ConversationBufferMemory
现在我们展示如何在链中使用这个简单的概念。首先展示 ConversationBufferMemory,它只是一个对 ChatMessageHistory 的包装器,用于提取消息到一个变量中。
我们可以首先将其提取为一个字符串。
from langchain.memory import ConversationBufferMemory
memory = ConversationBufferMemory()
memory.chat_memory.add_user_message("hi!")
memory.chat_memory.add_ai_message("whats up?")
memory.load_memory_variables({})
{'history': 'Human: hi!\nAI: whats up?'}
我们还可以将历史记录作为消息列表获取。
memory = ConversationBufferMemory(return_messages=True)
memory.chat_memory.add_user_message("hi!")
memory.chat_memory.add_ai_message("whats up?")
memory.load_memory_variables({})
{'history': [HumanMessage(content='hi!', additional_kwargs={}, example=False),
AIMessage(content='whats up?', additional_kwargs={}, example=False)]}
#在链中使用
最后,让我们看看如何在链中使用这个模块(设置 verbose=True 以便查看提示)。
from langchain.llms import OpenAI
from langchain.chains import ConversationChain
llm = OpenAI(temperature=0)
conversation = ConversationChain(
llm=llm,
verbose=True,
memory=ConversationBufferMemory()
)
conversation.predict(input="Hi there!")
进入新的 ConversationChain 链... 格式化后的提示: 以下是人类和 AI 之间友好对话的示例。AI 喜欢多说话并从上下文中提供许多具体细节。如果 AI 不知道问题的答案,它会真实地表示不知道。
当前对话:
人类:嗨!你好! AI:
完成链。
"嗨!很高兴见到你。今天我能帮你什么吗?"
conversation.predict(input="我很好!只是在和一个人工智能进行对话。")
进入新的 ConversationChain 链... 格式化后的提示: 以下是人类和 AI 之间友好对话的示例。AI 喜欢多说话并从上下文中提供许多具体细节。如果 AI 不知道问题的答案,它会真实地表示不知道。
当前对话: 人类:嗨!你好! AI:嗨!很高兴见到你。我今天能帮你做些什么吗?
完成链。
太棒了!和一个陌生人进行对话总是很愉快的。你想聊些什么呢?
conversation.predict(input="Tell me about yourself.")
进入新的 ConversationChain 链... 格式化后的提示: 以下是人类和 AI 之间友好对话的示例。AI 喜欢多说话并从上下文中提供许多具体细节。如果 AI 不知道问题的答案,它会真实地表示不知道。
当前对话: 人类:嗨!你好! AI:嗨!很高兴见到你。我今天能帮你做些什么吗? 人类:我过得很好!只是和一个 AI 进行对话。 AI:太好了!和新朋友交流总是很愉快的。你想聊些什么呢? 人类:告诉我关于你自己。
完成链。
" 当然!我是一个为帮助人们解决日常任务而创建的 AI。我被编程成能理解自然语言并提供有用的信息。我还在不断学习和更新我的知识库,以便能提供更准确和有帮助的答案。"
#保存消息记录
您可能经常需要保存消息,并在以后使用时加载它们。可以通过将消息首先转换为普通的 Python 字典来轻松实现此操作,然后将其保存(例如,保存为 JSON 格式),然后再加载。以下是一个示例:
import json
from langchain.memory import ChatMessageHistory
from langchain.schema import messages_from_dict, messages_to_dict
history = ChatMessageHistory()
history.add_user_message("hi!")
history.add_ai_message("whats up?")
dicts = messages_to_dict(history.messages)
dicts
[{'type': 'human',
'data': {'content': 'hi!', 'additional_kwargs': {}, 'example': False}},
{'type': 'ai',
'data': {'content': 'whats up?', 'additional_kwargs': {}, 'example': False}}]
new_messages = messages_from_dict(dicts)
new_messages
[HumanMessage(content='hi!', additional_kwargs={}, example=False),
AIMessage(content='whats up?', additional_kwargs={}, example=False)]
这就是入门的全部内容了!有许多不同类型的记忆可供使用,请查看我们的示例以了解所有内容。