微信扫码
添加专属顾问
我要投稿
解决LangChain中文ReAct解析痛点,专为通义千问等中文大模型打造的解析器来了! 核心内容: 1. LangChain原生ReAct解析器对中文支持不足的痛点分析 2. 中英文兼容的QwenReActOutputParser设计思路与架构 3. 关键字映射与解析逻辑实现方案
在用 LangChainJS 开发 Agent 时,ReAct(Reasoning and Acting)模式是最主流的推理与工具调用范式。它要求大模型输出结构化的推理链条,例如:
Thought: 我需要查找相关信息
Action: search
Action Input: 搜索内容
Observation: 搜索结果...
Final Answer: 基于搜索结果的回答
但实际开发中,发现 LangChain 原生的 ReActSingleInputOutputParser
只支持英文关键字,无法正确解析通义千问等中文大模型的输出。比如,模型输出“思考”、“动作”、“最终答案”等中文字段时,原生解析器会直接报错,导致 ReAct 推理链断裂,工具调用失败。
网上查阅资料后发现,LangChain 社区对中文模型的 ReAct 兼容性支持非常有限。大部分方案要么要求模型输出英文格式,要么只能降级为简单对话,无法实现完整的“思考-行动-观察-再思考-最终答案”推理链。
为了解决这个痛点,我开发了 langchain-react-chinese-parser,核心是自定义的 QwenReActOutputParser
,专门为通义千问等中文大模型适配 ReAct 解析。
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ 用户输入 │───▶│ 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 类,只需用我们的解析器替换原生解析器即可:
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;
}
}
}
如果你用的是 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: "请帮我查询北京今天的天气"
});
如果你需要更灵活的控制,可以自定义 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 });
QwenReActOutputParser
已在实际项目中验证有效。如果你也遇到类似问题,欢迎试用 [langchain-react-chinese-parser]。
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费场景POC验证,效果验证后签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2025-06-16
基于LangGraph多智能体框架的共享内存实现与探索
2025-06-16
一、LangGraph基础入门
2025-06-13
【LangChain 团队重磅实测报告】多智能体架构揭秘:谁才是性能之王?
2025-06-13
大模型_百炼:MCP让我焦虑
2025-06-11
前端学AI之LangChain.js入门教程:实现智能对话机器人
2025-06-08
Langfuse:重新定义LLM应用开发与运维的可观测性
2025-06-08
Langgraph实战--自定义embeding
2025-06-07
为 AI Agent 铺路:深度解析下一代应用的核心基建 LangGraph
2025-05-08
2025-04-18
2025-05-06
2025-05-28
2025-03-23
2025-04-13
2025-06-05
2025-04-18
2025-03-30
2025-05-19
2025-06-13
2025-05-21
2025-05-19
2025-05-08
2025-05-06
2025-04-22
2025-04-18
2025-03-22