【Agent智能体专栏】第5篇:高度自主代理的设计模式

摘要

当你需要构建一个能够回答“100 美元以下的圆形太阳镜有货吗”这类复杂查询的客服系统,或者一个能自动研究趋势、设计图形、撰写文案的营销助手时,单次 LLM 调用和简单的工具使用已不够用。本文深入讲解两种高级设计模式:规划(Planning) 和多代理系统(Multi-Agent Systems)。你将学会如何让 LLM 自主生成多步骤计划(JSON/XML/代码形式)并执行;了解为什么用代码表达计划比 JSON 更强大;掌握如何设计由研究员、设计师、文案等组成的多代理协作团队,以及线性 vs 经理式通信模式。最后,本文还将梳理全课程五大模块的核心要点,帮你建立完整的代理式 AI 知识体系。

适用人群 / 前置知识

适用人群:已掌握基础代理工作流(反思、工具使用),希望构建更自主、更复杂系统的开发者;对多智能体协作感兴趣的研究者。

前置知识:了解 LLM API 调用、函数调用/工具使用、RAG;最好有编写过至少一个简单代理(如研究代理、客服代理)的经验。本模块内容较为进阶。

正文

一、引言:从“固定流程”到“自主规划”

在前面的模块中,我们构建的代理工作流大多是预先确定步骤顺序的:先做 A,再做 B,最后做 C。例如发票处理:PDF 转文本 → LLM 提取 → 存入数据库。

但真实世界的任务往往更复杂、更多变。客户可能问:“有圆形、100 美元以下、库存的太阳镜吗?” 这需要先查描述(找圆形),再查库存,再比价格。不同的客户问法可能需要完全不同的工具调用顺序。

规划(Planning)设计模式就是为了解决这个问题:让 LLM 自己思考“为了完成这个任务,我应该先做什么,再做什么”,然后生成一个计划,最后按计划执行。

二、规划设计模式基础

2.1 核心流程

1. 给 LLM 一组工具(如:获取商品描述、检查库存、获取价格等)。
2. 提示 LLM 生成逐步计划:要求它输出一个包含多个步骤的结构化计划。
3. 解析计划:提取每一步的描述、要使用的工具和参数。
4. 逐步执行:依次调用 LLM 执行每一步,并将上一步的输出作为下一步的上下文。
5. 最终生成答案:将最后一步的结果返回给用户。

2.2 示例:太阳镜客服代理

用户查询:“你们有库存的圆形太阳镜吗?价格在 100 美元以下?”

LLM 生成的计划(高层描述):

  1. 使用 get_item_descriptions 找出所有圆形太阳镜。
  2. 对圆形太阳镜使用 check_inventory 筛选有货的。
  3. 对有货的太阳镜使用 get_item_price 筛选价格 < 100 美元。

执行

  • 步骤 1 调用工具,返回圆形太阳镜列表(如 A、B 两款)。
  • 步骤 2 传入该列表,调用库存检查,返回有货的款式(如 A 有货,B 无货)。
  • 步骤 3 传入 A,获取价格(如 89 美元),满足条件。
  • 最终回答:“有的,经典款圆形太阳镜售价 89 美元,有库存。”

2.3 计划的结构化表示

为了让下游代码可靠地解析计划,不要让 LLM 用自然语言写计划。推荐使用:

  • JSON(最常用)
  • XML(也不错)
  • Markdown(略有歧义)
  • 纯文本(最不可靠)

JSON 格式示例

{
  "plan": [
    {
      "step": 1,
      "description": "找出所有圆形太阳镜",
      "tool": "get_item_descriptions",
      "arguments": {"shape": "round"}
    },
    {
      "step": 2,
      "description": "检查这些太阳镜的库存",
      "tool": "check_inventory",
      "arguments": {"items": "{{step1.output}}"}
    }
  ]
}

下游代码解析 JSON,按顺序调用工具,并将 {{step1.output}} 替换为实际值。

三、进阶规划:用代码表达计划

JSON 方案虽然清晰,但有局限性:对于复杂任务(如多步数据处理),用 JSON 描述会非常冗长,且 LLM 需要为每个小操作定义一个工具。

更好的方法:让 LLM 直接编写代码。

3.1 为什么代码更强大?

  • 表达能力强:Python 有循环、条件、函数调用,可以轻松表达复杂逻辑。
  • 利用现有库:pandas、numpy、requests 等提供了数百个函数,LLM 已见过大量使用示例,无需你为每个函数单独定义工具。
  • 可执行:你只需在沙箱中运行 LLM 生成的代码,就能得到结果。

3.2 示例:咖啡机销售数据分析

  • 用户查询:“哪个月份的热巧克力销售额最高?”
  • 传统工具方式:需要为每个月重复调用“过滤行”和“统计”,非常繁琐。
  • 代码方式:提示 LLM 编写 Python 代码,使用 pandas。
import pandas as pd

df = pd.read_csv("coffee_sales.csv")
df['date'] = pd.to_datetime(df['date'])
df['month'] = df['date'].dt.month
hot_chocolate = df[df['product'] == 'hot_chocolate']
monthly_sales = hot_chocolate.groupby('month')['amount'].sum()
answer = monthly_sales.idxmax()
print(answer)

你只需执行这段代码,就能得到答案。

另一个查询:“上周有多少笔唯一交易?”

