# 构建一个智能会话助手:从基础到进阶
## 引言
在现代应用中,聊天机器人已经成为用户交互的重要组成部分。而基于大型语言模型(LLM)的聊天机器人,凭借其强大的自然语言理解能力,可以模拟真实的人类对话。本篇文章将带您一步步构建一个能够进行对话并记住先前交流内容的聊天机器人。
## 主要内容
### 1. 环境设置
为了方便动手实验,本指南推荐使用Jupyter Notebook。通过这种互动环境,您可以更好地理解代码的工作原理。如需安装Jupyter Notebook,可参考相关[安装指南](https://jupyter.org/install)。
#### 安装LangChain
LangChain是我们构建聊天机器人的核心工具。您可以通过以下命令安装:
```bash
pip install langchain
# 或使用conda
conda install langchain -c conda-forge
2. 构建聊天机器人
选择语言模型
LangChain支持多种语言模型,以下是使用OpenAI的示例:
import getpass
import os
from langchain_openai import ChatOpenAI
os.environ["OPENAI_API_KEY"] = getpass.getpass() # 输入您的API密钥
model = ChatOpenAI(model="gpt-3.5-turbo")
实现对话功能
模型本身没有状态概念,我们需要传递整个对话历史:
from langchain_core.messages import HumanMessage, AIMessage
response = model.invoke(
[
HumanMessage(content="Hi! I'm Bob"),
AIMessage(content="Hello Bob! How can I assist you today?"),
HumanMessage(content="What's my name?"),
]
)
print(response.content) # 得到正确的回复:"Your name is Bob. How can I help you, Bob?"
3. 管理聊天历史
通过封装聊天历史,可以使聊天机器人具有记忆功能:
from langchain_core.chat_history import InMemoryChatMessageHistory
from langchain_core.runnables.history import RunnableWithMessageHistory
store = {}
def get_session_history(session_id: str):
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": "abc2"}}
response = with_message_history.invoke(
[HumanMessage(content="Hi! I'm Bob")],
config=config,
)
print(response.content) # 输出: 'Hi Bob! How can I assist you today?'
4. 添加Prompt模板
通过Prompt模板,我们可以将用户输入转化为更适合模型理解的格式:
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
prompt = ChatPromptTemplate.from_messages(
[
("system", "You are a helpful assistant. Answer all questions to the best of your ability."),
MessagesPlaceholder(variable_name="messages"),
]
)
chain = prompt | model
5. 历史记录管理
管理聊天历史的长度确保不会超出模型的上下文窗口:
from langchain_core.messages import SystemMessage, trim_messages
trimmer = trim_messages(
max_tokens=65,
strategy="last",
token_counter=model,
include_system=True,
)
messages = [
SystemMessage(content="you're a good assistant"),
HumanMessage(content="hi! I'm bob"),
AIMessage(content="hi!"),
]
trimmed_messages = trimmer.invoke(messages)
6. 实现流式响应
通过流式传输,每次生成一个token时立即响应用户,提升用户体验:
config = {"configurable": {"session_id": "abc15"}}
for r in with_message_history.stream(
{
"messages": [HumanMessage(content="hi! I'm todd. tell me a joke")],
"language": "English",
},
config=config,
):
print(r.content, end="")
常见问题和解决方案
- 模型不能记住信息: 确保在调用模型时包含完整的对话历史。
- 消息历史过长: 使用trim_messages函数来管理消息的大小。
总结和进一步学习资源
通过本文中的步骤,您已经成功构建了一个基础版的智能会话助手。接下来,您可以探索更复杂的聊天机器人功能,比如开放领域问答、对话式RAG等。
参考资料
- LangChain Documentation
- Jupyter Notebook Documentation
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---