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

120 阅读2分钟

引言

在许多问答应用程序中,向用户显示生成答案所用的来源非常重要。这不仅能提升用户的信任度,还能帮助他们理解答案的背景。本文将介绍如何在RAG(检索-生成)应用中实现这一功能,并展示如何将来源结构化地嵌入到模型响应中。

主要内容

1. 使用 create_retrieval_chain

LangChain中内置的 create_retrieval_chain 可以轻松实现返回信息来源的功能。此方法在检索文档后直接返回相应的来源,特别适合快速集成。

2. 自定义LCEL实现

为了更好地理解原理,我们还将展示如何使用简单的LCEL(LangChain Execution Language)实现类似功能,通过从头构建一个包含所有步骤的字典并生成响应。

代码示例

import bs4
from langchain.chains import create_retrieval_chain
from langchain_chroma import Chroma
from langchain_community.document_loaders import WebBaseLoader
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import OpenAIEmbeddings

# 使用API代理服务提高访问稳定性
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()

vectorstore = Chroma.from_documents(documents=docs, embedding=OpenAIEmbeddings())
retriever = vectorstore.as_retriever()

prompt = ChatPromptTemplate.from_messages([("system", "You are an assistant..."),
                                           ("human", "{input}")])

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

result = rag_chain.invoke({"input": "What is Task Decomposition?"})
print(result)

常见问题和解决方案

  1. **无法访问特定API服务:**在某些地区,访问某些API可能受到限制。解决方案是使用API代理服务,例如配置用户代理或使用VPN。

  2. **性能优化:**为了提高检索和生成速度,可以考虑缓存常见问答对或优化向量搜索参数。

总结和进一步学习资源

本文介绍了如何通过LangChain实现返回信息来源功能,并提供了相应的代码示例。对于希望加深了解的开发者,推荐学习LangChain文档以及相关的API使用指南。

参考资料

  1. LangChain Documentation
  2. Chroma Documentation

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