智能体设计模式(二)反思-工具使用-规划

本文是"智能体设计模式"系列的第二篇,涵盖第4-6章:反思、工具使用、规划。

系列文章:


第四章:反思(Reflection)

人贵有自知之明,AI 也是。会反思的智能体,才是真正聪明的智能体。


一、一句话定位

反思模式解决什么问题?

反思模式 = 让 AI 学会"三省吾身"
就像写作文:先写初稿,再自己检查,发现问题改一改,反复几次才交卷

适合谁学?

  • 想提升 AI 输出质量的开发者
  • 正在构建需要高准确性系统的工程师
  • 对智能体自我改进机制感兴趣的技术人员

不适合谁?

  • 对响应速度要求极高的实时场景(反思需要时间)
  • 简单任务不需要这么"较真"

二、核心框架(知识骨架)

核心观点

AI 的第一次输出往往不完美 = 学生的第一稿作文
反思模式 = 让 AI 自己当老师,批改自己的作业,然后重写
反复几轮 = 从 60 分提升到 90 分

关键概念速查表

概念 大白话解释 生活比喻 一句话记忆
反思模式 AI 评估并改进自己的输出 写完作文自己检查 自我纠错
生产者-评论者 一个生成,一个批评 作者和编辑 分工审查
反馈循环 生成→评估→改进→再评估 改稿→审稿→再改 迭代优化
停止条件 什么时候算"够好了" 截稿日期 适可而止

知识地图

初始输出 → 自我评估 → 发现问题 → 改进输出 → 再次评估 → ... → 满意输出
    ↓          ↓           ↓           ↓           ↓              ↓
  第一稿      找茬儿      列问题      写二稿      再找茬       交终稿

三、深入浅出讲解

开场钩子 🎣

你有没有这样的经历?

写完一封重要邮件,点击发送前,你会:

  1. 再读一遍,检查有没有错别字
  2. 想想语气是否合适
  3. 确认附件有没有忘记
  4. 可能还会改几个词

这就是反思

现在问题来了:AI 写完东西就直接输出,从不检查。就像那个总是"写完就交"的同学,作文里错别字连篇,逻辑混乱,但他自己浑然不觉。

反思模式就是教会 AI 这个"写完检查"的好习惯。


【概念1:为什么 AI 需要反思?】

一句话是什么:AI 的第一次输出往往不够好,需要自我检查和改进。

生活化比喻

想象你是一个厨师,做了一道菜:

普通厨师:做完就端上去
优秀厨师:做完先尝一口,咸了加点糖,淡了加点盐,摆盘不好看再调整

AI 也是一样:
普通 AI:生成就输出
反思 AI:生成后自检,发现问题就改进

AI 第一次输出的常见问题

问题类型 表现 例子
不准确 事实错误 “地球是太阳系最大的行星”
不完整 遗漏要点 让写5点,只写了3点
不连贯 前后矛盾 前面说A好,后面说A不好
不符合要求 忽视指令 让写JSON,输出了纯文本
幻觉 编造内容 引用不存在的论文

引经据典

"吾日三省吾身" —— 曾子

翻译成 AI 语言:
我每天要多次反思自己的输出:
- 生成的内容准确吗?
- 有没有遗漏重要信息?
- 是否符合用户的要求?

【概念2:反思模式的核心流程】

一句话是什么:生成 → 评估 → 改进 → 再评估,循环往复直到满意。

生活化比喻

反思模式就像健身教练指导你做动作:

第1轮:
- 你:做一个深蹲(生成)
- 教练:膝盖内扣了,背也弯了(评估)
- 你:好的,我调整一下(改进)

第2轮:
- 你:再做一个深蹲(生成)
- 教练:膝盖好多了,但下蹲不够深(评估)
- 你:明白,我再试试(改进)

第3轮:
- 你:这次呢?(生成)
- 教练:完美!(停止)

反思模式的四个步骤

┌─────────────────────────────────────────────────────┐
│  1. 执行(Execution)                                │
│     智能体执行任务,生成初始输出                       │
│     ↓                                               │
│  2. 评估(Evaluation)                               │
│     分析输出:准确性、完整性、风格、是否符合要求        │
│     ↓                                               │
│  3. 反思/改进(Reflection/Refinement)               │
│     根据评估结果,确定改进方向,生成更好的版本          │
│     ↓                                               │
│  4. 迭代(Iteration)                                │
│     重复以上步骤,直到满意或达到最大次数               │
└─────────────────────────────────────────────────────┘

幽默包装

反思模式就像程序员改 Bug:

第1版代码:能跑(大概)
Code Review:这里有问题,那里也有问题
第2版代码:改了一些
Code Review:好多了,但这个边界情况没处理
第3版代码:又改了
Code Review:LGTM(Looks Good To Me)!

区别是:反思模式里,程序员和 Reviewer 都是 AI 自己。

【概念3:生产者-评论者模型】

一句话是什么:让一个 AI 生成内容,另一个 AI 专门挑毛病。

生活化比喻

想象一个出版社的工作流程:

作者(生产者):写书稿
编辑(评论者):审稿、挑错、提建议
作者:根据建议修改
编辑:再审
...
最终:出版

为什么要分开?
- 作者容易"当局者迷",看不到自己的问题
- 编辑以"旁观者清"的视角,更容易发现问题

为什么分开比自己审自己更好?

方式 优点 缺点
自我反思 简单,成本低 容易"认知偏见",对自己的错误视而不见
生产者-评论者 更客观,发现更多问题 需要两次 LLM 调用,成本更高

代码示例中的体现

# 生产者:专注于生成内容
generator = LlmAgent(
    name="DraftWriter",
    instruction="Write a short, informative paragraph about the user's subject."
)

