构建有效的代理
什么是代理?
"代理"的定义多样:
- 完全自主的系统(长期独立运行,使用工具完成复杂任务)
- 遵循预定义工作流的规范性实现
在Anthropic的架构体系中:
- 工作流:通过预定义代码路径编排LLM和工具
- 代理:动态自主决策流程和工具使用的系统
何时(不)使用代理
基本原则:
- 优先选择最简单的解决方案
- 仅在必要时增加复杂性
权衡考量:
- 代理系统以延迟/成本换取任务性能
- 明确定义任务 → 工作流(可预测性)
- 灵活决策需求 → 代理
- 多数场景:优化单次LLM调用(检索+上下文示例)已足够
框架使用指南
常见框架:
- LangGraph
- Amazon Bedrock AI Agent
- Rivet/Vellum(可视化工作流工具)
建议:
- 优先直接使用LLM API(多数模式只需数行代码)
- 使用框架时需理解底层逻辑
- 参考官方示例手册
核心构建模块
增强型LLM
基础架构单元,集成以下能力:
- 检索
- 工具调用
- 记忆存储
关键设计原则:
- 定制化增强能力
- 提供清晰接口
- 推荐使用Model Context Protocol集成工具
工作流模式
1. 提示链
将任务分解为顺序步骤,前序输出作为后续输入:
graph LR
A[步骤1] --> B{检查门限} --> C[步骤2]
适用场景:
- 营销文案生成+翻译
- 文档大纲→正文撰写
2. 路由
分类输入并导向专用流程:
graph TD
A[输入] --> B[分类器]
B --> C[子流程1]
B --> D[子流程2]
适用场景:
- 客户服务分流(咨询/退款/技术支持)
- 问题难度路由(Haiku/Sonnet模型调度)
3. 并行化
两种形态:
- 切片:并行处理独立子任务
- 投票:多版本输出聚合
graph TD
A[输入] --> B[任务1]
A --> C[任务2]
B & C --> D[聚合结果]
适用场景:
- 内容安全双检
- 代码漏洞多角度审查
4. 协调器-工作器
动态任务分解架构:
graph TD
A[协调器] --> B[工作器1]
A --> C[工作器2]
B & C --> D[结果合成]
适用场景:
- 多文件代码修改
- 跨源信息搜索分析
5. 评估器-优化器
迭代优化循环:
graph LR
A[生成响应] --> B[评估反馈] --> C[优化调整]
适用场景:
- 文学翻译润色
- 复杂搜索迭代
自主代理系统
核心特征:
- 接受人类指令/交互
- 自主规划执行
- 环境实时反馈
- 检查点人工介入
graph TD
A[启动] --> B[规划] --> C[执行] --> D{检查点}
D -->|继续| C
D -->|完成| E[终止]
最佳实践:
- 沙盒环境测试
- 严格防护机制
- 终止条件设置(如最大迭代次数)
应用案例:
- SWE-bench代码问题修复
- 计算机操作代理
工具设计准则
ACI(代理-计算机接口)原则:
- 格式自然(接近互联网文本范式)
- 避免复杂转义/计数需求
- 包含示例用法/边界说明
改进方法:
- 模拟LLM视角优化文档
- 参数命名自解释化
- 防错设计(如强制绝对路径)
成功要素
- 简单性:避免过度设计
- 透明性:显式展示决策过程
- 接口质量:工具文档>代码实现
正如软件开发需要重视HCI(人机交互),构建代理系统更需要精心设计ACI(代理-计算机接口)。
附录
典型应用场景
A. 客户支持
- 自然对话流+工具集成
- 成功指标:用户定义解决率
- 商业模型:按解决结果收费
B. 编码代理
- 自动化测试验证
- 问题空间结构化
- 人类审核关键环节
工具提示工程
格式选择原则:
- 给模型足够"思考"空间
- 采用常见文本格式(如Markdown>JSON)
- 避免精确计数需求
优化案例:
- 文件编辑:差异对比>全文件重写
- 路径处理:绝对路径>相对路径
通过持续测试迭代工具定义,最终在SWE-bench任务中实现了91%的准确调用率。