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
相关产品推荐
相关产品推荐