# 评论者:专注于挑毛病
reviewer = LlmAgent(
    name="FactChecker",
    instruction="""
    You are a meticulous fact-checker.
    Carefully verify the factual accuracy of all claims.
    """
)

引经据典

"兼听则明,偏信则暗" —— 《资治通鉴》

一个人的视角有限,两个角色互相审视,才能发现更多问题。

【概念4:反思模式的实际应用场景】

场景1:创意写作和内容生成

用例:AI 写博客文章
流程:
1. 生成初稿
2. 评估:流畅性、语气、清晰度
3. 根据评估重写
4. 重复直到满意

好处:产出更精致、更有效的内容

场景2:代码生成和调试

用例:AI 写 Python 函数
流程:
1. 写初始代码
2. 运行测试或静态分析
3. 识别错误或低效之处
4. 根据发现优化代码

好处:生成更健壮、功能更完整的代码

场景3:复杂问题解决

用例:AI 解逻辑谜题
流程:
1. 提出一个解题步骤
2. 评估是否推进了问题解决
3. 如果引入矛盾,回退尝试其他步骤

好处:增强在复杂问题中的分析能力

场景4:摘要和信息综合

用例:AI 总结长文档
流程:
1. 生成初步摘要
2. 与原文要点对照
3. 补充遗漏,修正错误

好处:生成更准确、更全面的摘要

场景5:规划和策略

用例:AI 制定行动计划
流程:
1. 生成计划
2. 模拟执行或评估可行性
3. 根据评估调整计划

好处:制定更有效、更符合实际的计划

场景6:对话智能体

用例:客服聊天机器人
流程:
1. 生成回复
2. 回顾对话历史,检查连贯性
3. 确保准确回应用户最新输入

好处:实现更自然、更高效的沟通

四、实践示例(代码演示)

示例1:LangChain 实现反思循环

场景:迭代生成并优化一个计算阶乘的 Python 函数。

import os
from langchain_openai import ChatOpenAI
from langchain_core.messages import SystemMessage, HumanMessage

# 初始化模型
llm = ChatOpenAI(model="gpt-4o", temperature=0.1)

def run_reflection_loop():
    """
    通过多步骤反思循环,逐步改进 Python 函数
    """
    
    # 核心任务
    task_prompt = """
    创建一个名为 `calculate_factorial` 的 Python 函数:
    1. 接受一个整数 n 作为输入
    2. 计算其阶乘 (n!)
    3. 包含清晰的文档字符串
    4. 处理边界情况:0 的阶乘是 1
    5. 处理无效输入:负数时抛出 ValueError
    """
    
    max_iterations = 3
    current_code = ""
    message_history = [HumanMessage(content=task_prompt)]
    
    for i in range(max_iterations):
        print(f"\n{'='*25} 反思循环:第 {i + 1}{'='*25}")
        
        # --- 1. 生成/改进阶段 ---
        if i == 0:
            print("\n>>> 阶段1:生成初始代码...")
            response = llm.invoke(message_history)
            current_code = response.content
        else:
            print("\n>>> 阶段1:根据反馈改进代码...")
            message_history.append(HumanMessage(content="请根据上述反馈改进代码。"))
            response = llm.invoke(message_history)
            current_code = response.content
        
        print(f"\n--- 生成的代码 (v{i + 1}) ---\n{current_code}")
        message_history.append(response)
        
        # --- 2. 反思阶段 ---
        print("\n>>> 阶段2:评审代码...")
        
        # 评论者的提示词
        reflector_prompt = [
            SystemMessage(content="""
                你是一位高级软件工程师和 Python 专家。
                你的职责是进行细致的代码审查。
                根据原始任务要求,批判性地评估代码。
                检查 bug、风格问题、遗漏的边界情况和改进空间。
                如果代码完美符合所有要求,回复 'CODE_IS_PERFECT'。
                否则,以列表形式提供你的改进建议。
            """),
            HumanMessage(content=f"原始任务:\n{task_prompt}\n\n待审查代码:\n{current_code}")
        ]
        
        critique_response = llm.invoke(reflector_prompt)
        critique = critique_response.content
        
        # --- 3. 停止条件 ---
        if "CODE_IS_PERFECT" in critique:
            print("\n--- 评审结果 ---\n代码已完美,无需进一步改进。")
            break
        
        print(f"\n--- 评审意见 ---\n{critique}")
        message_history.append(HumanMessage(content=f"代码评审意见:\n{critique}"))
    
    print(f"\n{'='*30} 最终结果 {'='*30}")
    print(f"\n反思过程后的最终代码:\n{current_code}")

if __name__ == "__main__":
    run_reflection_loop()

代码解读

任务提示 → [生成初始代码] → [评论者审查] → 有问题?
                                              ↓
                              是 → [根据反馈改进] → 循环
                              否 → 输出最终代码

示例2:Google ADK 实现生产者-评论者模型

from google.adk.agents import SequentialAgent, LlmAgent

# 生产者:生成初始草稿
generator = LlmAgent(
    name="DraftWriter",
    description="根据给定主题生成初始草稿内容",
    instruction="写一段关于用户主题的简短、信息丰富的段落。",
    output_key="draft_text"  # 输出保存到这个状态键
)

# 评论者:审查草稿
reviewer = LlmAgent(
    name="FactChecker",
    description="审查文本的事实准确性并提供结构化反馈",
    instruction="""
    你是一位细致的事实核查员。
    1. 阅读状态键 'draft_text' 中的文本
    2. 仔细核实所有声明的事实准确性
    3. 输出必须是包含两个键的字典:
       - "status": "ACCURATE" 或 "INACCURATE"
       - "reasoning": 对状态判断的清晰解释
    """,
    output_key="review_output"
)

