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

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

本文是"智能体设计模式"系列的第二篇,涵盖第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 调用,成本更高

代码示例中的体现

python 复制代码
# 生产者:专注于生成内容
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 函数。

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 实现生产者-评论者模型

python 复制代码
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:深度(厘米)
 - 注意:使用前确认墙内无电线"
→ 用户一看就会

工具定义的关键要素

python 复制代码
@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 实现工具调用

python 复制代码
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 使用内置工具

python 复制代码
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:代码执行工具

python 复制代码
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 实现规划模式

python 复制代码
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

python 复制代码
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年学习研究经验)
相关推荐
Godspeed Zhao1 小时前
现代智能汽车中的无线技术27——Wi-Fi(15)
网络·汽车·智能路由器
m0_748254661 小时前
CSS AI 编程
前端·css·人工智能
愚公搬代码2 小时前
【愚公系列】《AI+直播营销》030-主播的选拔和人设设计(选拔匹配的主播)
人工智能
三不原则2 小时前
故障案例:告警风暴处理,用 AI 实现告警聚合与降噪
人工智能
这张生成的图像能检测吗2 小时前
(论文速读)GNS:学习用图网络模拟复杂物理
人工智能·图神经网络·物理模型
HySpark2 小时前
基于语音转文字与语义分析的智能语音识别技术
人工智能·语音识别
Coder_Boy_2 小时前
基于SpringAI的在线考试系统-考试模块前端页面交互设计及优化
java·数据库·人工智能·spring boot
Maddie_Mo2 小时前
智能体设计模式 第一章:提示链
人工智能·python·语言模型·rag
砚边数影2 小时前
Java基础强化(三):多线程并发 —— AI 数据批量读取性能优化
java·数据库·人工智能·ai·性能优化·ai编程