18.2 工作流与 Agent:工具、循环和权限边界
固定工作流由代码决定步骤;Agent 让模型根据目标和环境反馈动态选择下一步。后者适合路径难以预先枚举的任务,但会增加延迟、成本和不可预测性。
优先使用能完成任务的最简单结构:单次模型调用、检索增强、固定链路、带分支的工作流,最后才是开放循环。复杂度应由评估结果推动。
常见工作流
Prompt chaining
把可清楚分解的任务串联,并在中间增加程序化检查:
抽取事实 → schema 校验 → 生成草稿 → 引用检查Routing
先分类,再交给专门提示、工具或模型。路由器需要独立评估误路由成本,并提供低置信度兜底。
Parallelization
独立子任务可并行处理后聚合;同一任务多次采样可用于候选比较。只有当额外调用确实提高目标指标时,才值得支付成本。
Evaluator–optimizer
生成器根据明确标准反复修订。必须设置最大轮数和停止条件,避免把“评价者还能提出意见”误当作持续改进。
Agent 是一个受控循环
概念上的运行时:
目标 + 当前状态
↓
模型选择回答或工具调用
↓
策略检查 / 人工审批
↓
执行工具并记录观察
└──────────→ 下一轮ReAct 论文展示了推理与行动交替的范式。工程实现不需要向用户暴露或永久保存模型的私有推理文本;应保存可审计的计划摘要、工具参数、工具结果、批准记录和最终产物。
循环必须有退出条件:成功、明确失败、需要用户输入、权限不足、达到步数/时间/费用预算,或连续没有进展。
工具定义决定 Agent 的能力边界
工具应具备:
- 清晰、互斥的用途和参数 schema;
- 结构化返回值与可分类错误;
- 最小权限和调用方身份传播;
- 幂等键或可查询操作状态;
- 超时、速率限制和审计日志;
- 对破坏性或外部副作用的审批机制。
“执行 SQL”或“调用任意 URL”权限过宽。更安全的工具是 getOrder(id)、requestRefund(orderId, amount, reason),由应用代码继续执行授权、限额和不变量。
模型提出工具调用不等于已获授权。权限在服务端根据用户、租户、资源和动作重新判断。
Prompt Injection 是控制流攻击
网页、邮件和检索文档中的文本可能要求 Agent 泄露秘密或调用工具。外部内容是数据,不是可信系统指令。
防护需要多层组合:
- 把可信指令与不可信内容明确分隔;
- 对工具实施最小权限和参数验证;
- 高风险动作要求人工确认,并展示真实参数;
- 不把不必要的密钥放入模型上下文;
- 对读取、写入、发送和支付等能力分级授权;
- 用对抗测试持续检验,而不是只靠一句“忽略恶意指令”。
状态、记忆与上下文不是同义词
- 运行状态:当前步骤、工具结果、批准和预算;
- 会话上下文:本次交互需要提供给模型的信息;
- 长期记忆:跨会话保留、可检索的信息;
- 业务真相:订单、权限、余额等权威系统记录。
长期记忆必须有来源、范围、更新、删除和隐私政策。模型生成的摘要不能自动升级为业务真相。
多 Agent 只在责任边界清楚时使用
增加 Agent 会增加交接、上下文丢失、循环和评估组合。适合拆分的信号是工具权限、专业指令或结果所有者确实不同,而不是“角色越多越聪明”。
无论采用 handoff 还是把 Agent 当工具调用,都要明确:谁拥有最终回答,谁可以执行副作用,失败后控制权回到哪里。
下一课建立评估和运行治理,使模型、提示、检索器或工具变化可以被量化比较。
参考资料
- Anthropic, Building effective agents
- Yao et al., ReAct: Synergizing Reasoning and Acting in Language Models
- OpenAI, Agents SDK