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

如何在不指定from_chain_type时为LangChain RetrievalQA使用自定义提示词

LangChain直接加载链时使用自定义提示词的解决方案

背景

LangChain加载检索问答链有两种方式:

  • 方式一:通过RetrievalQA.from_chain_type()快速指定链类型,优点是切换简单,但对链参数的控制灵活性不足
  • 方式二:先用load_qa_chain()加载链,再传入RetrievalQA实例,优点是能更灵活调整链参数,但官方文档未明确说明如何结合自定义提示词使用

两种方式的代码示例:

方式一(快速指定链类型)

qa = RetrievalQA.from_chain_type(llm=OpenAI(), chain_type="map_reduce", retriever=docsearch.as_retriever())

方式二(直接加载链)

qa_chain = load_qa_chain(OpenAI(temperature=0), chain_type="stuff")
qa = RetrievalQA(combine_documents_chain=qa_chain, retriever=docsearch.as_retriever())

问题描述

方式一中可以通过chain_type_kwargs参数传递自定义提示词,代码可正常运行:

qa = RetrievalQA.from_chain_type(llm=OpenAI(), chain_type="stuff", retriever=docsearch.as_retriever(), chain_type_kwargs=chain_type_kwargs)

但尝试给RetrievalQA直接传入chain_type_kwargs时会触发报错:

ValidationError: 1 validation error for RetrievalQA chain_type_kwargs extra fields not permitted (type=value_error.extra)

原因是load_qa_chain和RetrievalQA本身都不支持chain_type_kwargs参数。

解决方案

要在直接加载链的方式中使用自定义提示词,需将提示词参数直接传递给load_qa_chain,而非RetrievalQA。不同链类型对应不同的提示词参数,具体如下:

1. Stuff链示例

先定义自定义提示词,再加载链时传入:

from langchain.prompts import PromptTemplate

# 定义自定义提示词
custom_prompt = PromptTemplate(
    template="请根据以下文档内容回答问题:\n{context}\n问题:{question}\n回答:",
    input_variables=["context", "question"]
)

# 加载链时传入自定义提示词
qa_chain = load_qa_chain(
    OpenAI(temperature=0),
    chain_type="stuff",
    prompt=custom_prompt
)
qa = RetrievalQA(combine_documents_chain=qa_chain, retriever=docsearch.as_retriever())

2. Map-Reduce链示例

该链需要分别传入映射阶段和合并阶段的提示词:

# 定义映射阶段提示词
map_prompt = PromptTemplate(
    template="请总结以下文档内容,用于回答后续问题:\n{context}\n总结:",
    input_variables=["context"]
)

# 定义合并阶段提示词
combine_prompt = PromptTemplate(
    template="请根据以下各文档的总结回答问题:\n{summaries}\n问题:{question}\n回答:",
    input_variables=["summaries", "question"]
)

# 加载链时传入对应提示词
qa_chain = load_qa_chain(
    OpenAI(temperature=0),
    chain_type="map_reduce",
    map_prompt=map_prompt,
    combine_prompt=combine_prompt
)
qa = RetrievalQA(combine_documents_chain=qa_chain, retriever=docsearch.as_retriever())

3. Refine链示例

该链需要传入基础问题提示词和迭代优化提示词:

# 定义基础问题提示词
question_prompt = PromptTemplate(
    template="请根据以下文档内容回答问题:\n{context}\n问题:{question}\n初步回答:",
    input_variables=["context", "question"]
)

# 定义迭代优化提示词
refine_prompt = PromptTemplate(
    template="现有一个初步回答:{existing_answer}\n请结合以下新文档内容优化回答:\n{context}\n优化后的回答:",
    input_variables=["existing_answer", "context"]
)

# 加载链时传入对应提示词
qa_chain = load_qa_chain(
    OpenAI(temperature=0),
    chain_type="refine",
    question_prompt=question_prompt,
    refine_prompt=refine_prompt
)
qa = RetrievalQA(combine_documents_chain=qa_chain, retriever=docsearch.as_retriever())

通过这种方式,既能灵活调整链的参数,又能使用自定义提示词。

内容的提问来源于stack exchange,提问作者Stephen Strosko

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 01:13:24