Agent的本质:局限、组件模型与形态

目录

Agent 的自主性,体现在它能在多大范围内自行选择动作、如何处理反馈,以及何时把控制权交回。模型能力是其中一个因素;权限、任务状态、执行时限与恢复机制同样决定系统能承担什么工作。

上一篇建立了五类职责与阅读地图。本文继续使用“调查订单异常”的场景,把职责落到配置、自主性边界、成本和业务执行上。文中的 A1–A4 是本系列的讨论框架,不是产品评级或行业标准。

1. 五类工程问题不等于模型的五种绝对缺陷

原始模型推理与完整产品需要分开看。常规推理不会因为一轮对话自动更新模型权重,但上下文、推理缓存和服务端会话都可能保存信息。模型能提出计划、修订答案和表达不确定性,只是这些输出不能自动成为可靠的业务状态。

任务记忆、真实执行和外部核验共同支撑模型决策

工程问题 模型能提供什么 系统仍需负责什么
跨轮保留信息 根据提供的历史继续理解 决定保存、检索、更新和删除哪些信息
影响外部环境 提出工具名称与参数 授权、调用、接收结果与控制副作用
规划与调整 分解任务,随新信息改计划 表达依赖、记录进度、执行及恢复
维护执行事实 阅读状态并解释其含义 以实际事件维护权威状态
评估结果 提出批评与修正建议 提供测试、业务校验或人工反馈等证据

“模型说已完成”与“系统确认已完成”之间,需要一条证据链。在订单调查里,模型可以解释支付记录,但付款是否成功应来自支付系统;如果查询超时,只能记录结果未知。

同样,模型的自报置信度不是校准后的成功概率。它可以作为待验证的信号,不能直接替代权限检查或决定高影响操作。

2. 把职责写成可执行的配置契约

下面是说明性的应用配置,不对应某家 SDK。字段要由运行时真正读取并执行;写在配置文件中并不会自动生效。

{
  "name": "order-investigator",
  "model_profile": "reasoning-default",
  "memory": {
    "conversation_enabled": true,
    "task_state_enabled": true,
    "cross_task_memory_enabled": false
  },
  "tools": [
    "query_order",
    "query_payment_status",
    "query_order_events"
  ],
  "planner": {
    "mode": "react"
  },
  "runtime": {
    "max_model_steps": 12,
    "max_tool_calls": 20,
    "deadline_seconds": 120,
    "token_budget": 30000,
    "consecutive_error_limit": 3
  },
  "policy": {
    "action_scope": "read_only",
    "identity_source": "authenticated_session"
  }
}

这些数字只是配置示例,需要根据任务长度与评估结果调整。把工具调用数和模型步数分开,是因为一次模型响应可能包含多个调用。

这个 Agent 只能调查,不能退款。身份来自已认证会话,不能由模型自由指定另一个用户;读取支付记录也必须经过服务端授权。后续如果新增处理能力,应单独定义业务操作与审批范围,而不是把只读配置改成“允许所有工具”。

五类职责可以由一个进程实现。Memory 不必一开始就接向量库,Planner 不必独立部署,Runtime 也不等于一个完整平台。

3. 决策输出可解析,还要可验证

程序需要明确知道模型是在请求工具、回答用户,还是等待补充信息。可以使用供应商原生工具调用,也可以定义应用层决策结构。下面是后者的一次实例:

{
  "action": "call_tool",
  "tool": "query_payment_status",
  "arguments": {
    "order_id": "O202512050001"
  },
  "reason_summary": "订单未确认,需要核对已有支付请求的最终状态"
}

reason_summary 是简短决策说明,不是模型内部推理的完整记录,更不是动作正确性的证明。

校验需要分层进行:

  1. 解析与结构检查:动作类型是否合法,必填字段是否存在,是否出现多余字段
  2. 动作匹配:请求工具时必须有工具名和参数,回答时必须有回答内容
  3. 工具契约:工具是否已注册,参数是否满足该工具的 Schema
  4. 授权与业务条件:当前主体能否查看这笔订单,该操作是否仍然允许
  5. 结果判定:收到的是成功、拒绝、待处理还是未知状态

结构化输出减少格式歧义,不保证事实正确或业务合法。Schema 中写一段“调用工具时填写参数”的描述,也不能代替实际的条件校验。

4. A1–A4 描述控制权,不代表成熟度

形态 控制权边界 订单场景中的例子
A1 单次推理 应用调用模型一次,消费其结果 将一条咨询归类为订单异常
A2 受限工具增强 应用控制有限步骤,模型完成局部选择 查询已指定订单,再解释状态
A3 任务驱动循环 模型随反馈选择后续步骤,运行时约束范围 自主补查订单、支付与事件记录
A4 持续任务系统 在长期授权范围内由事件或调度持续推进 监测待处理订单并创建调查任务

A1 是用于比较的基线,未必会被所有定义称为 Agent。A2 与 A3 也没有固定的“3 轮”分界,同一产品可以同时提供不同形态。

A4 不意味着系统可以自行扩大业务目标或权限。持续运行需要任务归属、调度、持久化、取消、预算与恢复;新增子目标仍应服务于已经授权的目标。长期自动化也不要求每次都调用模型。

