支持私有化部署
AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


LangChain ReAct 中文解析器实现

发布日期:2025-06-19 22:23:39 浏览次数: 1547
作者:青雲老哥

微信搜一搜,关注“青雲老哥”

推荐语

解决LangChain中文ReAct解析痛点,专为通义千问等中文大模型打造的解析器来了!

核心内容:
1. LangChain原生ReAct解析器对中文支持不足的痛点分析
2. 中英文兼容的QwenReActOutputParser设计思路与架构
3. 关键字映射与解析逻辑实现方案

杨芳贤
53AI创始人/腾讯云(TVP)最具价值专家

背景与痛点

在用 LangChainJS 开发 Agent 时,ReAct(Reasoning and Acting)模式是最主流的推理与工具调用范式。它要求大模型输出结构化的推理链条,例如:

Thought: 我需要查找相关信息
Action: search
Action Input: 搜索内容
Observation: 搜索结果...
Final Answer: 基于搜索结果的回答

但实际开发中,发现 LangChain 原生的 ReActSingleInputOutputParser 只支持英文关键字,无法正确解析通义千问等中文大模型的输出。比如,模型输出“思考”、“动作”、“最终答案”等中文字段时,原生解析器会直接报错,导致 ReAct 推理链断裂,工具调用失败。

现有方案的不足

网上查阅资料后发现,LangChain 社区对中文模型的 ReAct 兼容性支持非常有限。大部分方案要么要求模型输出英文格式,要么只能降级为简单对话,无法实现完整的“思考-行动-观察-再思考-最终答案”推理链。

解决方案:QwenReActOutputParser

为了解决这个痛点,我开发了 langchain-react-chinese-parser,核心是自定义的 QwenReActOutputParser,专门为通义千问等中文大模型适配 ReAct 解析。

设计思路

  • 中英文关键字兼容:支持“思考/动作/最终答案”等中英文混合关键字
  • 格式容错:智能识别各种输出变体,提升解析鲁棒性
  • 错误提示:解析失败时给出清晰的格式指导,提升开发体验
  • 工程无侵入:无需修改 LangChain 核心代码,直接集成即可

核心架构


┌─────────────────┐    ┌──────────────────┐    ┌─────────────────┐
│   用户输入      │───▶│  QwenReActAgent  │───▶│   工具执行      │
└─────────────────┘    └──────────────────┘    └─────────────────┘
                              │
                              ▼
                    ┌──────────────────┐
                    │ QwenReActOutput  │
                    │     Parser       │
                └──────────────────┘

关键字映射

const KEYWORD_MAPPINGS = {
  thought: ['思考''想法''thought''think'],
  action: ['动作''行动''action''act'],
  actionInput: ['动作输入''行动输入''action input''action_input'],
  finalAnswer: ['最终答案''答案''final answer''answer']
};

解析核心逻辑

export class QwenReActOutputParser extends BaseOutputParser<AgentAction | AgentFinish> {
async parse(text: string): Promise<AgentAction | AgentFinish> {
    // 1. 预处理文本
    const cleanedText = this.preprocessText(text);

    // 2. 检查是否有最终答案
    if (this.containsFinalAnswer(cleanedText)) {
      returnthis.parseFinalAnswer(cleanedText);
    }

    // 3. 动作解析
    const actionMatch = this.parseAction(cleanedText);
    if (actionMatch) {
      return actionMatch;
    }

    // 4. 错误处理
    thrownew OutputParserException(
      `无法解析输出格式。请使用以下格式:
      思考: [你的思考过程]
      动作: [工具名称]
      动作输入: [工具参数]`

    );
  }
}

工程集成

好的,以下是参考 langchain-react-chinese-parser/README.md 的「工程集成」部分,结合你的项目背景,整理出的中文技术分享文章片段,可直接用于博客或社区发文:


工程集成

langchain-react-chinese-parser 的设计目标就是让工程集成变得极其简单,无论你是自定义 Agent 还是用官方 createReactAgent,都能一行代码切换为中文解析器,极大提升开发效率和兼容性。

方式一:自定义 Agent 类中集成

