引言
在聊天机器人领域,记忆功能是其重要特点之一。它使得机器人能够利用先前对话的内容作为上下文进行交流。有多种方法可以实现状态管理,包括简单地将以前的信息放入模型提示中,以及生成长对话的摘要等复杂技巧。本篇文章将详细介绍这些技术及其实现方法。
主要内容
设置
首先,确保安装必要的软件包,并将OpenAI API密钥设置为环境变量OPENAI_API_KEY:
%pip install --upgrade --quiet langchain langchain-openai
# 设置环境变量OPENAI_API_KEY或通过.env文件加载:
import dotenv
dotenv.load_dotenv()
使用聊天模型
我们将使用LangChain中的ChatOpenAI模型进行示例:
from langchain_openai import ChatOpenAI
chat = ChatOpenAI(model="gpt-3.5-turbo-0125")
消息传递
最简单的记忆形式是将历史消息传递给模型。下面是一个简单的例子:
from langchain_core.prompts import ChatPromptTemplate
prompt = ChatPromptTemplate.from_messages(
[
("system", "You are a helpful assistant. Answer all questions to the best of your ability."),
("placeholder", "{messages}"),
]
)
chain = prompt | chat
ai_msg = chain.invoke(
{
"messages": [
("human", "Translate this sentence from English to French: I love programming."),
("ai", "J'adore la programmation."),
("human", "What did you just say?"),
],
}
)
print(ai_msg.content)
这个方法可以直接将历史对话作为上下文传递给模型。
聊天记录管理
使用LangChain的ChatMessageHistory类可以更加方便地管理消息历史:
from langchain_community.chat_message_histories import ChatMessageHistory
history = ChatMessageHistory()
history.add_user_message("Translate this sentence from English to French: I love programming.")
history.add_ai_message("J'adore la programmation.")
自动历史管理
借助RunnableWithMessageHistory类,消息记录可以自动管理:
from langchain_core.runnables.history import RunnableWithMessageHistory
history_for_chain = ChatMessageHistory()
chain_with_message_history = RunnableWithMessageHistory(
chain,
lambda session_id: history_for_chain,
input_messages_key="input",
history_messages_key="chat_history",
)
代码示例
通过代码示例,我们可以看到如何使用RunnableWithMessageHistory进行上下文管理,确保每次调用都能利用整个对话历史:
chain_with_message_history.invoke(
{"input": "Translate this sentence from English to French: I love programming."},
{"configurable": {"session_id": "unused"}},
)
常见问题和解决方案
挑战:上下文窗口限制
大语言模型有上下文窗口限制,可能需要进行消息修剪。使用trim_messages可以减少传递给模型的历史信息数量。
from langchain_core.messages import trim_messages
trimmer = trim_messages(strategy="last", max_tokens=2, token_counter=len)
挑战:长对话总结
对于长对话,可以使用LLM生成对话摘要,并在每次调用前添加到对话历史中。
def summarize_messages(chain_input):
# 生成摘要并清除历史
...
总结和进一步学习资源
使用LangChain和其他工具,我们可以构建具有记忆功能的强大聊天机器人。为了继续学习,推荐以下资源:
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---