AI开发-python-langchain框架(3-21-Structured Chat ReAct 智能体构建及对比 ZeroShot ReAct)
LangChain 实战:Structured Chat ReAct 智能体原理与实现(对比 ZeroShot ReAct)
一、什么是 Structured Chat ReAct?
二、Structured Chat ReAct 核心特点
1. 强结构化输出,全程可控
2. 基于聊天消息结构(Chat Message)
3. 工具调用稳定、鲁棒性强
4. 天然支持多参数复杂工具
三、Structured Chat ReAct 与 ZeroShot ReAct 核心区别
1. 输出格式不同
2. 消息结构不同
3. 解析稳定性不同
4. 使用场景不同
四、Structured Chat ReAct 实现思路
1. 模型选择
2. 工具定义
3. 构建结构化聊天提示词
4. 创建 Structured Chat 智能体
5. 执行与调度
五、实战效果总结
六、适用场景推荐
代码实现:
# -*- coding: utf-8 -*-
import os
from dotenv import load_dotenv
from langchain.agents import AgentExecutor, create_structured_chat_agent
from langchain_core.tools import Tool
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from datetime import datetime
import re
import json
# 加载环境变量
load_dotenv()
# ========================
# 1. 配置 LLM
# ========================
DEEPSEEK_API_KEY = "123" # 替换为实际的 API Key
llm = ChatOpenAI(
api_key=DEEPSEEK_API_KEY,
base_url="http://192.168.0.100:8000/v1", # Deepseek 的 API 基础地址
model="Qwen3-235B-A22B", # Deepseek 对话模型(可选:deepseek-chat-pro 等高级模型)
temperature=0.1, # 温度参数(0-1,越低越稳定)
max_tokens=1024 # 最大生成 tokens
)
# ========================
# 2. 工具定义
# ========================
def get_current_time(input_str: str = "") -> str:
"""获取当前系统时间"""
return f"当前时间:{datetime.now().strftime('%Y年%m月%d日 %H:%M:%S')}"
def calculate_math_expression(expression: str) -> str:
"""安全计算数学表达式"""
try:
if not re.match(r'^[\d+\-*/().\s]+$', expression):
return "表达式包含非法字符"
result = eval(expression, {"__builtins__": {}}, {})
return f"计算结果:{result}"
except:
return "计算失败"
tools = [
Tool(
name="GetCurrentTime",
func=get_current_time,
description="获取当前系统时间,输入为空字符串"
),
Tool(
name="CalculateMathExpression",
func=calculate_math_expression,
description="计算数学表达式"
)
]
# ========================
# 3. 【关键修复】超强约束 Prompt,禁止输出 标签
# ========================
prompt = ChatPromptTemplate.from_messages([
("system", """
你必须只输出纯 JSON,**绝对禁止输出 、思考过程、解释文字、中文说明等任何内容**。
可用工具:
{tools}
工具名称:
{tool_names}
【输出格式 严格遵守】
{{"action":"工具名","action_input":"输入内容"}}
完成任务后输出:
{{"action":"Final Answer","action_input":"直接回答结果"}}
禁止任何多余文字!只输出 JSON!
"""),
("human", "{input}"),
("ai", "{agent_scratchpad}"),
])
# ========================
# 4. 创建 Agent
# ========================
agent = create_structured_chat_agent(llm, tools, prompt)
agent_executor = AgentExecutor(
agent=agent,
tools=tools,
verbose=True,
handle_parsing_errors=True, # 容错解析错误
max_iterations=3,
)
# ========================
# 5. 测试
# ========================
if __name__ == "__main__":
print("🔍 任务1:获取当前时间")
result1 = agent_executor.invoke({"input": "现在几点了?只告诉我结果"})
print("✅ 最终答案:", result1["output"])
print("\n" + "="*60 + "\n")
print("🧮 任务2:数学计算")
result2 = agent_executor.invoke({"input": "计算 100*(25+15)/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.
✅ 最终答案: 现在是2026年04月09日 11:05:05
============================================================
🧮 任务2:数学计算
> Entering new AgentExecutor chain...
{"action":"CalculateMathExpression","action_input":"100*(25+15)/4 - 80"}计算结果:920.0{"action":"Final Answer","action_input":"100*(25+15)/4 - 80 等于 920"}
> Finished chain.
✅ 最终答案: 100*(25+15)/4 - 80 等于 920
更多学习资料尽在 老虎网盘资源
浙公网安备 33010602011771号