如何仅流式输出LangChain QAMapReduceChain的最终结果?
解决Langchain MapReduceChain流式输出仅返回最终结果的问题
问题核心是loadQAMapReduceChain默认会对Map和Reduce阶段的LLM都应用流式配置,导致回调捕获到所有中间步骤的生成token。要只输出最终Reduce阶段的结果,需要给Map和Reduce阶段的LLM分别配置,仅对Reduce阶段开启流式并绑定回调。
具体实现步骤
- 拆分模型配置:分别定义Map阶段(关闭流式)和Reduce阶段(开启流式+绑定回调)的模型参数
// Map阶段模型:仅处理单文档摘要,不需要流式输出 const MAP_MODEL_CONFIG = { temperature: 0.5, modelName: "gpt-3.5-turbo-16k", maxTokens: 5000, verbose: false, maxConcurrency: 2, streaming: false, // 关键:关闭流式 }; // Reduce阶段模型:处理最终汇总,开启流式并绑定回调 const REDUCE_MODEL_CONFIG = { ...MAP_MODEL_CONFIG, streaming: true, // 开启流式 callbacks: [{ handleLLMNewToken(token: string) { updateResponse(token); // 仅捕获Reduce阶段的生成token }, }], };
- 创建带分阶段配置的MapReduceChain
通过loadQAMapReduceChain的mapLLM和reduceLLM参数,分别传入对应配置的LLM实例:
const { ChatOpenAI } = require("langchain/chat_models/openai"); const { loadQAMapReduceChain } = require("langchain/chains"); const mapLLM = new ChatOpenAI(MAP_MODEL_CONFIG); const reduceLLM = new ChatOpenAI(REDUCE_MODEL_CONFIG); const chain = loadQAMapReduceChain(mapLLM, { returnIntermediateSteps: true, reduceLLM: reduceLLM, // 指定Reduce阶段的LLM }); // 调用chain时无需再传全局回调 const chainResult = await chain.call({ input_documents: docs, question: templateString, });
原理说明
- Map阶段:关闭流式后,LLM会一次性返回单文档的摘要结果,不会触发
handleLLMNewToken回调 - Reduce阶段:仅该阶段开启流式,回调只会捕获最终汇总时生成的token,实现仅输出最终结果的流式响应
内容的提问来源于stack exchange,提问作者Simon Sebastian Vollmer
相关产品推荐
相关产品推荐

