如何利用Langchain Conversational Retrieval Agent生成含参考来源的最终答案
使用Langchain Conversational Retrieval Agent生成带参考来源的答案
核心思路
要实现带参考来源的输出,关键是让工具本身生成包含答案+来源的结果,同时明确引导Agent完整保留这些来源信息,而非依赖Agent的格式设置。
具体实现步骤
1. 构建带来源输出的QA链
直接用create_qa_with_sources_chain创建原生支持输出答案和对应来源的链,这个链会返回包含answer和sources字段的结构化结果:
from langchain.chains.qa_with_sources import create_qa_with_sources_chain from langchain.chat_models import ChatOpenAI llm = ChatOpenAI(temperature=0) qa_chain = create_qa_with_sources_chain(llm)
2. 将QA链包装为Agent可调用的工具
把上述QA链封装成工具,重点在工具描述里明确告知Agent:该工具返回的结果包含答案和来源,必须完整整合到最终回复中:
from langchain.tools import Tool qa_tool = Tool( name="QA_with_sources", func=lambda query: qa_chain({ "input_documents": retriever.get_relevant_documents(query), "question": query }), description="用于回答问题,返回结果包含答案内容和对应的参考来源,必须完整保留来源信息返回给用户" )
3. 初始化Conversational Retrieval Agent
初始化Agent时传入自定义的QA工具,同时用对话记忆维护上下文:
from langchain.agents import initialize_agent, AgentType from langchain.memory import ConversationBufferMemory memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True) agent = initialize_agent( [qa_tool], llm, agent=AgentType.CHAT_CONVERSATIONAL_REACT_DESCRIPTION, memory=memory, verbose=True )
4. 调用Agent获取带来源的答案
直接调用Agent,结果会自然包含答案和对应的参考来源:
result = agent.run("你的具体问题") print(result)
关键注意事项
- 避免直接用检索器当工具:检索器仅返回原始文档,Agent不会自动处理成带来源的结构化答案,必须先通过QA链加工。
- 工具描述要精准:必须在description里明确要求Agent保留来源信息,否则它可能只提取答案忽略来源。
- 自定义提示词(可选):如果默认提示词效果不佳,可修改Agent的提示模板,在最终回复要求里强制加上“请在答案末尾列出所有参考来源”。
内容的提问来源于stack exchange,提问作者Elijahol Wang
相关产品推荐
相关产品推荐

