引言
在许多问答应用程序中,向用户显示生成答案所用的来源非常重要。这不仅能提升用户的信任度,还能帮助他们理解答案的背景。本文将介绍如何在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)
常见问题和解决方案
-
**无法访问特定API服务:**在某些地区,访问某些API可能受到限制。解决方案是使用API代理服务,例如配置用户代理或使用VPN。
-
**性能优化:**为了提高检索和生成速度,可以考虑缓存常见问答对或优化向量搜索参数。
总结和进一步学习资源
本文介绍了如何通过LangChain实现返回信息来源功能,并提供了相应的代码示例。对于希望加深了解的开发者,推荐学习LangChain文档以及相关的API使用指南。
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力! ---END---