因此,不能把某个产品永久归为某一级,再据此断言它的成本或可靠性。应描述具体功能、版本与部署方式。模型改进可能让同一架构完成更多任务;架构改进也可能让同一模型更稳定地执行。

5. 何时值得增加动态决策

选择 Agent 前,先建立一个能比较的简单基线。订单状态查询通常可以由固定流程完成;异常调查如果经常需要根据新证据选择不同查询,才更可能从动态决策中获益。

判断问题 支持增加 Agent 能力的证据
固定流程遗漏了什么? 实际任务存在难以预先枚举的证据获取路径
模型决定下一步是否更好? 同一测试集上完成率或人工处理时间改善
能否验证结果? 关键结论能关联查询记录、测试或业务状态
出错能否控制? 有明确权限、预算、停止与恢复方式
收益是否覆盖投入? 包含人工、工具、模型、维护及失败成本的比较成立

输入需要语义理解,不等于整个任务都要交给 Agent。反过来,一个有确定状态机的业务,也可能包含值得使用 Agent 的解释、调查或方案生成环节。

规则引擎和普通代码也有开发、运行与维护成本,不能称为“零成本、100% 无错”。它们的优势是把已知规则明确执行,便于测试和审计。

6. 成本要按完整任务计算

全量重发历史时,输入 token 会累积。假设每轮有固定前缀 S,且第 i 轮的动态历史恰好是 i×T,则 N 轮输入为:

总输入 token = N×S + T×N×(N+1)/2

例如 S=2000、T=1000、N=5,合计 25000 输入 token。这个算例只描述特定上下文策略,不是所有 Agent 的成本规律;摘要、检索、固定窗口和缓存会改变计量或收费,输出 token、工具与基础设施还要另算。

业务 ROI 则需要更完整的账:

每任务期望成本
= 模型费用 + 工具及基础设施费用
+ 人工介入概率 × 单次介入成本
+ 失败损失的期望值
+ 分摊的建设与维护成本

为了展示敏感性,假设两个方案质量与失败损失相同,人工每次处理成本为 5 元:

假设方案 模型与工具费用/任务 人工介入率 人工费用/任务 小计
固定查询辅助 0.05 元 40% 2.00 元 2.05 元
动态调查辅助 0.20 元 15% 0.75 元 0.95 元

这组数字不是实测,也不是产品定价。它说明:在这个假设下,增加 0.15 元机器费用,换取减少 1.25 元人工费用,才产生 1.10 元差额。真实项目必须验证介入率是否下降、处理质量是否相当,以及节省的时间能否转化为业务收益。

没有统一的“介入率低于 20% 就不值得做”阈值。低频但高价值任务、已高度自动化的海量任务,成本结构可能完全不同。

7. 多步成功率需要明确概率条件

如果三个必要步骤独立、每步成功率均为 90%,且没有恢复机制,全部成功的概率是:

0.9 × 0.9 × 0.9 = 0.729

独立性不成立时,应使用条件概率:

P(全部成功)
= P(S1) × P(S2 | S1) × P(S3 | S1, S2)

实际系统的错误常相关:错误订单号会影响后续每一步,错误知识也可能同时误导执行者与评估者。不能把单独测出的节点成功率直接相乘,声称得到端到端可靠性。

重试、核验与回退能改变路径及成功条件,但不会自动“打破概率规律”。核验器也有漏检与误报,必须通过端到端任务测量实际改善。

8. 业务执行需要稳定的操作身份

订单调查结束后,如果用户请求退款,系统可以让模型提取意图,再交给业务服务执行。关键不是禁止工具执行退款,而是不能绕过业务授权与状态约束。

下面是教学伪代码,展示职责顺序:

def submit_refund(intent, principal, request_id):
    order = orders.load_for_update(intent.order_id)
    require_can_refund(principal, order)
    amount = validate_refund_amount(intent.amount, order)
    require_approval_if_needed(principal, order, amount)

    operation = refunds.create_or_get(
        tenant_id=principal.tenant_id,
        request_id=request_id,
        order_id=order.id,
        amount=amount,
        currency=order.currency,
    )
    return refunds.submit_or_query(operation)

create_or_get 需要由数据库唯一约束或等价原子机制保证,并检查同一请求 ID 的参数一致性。不能用“先查是否存在,再执行”的两个普通操作代替。

请求 ID 由应用为同一业务操作生成并持久化;模型重新生成 tool call ID 时,仍要关联原操作。仅用“订单号+金额”也不够,因为同一订单可能存在合法的多次部分退款。授权判断应抛出明确错误,不能依赖可能被关闭的 Python assert。

支付接口超时后,先查已有操作的结果。稳定的幂等键、状态查询与对账共同保证恢复;一条审计日志本身不能防止重复退款。

9. 让自主性服务于交付

Agent 的能力不由组件数量、循环轮数或自主性标签决定。应先明确任务与授权范围,再用证据判断它能否更好地交付。

对于订单异常调查,一个有效的系统应能找到正确对象、补齐关键证据、保留未知状态,并把处理建议与实际操作分开。这些结果比“用了几个 Agent”更有意义。下一篇讨论如何把这些约束落实到运行时、工具契约和提示词组装。

评论