如何让您的RAG应用程序返回来源信息

75 阅读2分钟
# 如何让您的RAG应用程序返回来源信息

在问答应用程序中,向用户展示用于生成答案的来源信息是非常重要的。本文将介绍如何让您的RAG(Retrieval-Augmented Generation)应用程序返回答案来源。我们将基于[Lilian Weng在RAG教程中的博客文章](https://lilianweng.github.io/posts/2023-06-23-agent/)构建的问答应用进行探讨。

## 引言

在许多问答应用中,透明性是用户体验的关键之一。提供生成答案所用来源的信息不仅可以增加答案的可信度,还能让用户更好地理解系统的工作原理。本篇文章旨在介绍两种实现方法,让您的RAG应用程序能够返回来源信息。

## 主要内容

### 使用内置的`create_retrieval_chain`

使用`create_retrieval_chain`是最简单的方法,该方法默认会返回来源信息。

### 自定义LCEL实现

通过简单的LCEL(Language-Conditioned Embedding Layer)实现,我们可以更清晰地展示其工作原理。

## 代码示例

以下是一个使用`create_retrieval_chain`的完整代码示例:

```python
import bs4
from langchain.chains import create_retrieval_chain
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain_chroma import Chroma
from langchain_community.document_loaders import WebBaseLoader
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter

# 1. 加载、分块并索引博客内容以创建检索器
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()

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()

# 2. 将检索器整合到问答链中
system_prompt = (
    "You are an assistant for question-answering tasks. "
    "Use the following pieces of retrieved context to answer "
    "the question. If you don't know the answer, say that you "
    "don't know. Use three sentences maximum and keep the "
    "answer concise."
    "\n\n"
    "{context}"
)

prompt = ChatPromptTemplate.from_messages(
    [
        ("system", system_prompt),
        ("human", "{input}"),
    ]
)

question_answer_chain = create_stuff_documents_chain(llm, prompt)
rag_chain = create_retrieval_chain(retriever, question_answer_chain)

# 使用API代理服务提高访问稳定性
result = rag_chain.invoke({"input": "What is Task Decomposition?"})

print(result)

结果解释

result将会是一个字典,包含"input"、"context"和"answer"键,其中"context"包含LLM用来生成答案的来源。

常见问题和解决方案

网络访问问题

由于某些地区的网络限制,开发者可能需要使用API代理服务以提高访问稳定性。

源信息的准确性

确保检索的文档信息准确并能够合理地代表答案来源。

总结和进一步学习资源

通过本文介绍的方法,您可以让您的RAG应用程序返回来源信息,从而增加问答系统的透明性和可信度。想要深入了解,请参考以下资源:

参考资料

  • LangChain官方文档
  • Lilian Weng的博客关于LLM自主代理的文章

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


---END---