df = pd.read_csv("sales.csv")
df['date'] = pd.to_datetime(df['date'])
last_week = df[df['date'] >= (pd.Timestamp.now() - pd.Timedelta(days=7))]
unique_transactions = last_week['transaction_id'].nunique()
print(unique_transactions)

3.3 研究证据

对于多种任务,“代码即行动”的表现优于 JSON 计划,而 JSON 计划又优于纯文本计划。因此,当你的任务可以通过编程解决时,优先让 LLM 写代码

3.4 安全提醒

执行 LLM 生成的任意代码有风险(如删除文件)。务必在沙箱环境中运行(Docker、E2B 等)。如果只是内部测试且数据不敏感,可以临时禁用危险操作(如禁止 os、subprocess 模块),但生产环境必须沙箱化。

四、多代理系统:从单兵作战到团队协作

当任务非常复杂时,即使有规划,单个 LLM 也可能“手忙脚乱”。这时可以考虑多代理系统:创建多个专门化的代理,每个代理负责一个子任务,然后让它们协作。

4.1 为什么要用多个代理?

  • 关注点分离:你可以为每个代理优化提示词和工具,而不必在一个超长提示中塞满所有内容。
  • 可重用性:一个“平面设计师”代理可以用于营销手册、社交媒体、网页设计等多个场景。
  • 拟人类团队:人类处理复杂任务时自然会分工(研究员、设计师、文案、经理),多代理系统符合这种直觉。

4.2 示例:营销手册生成

团队角色

  • 研究员代理:工具 = 网络搜索,任务 = 分析市场趋势和竞争对手。
  • 平面设计师代理:工具 = 图像生成 API / 代码执行,任务 = 创建图表和艺术品。
  • 文案撰写人代理:工具 = 无(只用 LLM 生成文本),任务 = 将研究和图形整合为手册。

线性协作模式

研究员 → 输出研究报告 → 平面设计师 → 输出图形 → 文案撰写人 → 输出最终手册

代码示意(伪代码)

research_report = researcher_agent.run("太阳镜夏季趋势")
graphics = designer_agent.run(research_report, "创建可视化图表")
brochure = writer_agent.run(research_report, graphics, "写营销手册")

4.3 更复杂的通信模式:经理代理

有时你需要一个“经理”来动态决定调用哪个代理、以什么顺序调用。这本质上是一个规划 + 代理作为工具的模式。

实现方式

  • 给 LLM(经理)一组“代理工具”(如 call_researcher、call_designer、call_writer)。
  • 经理 LLM 生成计划:先调用研究员,再调用设计师,再调用文案,最后可能再调用反思代理。
  • 执行计划时,每个“代理工具”内部运行一个专门的 LLM 代理。

优势:经理可以处理更复杂的、非线性的工作流,例如根据研究员的结果决定是否需要第二轮研究。

五、常见通信模式总结

模式 描述 适用场景
线性链 A → B → C,顺序执行 任务有明确的前后依赖,如研究→设计→文案
层级/经理式 一个经理代理调用其他代理,可动态决策 任务复杂,需要根据中间结果调整后续步骤
循环/迭代 代理之间反复交互,如“写代码→执行→调试→重写” 需要多轮反思和改进的任务
广播/投票 多个代理独立处理同一输入,然后汇总或投票 需要多样性意见或容错的场景(较少见)

六、全课程核心要点回顾

本课程五个模块涵盖了构建代理式 AI 的完整技能栈:

  1. 反思:让 LLM 审视自己的输出并改进。简单有效,尤其当有外部反馈时。
  2. 工具使用:让 LLM 调用函数获取实时信息、执行动作。核心是函数调用 API 和代码执行沙箱。
  3. 评估与错误分析:用端到端评估和组件级评估量化性能;用错误分析定位最值得优化的组件。
  4. 实用技巧:快速原型 → 观察 → 建立小评估集 → 错误分析 → 聚焦优化 → 迭代。这是工程方法论的核心。
  5. 高级模式:规划(让 LLM 自主生成多步计划)和多代理系统(多个专门代理协作)。适合更复杂、更自主的应用。

七、注意事项与建议

问题 建议
规划结果不可预测 接受一定的不确定性;从低风险任务开始尝试规划。
代码执行安全 始终使用沙箱(Docker、E2B)。绝不直接 exec() 未经过滤的 LLM 代码。
多代理系统复杂度高 先尝试用单个代理 + 规划解决问题;只有真正需要分工时才引入多代理。
代理之间通信开销 每次代理调用都会产生延迟和费用。不要过度拆分。
经理代理可能“想太多” 设置最大计划步数(如 10 步),防止无限规划。

八、总结

规划多代理系统是将代理式 AI 从“能做事”推向“能自主完成复杂任务”的关键设计模式。

  • 规划让 LLM 自己决定做什么、按什么顺序做,尤其适合需要多步推理和工具调用的场景。当任务可以用代码解决时,让 LLM 写代码比输出JSON 更强大。
  • 多代理系统通过角色分工和协作,模拟人类团队的工作方式,提高复杂任务的处理能力和系统的可维护性。

这两种模式目前仍在快速发展中。在高度自主的编码代理领域,它们已经表现出色;在其他领域,潜力巨大但需要更多实践。希望你能够基于本课程的知识,大胆尝试,构建出令人兴奋的自主代理应用。

最后,感谢你完成这五个模块的学习。现在,去构建酷炫的东西吧!
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