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

如何仅流式输出LangChain QAMapReduceChain的最终结果?

解决Langchain MapReduceChain流式输出仅返回最终结果的问题

问题核心是loadQAMapReduceChain默认会对Map和Reduce阶段的LLM都应用流式配置,导致回调捕获到所有中间步骤的生成token。要只输出最终Reduce阶段的结果,需要给Map和Reduce阶段的LLM分别配置,仅对Reduce阶段开启流式并绑定回调。

具体实现步骤

  1. 拆分模型配置:分别定义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
    },
  }],
};
  1. 创建带分阶段配置的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 00:17:10