如果你有自定义的 Agent 类,只需用我们的解析器替换原生解析器即可:

import { createQwenParser, createAutoParser } from'langchain-react-chinese-parser';

exportclass QwenReActAgent {
private parser;

constructor(options = {}) {
    // 替换为通义千问专用解析器
    this.parser = createQwenParser({ debug: true, relaxedMode: true });
    // 或者用自动识别解析器
    // this.parser = createAutoParser({ debug: true });
  }

async invoke(input: string) {
    // ... 你的 Agent 逻辑 ...
    const rawOutput = awaitthis.llm.invoke(prompt);

    try {
      // 用中文解析器解析输出
      const parsed = awaitthis.parser.parse(rawOutput);

      if ('tool'in parsed) {
        // 工具调用
        returnawaitthis.executeTool(parsed);
      } else {
        // 最终答案
        return { output: parsed.returnValues.output };
      }
    } catch (error) {
      console.error('解析失败:', error.message);
      throw error;
    }
  }
}

方式二:官方 createReactAgent + 自定义解析器

如果你用的是 LangChain 官方的 createReactAgent,可以这样集成:

import { AgentExecutor, createReactAgent } from"langchain/agents";
import { pull } from"langchain/hub";
import { RunnableSequence } from"@langchain/core/runnables";
import { createAutoParser } from'langchain-react-chinese-parser';

// 1. 创建标准 ReAct Agent
const prompt = await pull("hwchase17/react");
const reactAgent = await createReactAgent({
  llm,
  tools,
  prompt,
  streamRunnable: true
});

// 2. 用中文解析器增强 Agent Chain
const parser = createAutoParser({ debug: true });
const enhancedAgent = RunnableSequence.from([
  reactAgent,
  parser
]);

// 3. 创建 Agent 执行器
const agentExecutor = new AgentExecutor({
  agent: enhancedAgent,
  tools,
  verbose: true,
  maxIterations: 10,
});

// 4. 现在完美支持中文 ReAct 输出!
const result = await agentExecutor.invoke({
  input: "请帮我查询北京今天的天气"
});

方式三:完全自定义 Chain(高级用法)

如果你需要更灵活的控制,可以自定义 Agent Chain,把中文解析器作为最后一步:

import { RunnablePassthrough, RunnableSequence } from"@langchain/core/runnables";
import { formatLogToString } from"langchain/agents";
import { createAutoParser } from'langchain-react-chinese-parser';

const customAgentChain = RunnableSequence.from([
  RunnablePassthrough.assign({
    agent_scratchpad: (input) => formatLogToString(input.intermediate_steps || [])
  }),
  prompt,
  llm,
  createAutoParser({ debug: true })
]);

const agentExecutor = new AgentExecutor({
  agent: customAgentChain,
  tools,
  verbose: true
});

升级现有项目:零侵入、无痛切换

如果你已经有自定义 Agent,只需替换解析器创建方式即可,无需改动其他业务逻辑:

// 原来
this.parser = new ReActSingleInputOutputParser();

// 现在
this.parser = createQwenParser({ debug: true, relaxedMode: true });
// 或
this.parser = createAutoParser({ debug: true });

实际效果

  • ✅ 支持通义千问、ChatGLM、百川等主流中文大模型
  • ✅ 解析成功率大幅提升,ReAct 推理链完整闭环
  • ✅ 兼容中英文混合、格式变体,极大提升开发体验
  • ✅ 工具调用、代码助手、数据分析等场景均可无缝集成

优势总结

  • 🚀 一行代码集成,开箱即用
  • 🔧 兼容所有 LangChain Agent 架构
  • 🐛 解析成功率大幅提升,支持多种中文大模型
  • 📈 现有项目零侵入升级,业务逻辑完全复用

总结

QwenReActOutputParser 已在实际项目中验证有效。如果你也遇到类似问题,欢迎试用 [langchain-react-chinese-parser]。

53AI,企业落地大模型首选服务商

产品:场景落地咨询+大模型应用平台+行业解决方案

承诺:免费场景POC验证,效果验证后签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

添加专属顾问

回到顶部

加载中...

扫码咨询