# 顺序执行:先生成,后审查
review_pipeline = SequentialAgent(
    name="WriteAndReview_Pipeline",
    sub_agents=[generator, reviewer]
)

# 执行流程:
# 1. generator 运行 → 保存段落到 state['draft_text']
# 2. reviewer 运行 → 读取 draft_text,保存审查结果到 state['review_output']

五、精华提炼(去废话版)

核心要点(只保留干货):

  1. 自我纠错:AI 评估自己的输出,发现问题并改进 → 质量提升
  2. 生产者-评论者:分开生成和评审角色 → 更客观、发现更多问题
  3. 迭代优化:生成→评估→改进→再评估 → 逐步逼近最优
  4. 停止条件:设定"够好了"的标准 → 避免无限循环

必须记住的

反思模式 = 写作文检查 = 自我批评 + 自我改进

权衡取舍

质量 ↑ = 时间 ↑ + 成本 ↑
适用于:质量 > 速度 的场景

六、行动清单

立即可做(5分钟内):

  • 想一个你之前让 AI 生成但质量不满意的任务
  • 尝试让 AI 先生成,再让它自己评估并改进

本周实践

  • 实现一个简单的反思循环(生成→评估→改进)
  • 尝试分离生产者和评论者角色

进阶挑战

  • 设计合适的停止条件(迭代次数 or 质量阈值)
  • 将反思模式与提示链结合使用

七、常见误区

误区1:所有任务都需要反思

❌ 错误:简单问答也要反思三轮
✅ 正确:反思适合需要高质量输出的复杂任务

误区2:反思次数越多越好

❌ 错误:反思10轮肯定比3轮好
✅ 正确:通常2-3轮就够了,过多反思收益递减,成本递增

误区3:自我反思就够了

❌ 错误:让同一个 AI 自己审自己
✅ 正确:分离生产者和评论者角色,用不同的提示词,更客观

误区4:忽视停止条件

❌ 错误:一直反思到"完美"
✅ 正确:设定明确的停止条件(次数上限 or 质量标准)

八、学习检查

基础理解

  • 能解释为什么 AI 需要反思模式
  • 能说出反思模式的四个步骤
  • 理解生产者-评论者模型的优势

实践能力

  • 能实现一个简单的反思循环
  • 能设计评论者的提示词
  • 能设定合理的停止条件

进阶理解

  • 理解反思模式与记忆管理的关系
  • 理解反思模式与目标监控的协同
  • 能权衡反思带来的质量提升和成本增加

九、金句收藏

原文金句

"反思模式为智能体系统增加了一层元认知能力,
使其能从自己的处理过程和输出中学习,
从而产生更智能、更可靠、更高质量的结果。"

我的总结金句

"AI 的第一稿是草稿,反思后的才是作品。"

"自己审自己容易'灯下黑',让另一个角色来挑毛病更靠谱。"

"反思不是追求完美,而是追求更好。"

十、画龙点睛

总结升华

反思模式的本质是"元认知"——让 AI 具备"思考自己思考过程"的能力。

这就像人类的成长:
- 小孩子做事不过脑子,做完就完了
- 成年人会反思:我做得对吗?有没有更好的方法?
- 高手会复盘:这次成功/失败的原因是什么?下次如何改进?

反思模式让 AI 从"小孩子"成长为"高手"。

与其他模式的联系

反思 + 记忆 = 从历史中学习,避免重复犯错
反思 + 目标监控 = 有明确的评估标准
反思 + 提示链 = 每一步都可以反思优化

悬念预告

反思模式让 AI 学会了"自我改进",但如果 AI 需要与外部世界交互呢?
查数据库、调 API、执行代码——这些都需要"工具"。

下一章,我们将探索"工具使用模式"——让 AI 学会使用各种工具,
从"纸上谈兵"变成"实干家"。

一句话带走

会反思的 AI 才是聪明的 AI,第一稿永远只是起点。

十一、延伸资源

想深入学习

想教给别人

  • 用"写作文检查"比喻解释核心概念
  • 用"作者和编辑"的例子说明生产者-评论者模型
  • 用"健身教练指导动作"的例子说明迭代改进

第五章:工具使用(Tool Use / Function Calling)

光说不练假把式,会用工具的 AI 才是真本事。


一、一句话定位

工具使用模式解决什么问题?

工具使用 = 让 AI 从"纸上谈兵"变成"实干家"
就像给员工配电脑、给厨师配厨具——有了工具,才能干活

适合谁学?

  • 想让 AI 与外部系统交互的开发者
  • 需要 AI 获取实时数据的工程师
  • 构建能"做事"而不只是"说话"的智能体

不适合谁?

  • 只需要纯文本生成的简单场景

二、核心框架(知识骨架)

核心观点

大语言模型的知识 = 训练时的数据 = 静态的、过时的
工具使用 = 给 AI 装上"手脚" = 能查、能算、能操作
AI + 工具 = 真正有用的智能体

关键概念速查表

概念 大白话解释 生活比喻 一句话记忆
工具/函数 AI 可以调用的外部能力 厨师的厨具 干活的家伙
函数调用 AI 决定用哪个工具、传什么参数 点菜下单 选工具+填参数
工具定义 告诉 AI 有哪些工具可用 菜单 工具说明书
编排层 负责实际执行工具调用 后厨 真正干活的

知识地图

用户请求 → AI 理解需求 → 决定是否用工具 → 生成调用请求 → 执行工具 → 获取结果 → 整合回复
    ↓           ↓              ↓              ↓            ↓          ↓          ↓
  "伦敦天气"   需要实时数据     需要!      weather("London")  调API    15°C多云   "伦敦现在15°C"

