大模型Agent智能体开发实战:ReAct推理与Function Calling工具调用设计

大模型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/

(0)
小编小编
上一篇 7小时前
下一篇 6小时前

相关推荐