LangChain 实战:Structured Chat ReAct 智能体原理与实现(对比 ZeroShot ReAct)

发布时间:2026/6/23 11:40:27
LangChain 实战:Structured Chat ReAct 智能体原理与实现(对比 ZeroShot ReAct) 一、什么是 Structured Chat ReActStructured Chat ReAct 是 LangChain 专门为生产级稳定工具调用设计的 ReAct 智能体。它的核心定位是强约束、结构化、低解析失败率让 LLM 严格按照固定格式进行推理与工具调用彻底解决自由文本输出带来的解析不稳定问题。与传统的自由文本思考不同Structured Chat ReAct 强制模型以标准化结构输出每一步决策全程可解析、可追踪、可稳定执行。二、Structured Chat ReAct 核心特点1. 强结构化输出全程可控模型不再输出自由文本形式的思考与动作而是严格遵循统一结构输出每一步动作都清晰、规范、无歧义。2. 基于聊天消息结构Chat Message使用 System / Human / AI 标准对话模板更符合当前主流对话模型的输入习惯指令遵循率更高。3. 工具调用稳定、鲁棒性强格式固定、解析明确大幅降低因模型输出乱码、多余文字、思考前缀导致的执行失败适合正式项目使用。4. 天然支持多参数复杂工具结构化设计使其可以轻松扩展到多参数、多类型工具场景扩展性远优于文本格式的智能体。三、Structured Chat ReAct 与 ZeroShot ReAct 核心区别很多开发者在初次使用 LangChain 时都会疑惑同样是 ReAct两者到底差在哪里这里用最直观的方式总结差异1. 输出格式不同ZeroShot ReAct基于自由文本通过Thought/Action/Action Input文本行输出依赖正则匹配提取内容容易出错。Structured Chat ReAct基于结构化输出格式严格统一每一步动作都规范可解析。2. 消息结构不同ZeroShot ReAct使用普通文本模板无明确对话角色区分。Structured Chat ReAct使用标准聊天模板System、Human、AI更适配对话模型。3. 解析稳定性不同ZeroShot ReAct解析依赖文本规则模型一旦乱输出就会失败。Structured Chat ReAct解析稳定可靠适合高要求的生产环境。4. 使用场景不同ZeroShot ReAct适合简单任务、快速验证、学习演示。Structured Chat ReAct适合正式项目、复杂工具链、高稳定性要求场景。四、Structured Chat ReAct 实现思路1. 模型选择优先选择指令遵循能力强、结构化输出稳定的模型避免使用会自动增加思考标签的模型保证格式纯净。2. 工具定义定义可被智能体调用的功能工具例如获取当前时间、数学计算、数据库查询、API 请求等并为每个工具提供清晰名称与描述。3. 构建结构化聊天提示词使用标准对话模板构建提示词明确告诉模型可用工具列表必须遵守的输出格式禁止输出多余内容如思考前缀、解释文字任务完成后的结束格式提示词的约束强度直接决定智能体稳定性。4. 创建 Structured Chat 智能体使用 LangChain 提供的专用构造函数将模型、工具、提示词三者绑定生成可直接执行的智能体。5. 执行与调度通过智能体执行器运行任务开启日志便于调试设置最大迭代次数避免死循环同时开启解析容错提升整体健壮性。执行过程中智能体会自动完成理解用户意图 → 选择工具 → 执行工具 → 整理结果 → 返回最终答案全程无需人工干预。五、实战效果总结在实际运行中Structured Chat ReAct 表现出明显优势指令遵循率极高工具调用步骤清晰透明几乎不会出现格式解析失败日志干净、易于调试扩展多工具时非常稳定对比传统 ZeroShot ReActStructured Chat ReAct 更像是工业级的智能体实现而前者更适合教学与快速验证。六、适用场景推荐需要稳定调用多种工具的 AI 助手多步骤逻辑推理、数据计算类任务对输出格式有强约束的系统生产环境中不允许频繁执行失败的场景基于本地模型部署的智能体系统代码实现123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107# -*- coding: utf-8 -*-importosfromdotenvimportload_dotenvfromlangchain.agentsimportAgentExecutor, create_structured_chat_agentfromlangchain_core.toolsimportToolfromlangchain_openaiimportChatOpenAIfromlangchain_core.promptsimportChatPromptTemplatefromdatetimeimportdatetimeimportreimportjson# 加载环境变量load_dotenv()# # 1. 配置 LLM# DEEPSEEK_API_KEY123# 替换为实际的 API KeyllmChatOpenAI(api_keyDEEPSEEK_API_KEY,base_urlhttp://192.168.0.100:8000/v1,# Deepseek 的 API 基础地址modelQwen3-235B-A22B,# Deepseek 对话模型可选deepseek-chat-pro 等高级模型temperature0.1,# 温度参数0-1越低越稳定max_tokens1024# 最大生成 tokens)# # 2. 工具定义# defget_current_time(input_str:str)-str:获取当前系统时间returnf当前时间{datetime.now().strftime(%Y年%m月%d日 %H:%M:%S)}defcalculate_math_expression(expression:str)-str:安全计算数学表达式try:ifnotre.match(r^[\d\-*/().\s]$, expression):return表达式包含非法字符resulteval(expression, {__builtins__: {}}, {})returnf计算结果{result}except:return计算失败tools[Tool(nameGetCurrentTime,funcget_current_time,description获取当前系统时间输入为空字符串),Tool(nameCalculateMathExpression,funccalculate_math_expression,description计算数学表达式)]# # 3. 【关键修复】超强约束 Prompt禁止输出 标签# promptChatPromptTemplate.from_messages([(system,你必须只输出纯 JSON**绝对禁止输出 、思考过程、解释文字、中文说明等任何内容**。可用工具{tools}工具名称{tool_names}【输出格式 严格遵守】{{action:工具名,action_input:输入内容}}完成任务后输出{{action:Final Answer,action_input:直接回答结果}}禁止任何多余文字只输出 JSON),(human,{input}),(ai,{agent_scratchpad}),])# # 4. 创建 Agent# agentcreate_structured_chat_agent(llm, tools, prompt)agent_executorAgentExecutor(agentagent,toolstools,verboseTrue,handle_parsing_errorsTrue,# 容错解析错误max_iterations3,)# # 5. 测试# if__name____main__:print( 任务1获取当前时间)result1agent_executor.invoke({input:现在几点了只告诉我结果})print(✅ 最终答案:, result1[output])print(\n*60\n)print( 任务2数学计算)result2agent_executor.invoke({input:计算 100*(2515)/4 - 80 等于多少})print(✅ 最终答案:, result2[output])注意有的大模型不理解json的输出会报错要选择合适的大模型结果输出 任务1获取当前时间 Entering new AgentExecutor chain...{action:GetCurrentTime,action_input:}当前时间2026年04月09日 11:05:05{action:Final Answer,action_input:现在是2026年04月09日 11:05:05} Finished chain.