# 从零开始构建一个记忆功能的AI聊天机器人
## 引言
在当前的数字化时代,聊天机器人已成为提升用户体验和自动化对话的重要工具。本文将介绍如何设计和实现一个基于大型语言模型(LLM)的聊天机器人,该机器人不仅能进行对话,还能记住之前的交互。
## 主要内容
### 熟悉聊天模型和聊天历史
构建一个有效的聊天机器人首先需要了解聊天模型、提示模板以及如何管理聊天历史。这些概念帮助我们处理和存储对话信息,使机器人具备上下文记忆能力。
### 设置开发环境
我们推荐使用Jupyter Notebook,因为它提供了一个交互式环境,便于我们在实践中学习和测试。若您尚未安装,可参考[安装指南](https://jupyter.org/install)进行安装。
### 安装LangChain
LangChain是一款方便处理LLM应用的库,可通过以下方式安装:
使用Pip:
```shell
pip install langchain
使用Conda:
conda install langchain -c conda-forge
配置LangSmith进行链调用追踪
为了追踪和调试复杂的LLM调用链,我们建议使用LangSmith。请确保设置环境变量以启用追踪:
import getpass
import os
os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_API_KEY"] = getpass.getpass()
使用语言模型
LangChain支持多种语言模型,以下为OpenAI模型的设置示例:
import getpass
import os
os.environ["OPENAI_API_KEY"] = getpass.getpass()
from langchain_openai import ChatOpenAI
model = ChatOpenAI(model="gpt-3.5-turbo")
实现聊天机器人
我们使用LangChain的RunnableWithMessageHistory来处理聊天历史,使机器人记住之前的对话。
from langchain_core.chat_history import (
BaseChatMessageHistory,
InMemoryChatMessageHistory,
)
from langchain_core.runnables.history import RunnableWithMessageHistory
store = {}
def get_session_history(session_id: str) -> BaseChatMessageHistory:
if session_id not in store:
store[session_id] = InMemoryChatMessageHistory()
return store[session_id]
with_message_history = RunnableWithMessageHistory(model, get_session_history)
config = {"configurable": {"session_id": "user123"}}
response = with_message_history.invoke(
[HumanMessage(content="Hi! I'm Alice")],
config=config,
)
print(response.content)
用户可以通过更改session_id来区分不同的会话。
添加提示模板
使用提示模板可以优化与LLM的交互。例如,通过添加系统消息来传递指令。
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
prompt = ChatPromptTemplate.from_messages(
[
("system", "You are a helpful assistant."),
MessagesPlaceholder(variable_name="messages"),
]
)
chain = prompt | model
管理对话历史
管理对话历史至关重要,以防止消息超出LLM的上下文窗口。LangChain提供了trim_messages帮助函数来简化此过程。
代码示例
一个完整的实现包括初始化模型、设置聊天历史、添加提示模板以及管理历史的逻辑。
# 使用API代理服务提高访问稳定性
from langchain_core.messages import HumanMessage, AIMessage
from langchain_core.runnables import RunnablePassthrough
chain = (
RunnablePassthrough.assign(messages=itemgetter("messages") | trim_messages)
| prompt
| model
)
config = {"configurable": {"session_id": "abc20"}}
response = chain.invoke(
{"messages": [HumanMessage(content="Hello, I'm Todd.")], "language": "English"},
config=config,
)
print(response.content)
常见问题和解决方案
- 聊天内容不被记住: 确保会话ID一致,并正确保存和加载历史。
- 响应缓慢: 使用流式传输功能以提升用户体验。
总结和进一步学习资源
这篇文章介绍了如何构建一个基础的聊天机器人,您可以进一步学习以下高级主题:
参考资料
- LangChain文档: LangChain Documentation
- Jupyter Notebook安装指南: Jupyter Installation
- LangSmith设置和使用: LangSmith Guide
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---