Langchain自定义Prompt时如何保留Sources字段?
问题原因及解决方法
核心原因分析
- 自定义Prompt破坏了链的输出结构:RetrievalQAWithSourcesChain默认的Prompt会引导LLM返回包含答案和来源的特定格式,自定义Prompt如果未遵循该逻辑,LLM不会输出sources相关内容,导致最终结果中sources字段为空。
- 错误混淆输入与输出变量:
final_answer和sources是链的输出变量,并非输入变量。直接在Prompt中引用这两个变量会导致链无法找到对应的输入键,触发ValueError。
具体解决步骤
1. 自定义Prompt需保留来源提取逻辑
要让LLM同时返回答案和来源,必须在Prompt里明确要求结构化输出,比如使用链默认兼容的SOURCES:标记格式,示例如下:
from langchain.prompts import PromptTemplate custom_prompt = PromptTemplate( template="""使用提供的上下文回答问题,最后务必用"SOURCES:"开头列出所有参考的来源。 上下文: {context} 问题:{question} 答案:""", input_variables=["context", "question"] )
这种格式和链默认的输出解析逻辑匹配,无需额外修改解析器,就能自动提取sources。
2. 正确初始化链并传入自定义Prompt
初始化RetrievalQAWithSourcesChain时,将自定义Prompt传入combine_documents_chain的prompt参数,示例:
from langchain.chains import RetrievalQAWithSourcesChain from langchain.llms import OpenAI chain = RetrievalQAWithSourcesChain.from_llm( llm=OpenAI(temperature=0), retriever=elastic_vector_search.as_retriever(), combine_documents_chain_kwargs={"prompt": custom_prompt} ) # 调用链 result = chain({"question": "你的问题内容"}) # 此时result会包含"answer"和"sources"字段
3. 验证文档metadata的source字段
确保ElasticVectorSearch中存储的文档metadata里包含source字段,链是从每个检索到的文档的metadata中提取source值的。如果metadata里没有这个字段,即使Prompt正确,最终sources也会为空。
内容的提问来源于stack exchange,提问作者Mee
相关产品推荐
相关产品推荐

