Langchain中load_summarize_chain指定map_reduce/refine时自定义Prompt报错求助
问题原因及解决方法
核心问题
当使用map_reduce或refine类型的load_summarize_chain时,不能直接通过prompt参数传入自定义模板。这是因为这两种链类型涉及多阶段处理,需要多个不同作用的prompt,而非单一prompt——而stuff模式是单阶段处理,所以可以用prompt参数。
你遇到的ValidationError就是因为RefineDocumentsChain(对应refine链类型)不接受prompt这个额外参数,它需要的是initial_prompt(生成初始摘要的模板)和refine_prompt(迭代优化摘要的模板)。
解决方法
1. Refine链类型的正确写法
需要分别定义初始摘要模板和优化模板,然后通过对应的参数传入:
llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0.7) # 初始摘要模板 initial_prompt = PromptTemplate( template="请总结以下文本:\n\n{text}", input_variables=["text"] ) # 迭代优化模板 refine_prompt = PromptTemplate( template="现有摘要:\n\n{existing_answer}\n\n请结合以下新文本优化这个摘要:\n\n{text}\n\n优化后的摘要:", input_variables=["existing_answer", "text"] ) # 创建refine类型的链 chain = load_summarize_chain( llm, chain_type="refine", verbose=True, initial_prompt=initial_prompt, refine_prompt=refine_prompt )
2. MapReduce链类型的正确写法
MapReduce需要两个模板:map_prompt(处理单段文档生成子摘要)和combine_prompt(合并所有子摘要为最终结果):
llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0.7) # Map阶段模板:处理单份文档 map_prompt = PromptTemplate( template="请总结这段文本:\n\n{text}\n\n子摘要:", input_variables=["text"] ) # Combine阶段模板:合并所有子摘要 combine_prompt = PromptTemplate( template="请将以下多个子摘要合并成一份连贯的最终摘要:\n\n{text}\n\n最终摘要:", input_variables=["text"] ) # 创建map_reduce类型的链 chain = load_summarize_chain( llm, chain_type="map_reduce", verbose=True, map_prompt=map_prompt, combine_prompt=combine_prompt )
关键说明
stuff模式:单阶段把所有文档塞进prompt,所以只用prompt参数。map_reduce模式:分两步,先给每个文档生成子摘要(map),再合并所有子摘要(combine),需要两个对应参数。refine模式:先生成初始摘要,再逐份文档迭代优化,需要初始和优化两个模板参数。
内容的提问来源于stack exchange,提问作者Mick
相关产品推荐
相关产品推荐

