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

Langchain中ConversationalRetrievalChain自定义ChatPromptTemplate问题排查

ConversationalRetrievalChain 自定义多变量Prompt解决方案

核心问题分析

你遇到的报错本质是自定义变量未被正确注入到链的上下文流程中——ConversationalRetrievalChain的combine_docs_chain默认只传递context、question、chat_history这类内置变量,新增的number等自定义变量需要手动配置传递路径。


解决方案步骤

1. 调用链时传入自定义变量

在调用链的__call__方法时,把自定义变量和question、chat_history一起传入输入字典:

from langchain.chains import ConversationalRetrievalChain
from langchain.prompts import ChatPromptTemplate
from langchain.chat_models import ChatOpenAI

# 定义包含多变量的自定义Prompt
custom_prompt = ChatPromptTemplate.from_messages([
    ("system", "基于上下文{context}和指定数字{number},回答用户问题。"),
    ("human", "{question}")
])

# 初始化检索链,将自定义Prompt传入combine_docs_chain参数
chain = ConversationalRetrievalChain.from_llm(
    llm=ChatOpenAI(temperature=0),
    retriever=your_retriever_instance,  # 替换为你的检索器实例
    combine_docs_chain_kwargs={"prompt": custom_prompt}
)

# 调用链时传入自定义变量number
response = chain({
    "question": "结合上下文和数字,分析XX问题",
    "chat_history": [],  # 历史对话,无则传空列表
    "number": 10  # 自定义变量值
})

2. 固定变量可提前绑定到Prompt

如果number这类变量是固定值,可通过partial方法直接绑定到Prompt,无需每次调用都传入:

# 绑定固定number值到Prompt
custom_prompt = ChatPromptTemplate.from_messages([
    ("system", "基于上下文{context}和指定数字{number},回答用户问题。"),
    ("human", "{question}")
]).partial(number=10)

# 后续初始化和调用链时,无需再传入number参数

3. 澄清condense_question_prompt的作用

condense_question_prompt仅用于将历史对话与当前问题浓缩为独立问题,它的作用域仅限于问题浓缩环节,不负责传递自定义变量到combine_docs_chain。之前用它没解决问题,是因为它本来就不处理自定义变量的传递。

4. 常见错误排查点

  • 检查Prompt中的变量名与传入的参数名是否完全一致(比如不要出现{num}和number不匹配的情况)
  • 确认自定义变量已包含在调用链时的输入字典中
  • 若使用了自定义的CombineDocsChain子类,需确保它能接收并传递自定义变量到LLM环节

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 13:07:21