三、深入浅出讲解

开场钩子 🎣

想象一下,你雇了一个"百科全书式"的助理:

  • 他读过无数书籍,知识渊博
  • 但他的知识停留在去年
  • 他不会上网、不会打电话、不会发邮件
  • 你问他"今天天气怎么样",他只能说"我不知道"

这就是没有工具的大语言模型——满腹经纶,但与世隔绝。

工具使用模式就是给这个助理配上电脑、手机、各种软件,让他能真正帮你办事。


【概念1:为什么 AI 需要工具?】

一句话是什么:AI 的知识是静态的,工具让它能获取动态信息和执行操作。

生活化比喻

大语言模型 = 一个博学的书呆子

他的问题:
1. 知识有截止日期("2024年美国总统是谁?" → "我不确定")
2. 不会算数("123456 × 789012 = ?" → 可能算错)
3. 不能访问你的数据("我的订单状态?" → "我不知道")
4. 不能执行操作("帮我发封邮件" → "我做不到")

给他配上工具:
1. 搜索引擎 → 获取最新信息
2. 计算器 → 精确计算
3. 数据库接口 → 查询你的数据
4. 邮件API → 真的能发邮件

AI 的局限 vs 工具的能力

AI 的局限 工具的能力 例子
知识过时 获取实时数据 天气、股价、新闻
计算不准 精确计算 复杂数学运算
无法访问私有数据 查询数据库 订单状态、库存
不能执行操作 调用API 发邮件、控制设备
不能运行代码 代码执行器 数据分析、脚本

引经据典

"工欲善其事,必先利其器" —— 《论语》

AI 要想真正有用,必须有趁手的工具。

【概念2:工具使用的核心流程】

一句话是什么:定义工具 → AI 决策 → 生成调用 → 执行工具 → 返回结果。

生活化比喻

工具使用就像在餐厅点餐:

1. 菜单(工具定义)
   - 宫保鸡丁:需要辣度(参数)
   - 红烧肉:需要份量(参数)
   
2. 顾客点餐(用户请求)
   "我想吃辣的鸡肉菜"
   
3. 服务员理解(AI 决策)
   "这位客人需要宫保鸡丁"
   
4. 下单(生成调用)
   {菜名: "宫保鸡丁", 辣度: "中辣"}
   
5. 后厨做菜(执行工具)
   厨师按订单做菜
   
6. 上菜(返回结果)
   一盘宫保鸡丁端上来
   
7. 服务员介绍(整合回复)
   "这是您点的宫保鸡丁,中辣口味"

工具使用的六个步骤

┌─────────────────────────────────────────────────────┐
│  1. 工具定义(Tool Definition)                      │
│     向 AI 描述可用的工具:名称、用途、参数            │
│     ↓                                               │
│  2. AI 决策(LLM Decision)                         │
│     AI 判断是否需要使用工具                          │
│     ↓                                               │
│  3. 生成调用(Function Call Generation)            │
│     AI 生成结构化的调用请求(JSON)                  │
│     ↓                                               │
│  4. 工具执行(Tool Execution)                      │
│     编排层执行实际的函数调用                         │
│     ↓                                               │
│  5. 获取结果(Observation/Result)                  │
│     工具返回执行结果                                 │
│     ↓                                               │
│  6. 整合回复(LLM Processing)                      │
│     AI 将结果整合成用户友好的回复                    │
└─────────────────────────────────────────────────────┘

幽默包装

工具使用就像程序员的日常:

用户:"帮我查一下这个 Bug 的原因"

没有工具的 AI:
"Bug 可能是因为空指针、数组越界、类型错误..."(一通理论)

有工具的 AI:
1. 调用日志查询工具 → 找到错误堆栈
2. 调用代码搜索工具 → 定位问题代码
3. 调用文档搜索工具 → 找到解决方案
"根据日志,问题出在第42行,这里数组越界了,建议加个边界检查"

区别:一个在"猜",一个在"查"。

【概念3:工具定义的艺术】

一句话是什么:好的工具定义 = AI 能正确理解和使用工具。

生活化比喻

工具定义就像写产品说明书:

差的说明书:
"这是个工具,能做很多事"
→ 用户不知道怎么用

好的说明书:
"这是电钻,用于在墙上打孔
 - 参数1:孔径(6mm/8mm/10mm)
 - 参数2:深度(厘米)
 - 注意:使用前确认墙内无电线"
→ 用户一看就会

工具定义的关键要素

@tool
def get_weather(location: str, unit: str = "celsius") -> str:
    """
    获取指定地点的当前天气信息。
    
    参数:
    - location: 城市名称,如 "北京"、"London"
    - unit: 温度单位,"celsius"(摄氏度)或 "fahrenheit"(华氏度)
    
    返回:
    - 包含温度、天气状况的字符串
    
    使用场景:
    - 用户询问天气时使用
    - 如 "北京天气怎么样"、"伦敦现在多少度"
    """
    # 实际实现...

好的工具定义要点

要素 说明 例子
清晰的名称 一看就知道干什么 get_weather 而非 func1
详细的描述 说明用途和使用场景 “获取指定地点的当前天气”
参数说明 每个参数的类型和含义 location: str - 城市名称
返回值说明 返回什么格式的数据 “返回包含温度的字符串”

【概念4:工具使用的实际应用场景】

场景1:信息检索

用例:天气查询智能体
工具:天气 API
流程:
1. 用户:"伦敦天气怎么样?"
2. AI 识别需要天气工具
3. 调用 weather_api("London")
4. 返回:15°C,多云
5. AI 回复:"伦敦现在15°C,多云"

场景2:数据库交互

