You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 05:43:15