大模型Agent智能体已成为人工智能应用落地的主要形态,核心难点不再是模型能力本身,而是让模型稳定地完成工具调用与多步任务。本文以ReAct推理框架为主线,结合Function Calling协议,拆解一个可上线的Agent智能体开发闭环,覆盖推理循环、工具定义、参数解析、错误重试与状态管理。
ReAct推理框架:Agent智能体如何思考与行动
ReAct(Reasoning + Acting)把Agent的行为显式拆成思考、行动、观察三个环节。每一轮,模型先生成思考内容评估当前状态,再决定是否调用工具以及传入什么参数,拿到工具返回后形成观察结果,进入下一轮,直到任务目标达成。
一个最小化的ReAct循环用Python实现如下:
def run_react(prompt, tools, max_steps=8):
messages = [{"role": "user", "content": prompt}]
for _ in range(max_steps):
reply = llm.chat(messages)
tool_calls = extract_tool_calls(reply)
if not tool_calls:
return reply # 模型判定任务完成
messages.append({"role": "assistant", "content": reply})
for call in tool_calls:
result = execute_tool(tools, call)
messages.append({
"role": "tool",
"tool_call_id": call["id"],
"content": json.dumps(result, ensure_ascii=False)
})
raise TimeoutError("超过最大执行步数")
循环退出条件只有两种:模型不再产生工具调用,或者达到最大步数。生产环境必须设置上限,否则模型陷入重复调用时任务会无限跑下去。
Function Calling协议:工具定义与参数解析
相比让模型输出自由文本再解析,Function Calling直接由模型返回结构化的函数调用,可靠度高一个数量级。每个工具要声明名称、描述和JSON Schema参数结构,描述写清楚用途和边界,模型越容易在合适的时机选择它。
tools = [{
"type": "function",
"function": {
"name": "search_article",
"description": "按关键词检索站内技术文章列表",
"parameters": {
"type": "object",
"properties": {
"keyword": {"type": "string", "description": "搜索关键词,必填"},
"limit": {"type": "integer", "description": "返回条数", "default": 10}
},
"required": ["keyword"]
}
}
}]
参数约束越严,越不容易出错。日期、枚举这类字段直接在Schema里用format与enum限定,模型端返回的参数就能少做一层校验。
工具调用执行与错误重试机制
模型返回tool_calls后,Agent需要逐个执行工具并把结果按tool_call_id回填。工具执行可能抛异常,此时不能中断整个循环,而是把错误信息封装成工具结果返回给模型,让模型自行决定重试、换工具还是直接结束任务。
def execute_tool(tools, call):
fn = tools.get(call["function"]["name"])
if fn is None:
return {"error": "unknown tool: " + call["function"]["name"]}
try:
args = json.loads(call["function"]["arguments"])
return fn(**args)
except Exception as e:
return {"error": str(e), "hint": "请检查参数后重试或换一种方式"}
实际项目中,Function Calling失败的大头不在协议,而在参数类型不匹配与工具侧超时。给工具执行加上超时与重试阈值,比反复调模型更有效。
Agent智能体的状态管理与任务边界
生产Agent需要同时管理三层状态:消息上下文承载对话状态,外部存储承载业务状态,预算状态控制总成本。每轮观察结果要做长度截断,否则几十轮下来上下文会被工具返回撑爆。增加一个检测:连续两轮观察结果相同,判定循环并强制终止,返回人工介入提示。
并发方面,Agent无状态部署,工具调用携带幂等键,重复执行同一任务不会产生重复副作用,这是Agent从Demo走向上线的关键。
从单个Agent到多Agent协作
单Agent的工具调用跑稳定之后,再考虑多Agent编排:主Agent负责任务拆解,子Agent各管一类工具域。协作框架(如LangGraph)负责状态共享与路由。但要注意,多Agent的上下文开销和错误传导都会成倍增加,任务能单Agent解决就不要引入协作层。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/da-mo-xing-agent-zhi-neng-ti-kai-fa-shi-zhan-react-tui-li/