用例:电商客服智能体
工具:订单查询 API、库存 API
流程:
1. 用户:"我的订单到哪了?"
2. AI 调用订单查询工具
3. 返回:已发货,预计明天到达
4. AI 回复:"您的订单已发货,预计明天送达"

场景3:计算和数据分析

用例:金融分析智能体
工具:计算器、股票 API
流程:
1. 用户:"苹果股票现价多少?如果我150美元买了100股,现在赚多少?"
2. AI 调用股票 API → 当前价 178.15
3. AI 调用计算器 → (178.15 - 150) × 100 = 2815
4. AI 回复:"苹果当前股价178.15美元,您的100股盈利2815美元"

场景4:发送通信

用例:个人助理智能体
工具:邮件 API
流程:
1. 用户:"给张三发邮件,提醒他明天开会"
2. AI 提取收件人、主题、内容
3. 调用邮件 API 发送
4. AI 回复:"邮件已发送给张三"

场景5:代码执行

用例:编程助手智能体
工具:代码解释器
流程:
1. 用户:"帮我算一下1到100的质数有哪些"
2. AI 编写 Python 代码
3. 调用代码执行器运行
4. 返回结果列表
5. AI 回复:"1到100的质数有:2, 3, 5, 7, 11..."

场景6:智能家居控制

用例:智能家居智能体
工具:设备控制 API
流程:
1. 用户:"关掉客厅的灯"
2. AI 识别设备和操作
3. 调用智能家居 API
4. AI 回复:"客厅灯已关闭"

四、实践示例(代码演示)

示例1:LangChain 实现工具调用

from langchain_openai import ChatOpenAI
from langchain_core.tools import tool
from langchain.agents import create_tool_calling_agent, AgentExecutor
from langchain_core.prompts import ChatPromptTemplate

# 初始化模型
llm = ChatOpenAI(model="gpt-4o", temperature=0)

# --- 定义工具 ---
@tool
def search_information(query: str) -> str:
    """
    提供关于特定主题的事实信息。
    用于回答类似"法国首都是哪里"或"伦敦天气如何"的问题。
    """
    print(f"\n--- 🛠️ 工具被调用: search_information, 查询: '{query}' ---")
    
    # 模拟搜索结果
    simulated_results = {
        "weather in london": "伦敦当前天气:多云,温度15°C",
        "capital of france": "法国的首都是巴黎",
        "population of earth": "地球人口约80亿",
    }
    result = simulated_results.get(query.lower(), f"未找到关于'{query}'的具体信息")
    print(f"--- 工具返回: {result} ---")
    return result

tools = [search_information]

# --- 创建智能体 ---
agent_prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个有帮助的助手,可以使用工具来回答问题。"),
    ("human", "{input}"),
    ("placeholder", "{agent_scratchpad}"),
])

