打造智能对话体验:深入探讨Conversational RAG

124 阅读2分钟
# 打造智能对话体验:深入探讨Conversational RAG

## 引言

在现代的问答应用中,为用户提供顺畅的对话体验越来越重要。Conversational RAG(Retrieval-Augmented Generation)技术通过结合检索和生成模型,帮助应用程序记忆上下文,增强对话的智能化处理能力。本篇文章将为您详细介绍如何使用链和代理来实现对话中的历史消息处理。

## 主要内容

### 1. 基础设置

本篇指南假设您已熟悉以下概念:聊天历史、聊天模型、嵌入、向量存储、检索增强生成、工具和代理。我们将使用OpenAI的嵌入和Chroma向量存储。

```python
import os
import getpass

# 环境变量设置
if not os.environ.get("OPENAI_API_KEY"):
    os.environ["OPENAI_API_KEY"] = getpass.getpass()

2. 使用链处理聊天历史

在这里,我们首先创建一个链来处理简单的问答任务,并逐步添加历史消息处理能力。

a. 创建检索链

我们使用create_retrieval_chaincreate_stuff_documents_chain方法进行初步设置:

from langchain.chains import create_retrieval_chain, create_stuff_documents_chain
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(model="gpt-3.5-turbo")  # 使用API代理服务提高访问稳定性

# 创建QA链
question_answer_chain = create_stuff_documents_chain(llm, prompt)
rag_chain = create_retrieval_chain(retriever, question_answer_chain)

b. 添加历史消息支持

通过更新提示和添加历史感知检索器,我们能让系统理解对话上下文:

from langchain.chains import create_history_aware_retriever

contextualize_q_prompt = ChatPromptTemplate.from_messages([...])
history_aware_retriever = create_history_aware_retriever(
    llm, retriever, contextualize_q_prompt
)

rag_chain = create_retrieval_chain(history_aware_retriever, question_answer_chain)

3. 使用代理增强处理灵活性

代理可以根据输入决定是否进行检索,提升系统的灵活性。

from langchain.tools.retriever import create_retriever_tool

tool = create_retriever_tool(
    retriever,
    "blog_post_retriever",
    "Searches and returns excerpts from the blog post."
)

代码示例

通过以下代码,我们可以构建一个完整的对话应用,处理任务分解相关的问题:

from langchain_community.document_loaders import WebBaseLoader

loader = WebBaseLoader(
    web_paths=("https://lilianweng.github.io/posts/2023-06-23-agent/",),
    bs_kwargs=dict(parse_only=bs4.SoupStrainer(class_=("post-content", "post-title", "post-header")))
)
docs = loader.load()

常见问题和解决方案

问题:如何确保对话上下文的一致性?

解决方案:使用RunnableWithMessageHistory来自动管理会话历史,确保对话的一致性和完整性。

from langchain_core.runnables.history import RunnableWithMessageHistory

conversational_rag_chain = RunnableWithMessageHistory(
    rag_chain,
    get_session_history,
    input_messages_key="input",
    history_messages_key="chat_history",
    output_messages_key="answer",
)

总结和进一步学习资源

这篇文章介绍了如何构建一个基础的Conversational RAG应用。您可以通过以下资源深入学习不同的检索方法和代理实现:

参考资料

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

---END---