agent = create_tool_calling_agent(llm, tools, agent_prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

# --- 运行 ---
response = agent_executor.invoke({"input": "法国的首都是哪里?"})
print(f"\n最终回复: {response['output']}")

代码解读

用户问题 → AI 判断需要工具 → 生成调用请求 → 执行工具 → 获取结果 → 整合回复
    ↓              ↓              ↓            ↓          ↓          ↓
"法国首都"    需要查询!    search("capital   执行函数    "巴黎"    "法国首都是巴黎"
                           of france")

示例2:Google ADK 使用内置工具

from google.adk.agents import Agent
from google.adk.tools import google_search

# 定义使用 Google 搜索的智能体
search_agent = Agent(
    name="search_agent",
    model="gemini-2.0-flash-exp",
    description="使用 Google 搜索回答问题的智能体",
    instruction="我可以通过搜索互联网来回答你的问题,尽管问我任何事!",
    tools=[google_search]  # 内置的 Google 搜索工具
)

# 调用智能体
async def ask_agent(query):
    # ... 会话和执行器设置 ...
    response = await runner.run(query)
    print(f"智能体回复: {response}")

# 示例调用
await ask_agent("最新的 AI 新闻是什么?")

示例3:代码执行工具

from google.adk.agents import LlmAgent
from google.adk.code_executors import BuiltInCodeExecutor

# 定义可以执行代码的智能体
code_agent = LlmAgent(
    name="calculator_agent",
    model="gemini-2.0-flash",
    code_executor=BuiltInCodeExecutor(),
    instruction="""你是一个计算器智能体。
    当收到数学表达式时,编写并执行 Python 代码来计算结果。
    只返回最终的数值结果。
    """,
    description="执行 Python 代码进行计算",
)

# 示例调用
await code_agent.run("计算 (5 + 7) * 3 的值")
# 输出: 36

await code_agent.run("10 的阶乘是多少?")
# 输出: 3628800

五、精华提炼(去废话版)

核心要点(只保留干货):

  1. 突破局限:工具让 AI 能获取实时数据、执行操作 → 从"说"到"做"
  2. 标准流程:定义工具 → AI 决策 → 生成调用 → 执行 → 返回结果
  3. 好的工具定义:清晰的名称、详细的描述、明确的参数 → AI 才能正确使用
  4. 框架支持:LangChain、Google ADK、CrewAI 都提供工具集成能力

必须记住的

工具使用 = AI 的"手脚" = 能查能算能操作

六、行动清单

立即可做(5分钟内):

  • 想一个你希望 AI 能做但目前做不到的事(如查实时数据)
  • 思考需要什么工具才能实现

本周实践

  • 用 LangChain 的 @tool 装饰器定义一个简单工具
  • 创建一个能使用该工具的智能体

进阶挑战

  • 让智能体同时使用多个工具
  • 尝试使用 Google ADK 的内置工具(搜索、代码执行)

七、常见误区

误区1:工具定义太模糊

❌ 错误:description="这是一个工具"
✅ 正确:description="获取指定城市的实时天气,返回温度和天气状况"

误区2:参数说明不清

❌ 错误:def search(q): ...
✅ 正确:def search(query: str) -> str:
         """query: 搜索关键词,如'北京天气'"""

误区3:忽视错误处理

❌ 错误:工具调用失败就崩溃
✅ 正确:捕获异常,返回友好的错误信息

误区4:工具太多太杂

❌ 错误:给 AI 配100个工具
✅ 正确:只配必要的工具,太多会让 AI 困惑

八、学习检查

基础理解

  • 能解释为什么 AI 需要工具
  • 能说出工具使用的六个步骤
  • 理解工具定义的关键要素

实践能力

  • 能用 @tool 装饰器定义工具
  • 能创建使用工具的智能体
  • 能处理工具调用的错误情况

进阶理解

  • 理解函数调用与工具调用的区别
  • 能设计多工具协作的智能体
  • 理解工具使用与其他模式的结合

九、金句收藏

原文金句

"工具使用模式将语言模型从文本生成器变成
能够在数字或现实世界中感知、推理和行动的智能体。"

我的总结金句

"没有工具的 AI 是书呆子,有了工具的 AI 是实干家。"

"AI 的知识有保质期,工具让它永远保鲜。"

"定义好工具,就是给 AI 写好说明书。"

十、画龙点睛

总结升华

工具使用模式的本质是"能力扩展"——
让 AI 从一个"只会说"的语言模型,
变成一个"能做事"的智能体。

这就像人类的进化:
- 原始人只有双手 → 能力有限
- 学会使用工具 → 能力倍增
- 发明各种机器 → 改变世界

AI 也在经历同样的进化:
- 纯语言模型 → 只能生成文本
- 加上工具 → 能查、能算、能操作
- 未来 → 真正的通用智能体

工具使用的哲学

"工具是人类能力的延伸" —— 马歇尔·麦克卢汉

对 AI 来说也是如此:
- 搜索工具 = 延伸的记忆
- 计算工具 = 延伸的大脑
- API 工具 = 延伸的手脚

悬念预告

工具使用让 AI 能"做事"了,但如果任务很复杂,需要制定计划呢?
先做什么、后做什么、遇到问题怎么调整?

下一章,我们将探索"规划模式"——让 AI 学会"运筹帷幄",
像下棋一样思考几步之后的事情。

一句话带走

给 AI 配上工具,它就能从"纸上谈兵"变成"实干家"。

十一、延伸资源

想深入学习

想教给别人

  • 用"餐厅点餐"比喻解释工具使用流程
  • 用"书呆子 vs 实干家"对比说明工具的价值
  • 用"产品说明书"类比解释工具定义的重要性

第六章:规划(Planning)

不谋万世者,不足谋一时;不谋全局者,不足谋一域。会规划的 AI,才能运筹帷幄。


一、一句话定位

规划模式解决什么问题?

规划模式 = 让 AI 学会"先想后做"
就像下棋:不是走一步看一步,而是提前想好几步棋

适合谁学?

  • 需要 AI 处理复杂多步骤任务的开发者
  • 构建自动化工作流的工程师
  • 想让 AI 更"聪明"地完成目标的技术人员

不适合谁?

  • 简单的一问一答场景
  • 解决方案已经明确固定的任务

二、核心框架(知识骨架)

核心观点

复杂任务 ≠ 一步到位
规划模式 = 把大目标拆成小步骤 + 按顺序执行 + 遇到问题能调整
AI + 规划 = 从"执行者"变成"策略家"

关键概念速查表

概念 大白话解释 生活比喻 一句话记忆
规划 制定达成目标的步骤序列 旅行攻略 先想后做
目标分解 把大目标拆成小任务 吃大象要一口一口 化整为零
动态调整 遇到问题能改计划 堵车换路线 随机应变
执行计划 按步骤一步步做 按攻略玩游戏 按图索骥

知识地图

复杂目标 → 理解目标 → 分解任务 → 制定计划 → 执行步骤 → 检查结果 → 调整计划
    ↓          ↓          ↓          ↓          ↓          ↓          ↓
"组织团建"   明确需求    拆成子任务   排好顺序    一步步做    看效果     遇阻调整

三、深入浅出讲解

开场钩子 🎣

想象你要组织一次公司团建:

没有规划的做法

  • “先订酒店吧” → 发现没确定人数
  • “那先统计人数” → 发现没确定日期
  • “那先定日期” → 发现老板那天出差
  • “那换个日期” → 发现酒店没房了
  • ……一团乱麻

有规划的做法

  1. 确定日期(先和老板确认)
  2. 统计人数
  3. 选择目的地
  4. 预订酒店和交通
  5. 安排活动
  6. 通知大家

这就是规划的力量——先想清楚再动手,事半功倍。


【概念1:为什么 AI 需要规划?】

一句话是什么:复杂任务需要多步骤协调,没有规划就会乱套。

生活化比喻

没有规划的 AI = 无头苍蝇

你说:"帮我写一份市场调研报告"

无头苍蝇式:
- 先写个标题?不对,还不知道调研什么
- 先搜索资料?不对,还不知道搜什么
- 先做个大纲?不对,还不知道要包含什么
- ……东一榔头西一棒子

有规划的 AI:
1. 明确调研主题和目标
2. 确定需要收集的信息类型
3. 搜索相关资料
4. 整理和分析数据
5. 撰写报告大纲
6. 填充各部分内容
7. 审阅和润色

规划的核心价值

没有规划 有规划
走一步看一步 提前想好几步
遇到问题才发现 提前预见问题
步骤混乱 步骤有序
容易遗漏 覆盖全面
效率低下 高效执行

引经据典

"凡事预则立,不预则废" —— 《礼记》

翻译成 AI 语言:
复杂任务先规划再执行,才能成功;
不规划就动手,大概率失败。

【概念2:规划模式的核心流程】

一句话是什么:理解目标 → 分解任务 → 制定计划 → 执行 → 检查 → 调整。

生活化比喻

规划模式就像做菜:

1. 理解目标:今晚要做红烧肉
2. 分解任务:
   - 买五花肉
   - 准备调料(酱油、糖、料酒...)
   - 切肉、焯水
   - 炒糖色
   - 炖煮
   - 收汁
3. 制定计划:先买菜,再准备,最后烹饪
4. 执行:按步骤做
5. 检查:尝一下咸淡
6. 调整:太淡加盐,太咸加糖

规划模式的关键特征

┌─────────────────────────────────────────────────────┐
│  1. 目标理解(Goal Understanding)                   │
│     明确要达成什么,有什么约束条件                    │
│     ↓                                               │
│  2. 任务分解(Task Decomposition)                  │
│     把大目标拆成可执行的小任务                        │
│     ↓                                               │
│  3. 计划制定(Plan Formulation)                    │
│     确定任务的执行顺序和依赖关系                      │
│     ↓                                               │
│  4. 计划执行(Plan Execution)                      │
│     按计划一步步执行                                 │
│     ↓                                               │
│  5. 监控调整(Monitor & Adapt)                     │
│     检查执行结果,遇到问题调整计划                    │
└─────────────────────────────────────────────────────┘

幽默包装

规划模式就像程序员接需求:

产品经理:"做一个电商网站"

没有规划的程序员:
"好的!" → 开始写代码 → 写了一半发现需求不清 → 推倒重来 → 
又写了一半发现架构不对 → 再推倒重来 → 项目延期三个月

有规划的程序员:
1. 需求分析:用户能干什么?管理员能干什么?
2. 技术选型:用什么框架?什么数据库?
3. 架构设计:前后端怎么分?模块怎么划分?
4. 任务拆分:登录模块、商品模块、订单模块...
5. 排期计划:第一周做登录,第二周做商品...
6. 开始开发:按计划推进
7. 定期检查:进度如何?需要调整吗?

结果:按时交付,皆大欢喜

【概念3:动态规划 vs 固定流程】

一句话是什么:已知解决方案用固定流程,未知问题用动态规划。

生活化比喻

固定流程 = 按菜谱做菜
- 步骤已知,照着做就行
- 适合:做过很多次的菜

动态规划 = 创意料理
- 根据现有食材即兴发挥
- 遇到问题随时调整
- 适合:第一次尝试的新菜

什么时候用哪种?

场景 选择 原因
新员工入职流程 固定流程 步骤已知且标准化
市场调研报告 动态规划 需要根据发现调整方向
数据备份 固定流程 步骤固定,不需要变化
竞品分析 动态规划 需要根据信息动态调整

权衡取舍

动态规划:
✅ 灵活,能应对变化
❌ 不可预测,可能出错

固定流程:
✅ 可预测,结果稳定
❌ 不灵活,无法应对变化

选择原则:
- "如何做"已知 → 固定流程
- "如何做"需要探索 → 动态规划

【概念4:规划模式的实际应用场景】

场景1:流程自动化

用例:新员工入职
规划:
1. 创建系统账户
2. 分配培训课程
3. 安排导师
4. 协调各部门
5. 发送欢迎邮件

特点:步骤明确,按顺序执行

场景2:研究报告生成

用例:生成市场调研报告
规划:
1. 明确调研主题
2. 收集相关资料
3. 分析数据
4. 撰写大纲
5. 填充内容
6. 审阅润色

特点:需要根据发现动态调整

场景3:复杂问题解决

用例:客户投诉处理
规划:
1. 了解问题详情
2. 诊断问题原因
3. 制定解决方案
4. 执行解决方案
5. 确认客户满意
6. 必要时升级处理

特点:需要根据情况灵活调整

场景4:自主导航

用例:机器人路径规划
规划:
1. 确定起点和终点
2. 分析环境障碍
3. 计算最优路径
4. 执行移动
5. 遇到障碍重新规划

特点:需要实时感知和调整

四、实践示例(代码演示)

示例1:CrewAI 实现规划模式

from crewai import Agent, Task, Crew, Process
from langchain_openai import ChatOpenAI

# 初始化模型
llm = ChatOpenAI(model="gpt-4-turbo")

# 定义规划+执行智能体
planner_writer_agent = Agent(
    role='文章规划师和作者',
    goal='先制定计划,再撰写简洁、有吸引力的摘要',
    backstory=(
        '你是一位专业的技术作家和内容策略师。'
        '你的优势在于先制定清晰、可执行的计划,'
        '确保最终的摘要既有信息量又易于理解。'
    ),
    verbose=True,
    llm=llm
)

# 定义任务:先规划,再执行
topic = "强化学习在 AI 中的重要性"
planning_task = Task(
    description=(
        f"1. 为主题 '{topic}' 创建一个要点式的写作计划\n"
        f"2. 根据计划撰写约200字的摘要"
    ),
    expected_output=(
        "包含两个部分的最终报告:\n\n"
        "### 计划\n"
        "- 摘要的主要要点列表\n\n"
        "### 摘要\n"
        "- 简洁、结构清晰的主题摘要"
    ),
    agent=planner_writer_agent,
)

# 创建并执行 Crew
crew = Crew(
    agents=[planner_writer_agent],
    tasks=[planning_task],
    process=Process.sequential,
)

result = crew.kickoff()
print(result)

代码解读

任务输入 → 智能体理解目标 → 制定计划 → 按计划执行 → 输出结果
    ↓              ↓            ↓           ↓           ↓
"写强化学习"    明确要写什么    列出要点    逐点撰写    完整摘要

示例2:Google Deep Research 的规划流程

用户请求:"研究司美格鲁肽对全球医疗系统的经济影响"

Deep Research 的规划过程:

1. 分解研究问题:
   - 司美格鲁肽是什么?
   - 主要应用领域?
   - 对医疗成本的影响?
   - 对保险系统的影响?
   - 各国的政策反应?

2. 制定搜索计划:
   - 搜索医学文献
   - 搜索经济分析报告
   - 搜索政策文件
   - 搜索新闻报道

3. 执行搜索:
   - 执行多轮搜索
   - 根据发现调整搜索方向
   - 识别知识空白,补充搜索

4. 整合结果:
   - 评估信息可靠性
   - 提炼主要发现
   - 组织成结构化报告
   - 添加引用来源

示例3:OpenAI Deep Research API

from openai import OpenAI

client = OpenAI(api_key="YOUR_API_KEY")

# 定义研究任务
system_message = """你是一位专业研究员,负责准备结构化、数据驱动的报告。
专注于数据丰富的洞察,使用可靠来源,并包含内联引用。"""

user_query = "研究司美格鲁肽对全球医疗系统的经济影响"

# 调用 Deep Research API
response = client.responses.create(
    model="o3-deep-research-2025-06-26",
    input=[
        {"role": "developer", "content": [{"type": "input_text", "text": system_message}]},
        {"role": "user", "content": [{"type": "input_text", "text": user_query}]}
    ],
    reasoning={"summary": "auto"},
    tools=[{"type": "web_search_preview"}]
)

# 获取最终报告
final_report = response.output[-1].content[0].text
print(final_report)

# 查看中间步骤(规划过程)
for item in response.output:
    if item.type == "reasoning":
        print("推理步骤:", item.summary)
    elif item.type == "web_search_call":
        print("搜索查询:", item.action['query'])

五、精华提炼(去废话版)

核心要点(只保留干货):

  1. 先想后做:复杂任务先规划再执行 → 避免混乱
  2. 分解目标:大目标拆成小任务 → 可管理、可执行
  3. 动态调整:遇到问题能改计划 → 灵活应变
  4. 选择合适:已知方案用固定流程,未知问题用动态规划

必须记住的

规划模式 = 运筹帷幄 = 先想清楚再动手

六、行动清单

立即可做(5分钟内):

  • 想一个你之前让 AI 做但效果不好的复杂任务
  • 尝试把它拆解成 3-5 个步骤

本周实践

  • 用 CrewAI 实现一个简单的规划智能体
  • 尝试 Google Deep Research 或类似工具

进阶挑战

  • 实现一个能动态调整计划的智能体
  • 将规划模式与工具使用模式结合

七、常见误区

误区1:所有任务都需要规划

❌ 错误:简单问答也要先规划
✅ 正确:简单任务直接做,复杂任务才需要规划

误区2:计划一旦制定就不能改

❌ 错误:死守原计划,不管遇到什么问题
✅ 正确:计划是起点,遇到问题要灵活调整

误区3:规划越详细越好

❌ 错误:把每个细节都规划好
✅ 正确:规划到可执行的粒度即可,太细反而僵化

误区4:忽视执行监控

❌ 错误:规划完就不管了
✅ 正确:执行过程中要监控,发现问题及时调整

八、学习检查

基础理解

  • 能解释为什么复杂任务需要规划
  • 能说出规划模式的核心流程
  • 理解动态规划和固定流程的区别

实践能力

  • 能把复杂任务分解成可执行的步骤
  • 能用代码实现简单的规划智能体
  • 能根据执行情况调整计划

进阶理解

  • 理解规划模式与其他模式的结合
  • 能设计适应性强的规划系统
  • 理解规划的权衡(灵活性 vs 可预测性)

九、金句收藏

原文金句

"规划模式使智能体不再局限于简单的被动反应,
而是能够以目标为导向地行动。"

我的总结金句

"没有规划的执行是瞎忙,有规划的执行是高效。"

"计划赶不上变化,但没有计划更赶不上变化。"

"好的规划 = 想清楚 + 能调整"

十、画龙点睛

总结升华

规划模式的本质是"战略思维"——
让 AI 从一个只会执行命令的"士兵",
变成一个能运筹帷幄的"将军"。

这就像人类的成长:
- 小孩子:想到什么做什么
- 成年人:先想后做
- 高手:不仅想好怎么做,还想好遇到问题怎么办

规划模式让 AI 具备了这种"高手思维"。

规划的哲学

"运筹帷幄之中,决胜千里之外" —— 《史记》

对 AI 来说:
- 运筹帷幄 = 制定计划
- 决胜千里 = 执行计划达成目标

悬念预告

规划模式让单个 AI 变得更聪明了,
但如果任务太复杂,一个 AI 忙不过来怎么办?

下一章,我们将探索"多智能体协作模式"——
让多个 AI 像团队一样分工合作,各司其职。

一句话带走

复杂任务先规划再执行,AI 也需要"三思而后行"。

十一、延伸资源

想深入学习

想教给别人

  • 用"组织团建"比喻解释规划的必要性
  • 用"做菜"类比解释规划的流程
  • 用"下棋"说明规划的前瞻性

版本信息

  • 文档版本:v1.0
  • 创建日期:2026-01-16
  • 基于材料:Agentic Design Patterns - Chapter 04-06
  • 教学风格:教与学专家(30年教学经验 + 20年学习研究经验)
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