零基础学 Agent:规划能力——让 Agent 自己把事情做完 第 5 期

0 阅读16分钟

图片

大家好,我是AI淇橦学。

上期我们做了两件大事:接入了智谱API,给Agent装上了真正的AI大脑;建立了客户知识库,智谱能理解「南山区那家传感器公司」这种模糊描述,找到正确客户。

可说实话,做完之后我发现一个挺尴尬的问题:每次只能处理一个客户,处理完才能处理下一个。

假设你今天要给5个客户出报价单——你得跑5次程序,每次输入客户描述、等智谱判断、确认、输入产品信息……重复5遍。如果是20个客户,就是20遍。

这期我们来彻底解决这个问题:给Agent加上规划能力,让它自己读取批量任务、制定执行计划、逐个处理完毕。

做完这期,你会得到:

  • 准备一份批量任务清单,列好客户描述和产品信息
  • Agent读取清单后,智谱自主分析每个任务、匹配客户、制定执行计划
  • 你确认计划后,Agent逐个处理,实时显示进度
  • 全部完成后生成汇总报告

一、没有规划能力是什么体验

图片

先感受一下为什么规划能力这么重要。

现在的程序处理5个客户,是这样的:

1次:python agent.py → 输入描述 → 等智谱判断 → 确认 → 输入产品信息 → 完成
第2次:python agent.py → 输入描述 → 等智谱判断 → 确认 → 输入产品信息 → 完成
第3次~第5次:重复以上步骤...

你等于是在「推着Agent走」——每一步都需要你触发。

有了规划能力之后,是这样的:


python agent.py --batch 批量任务.json
 
🤖 智谱正在分析批量任务,制定执行计划...
 
========== 智谱制定的执行计划 ==========
[1/3] 深圳科技有限公司(智谱置信度95%)
      产品:工业传感器套件 XS-2000B × 1
      报价:¥58,000.00元
      智谱备注:客户偏好传感器套件,价格敏感,建议确认交货期
 
[2/3] 上海贸易集团(智谱置信度92%)
      产品:基础套件 XS-1000 × 10
      报价:¥32,000.00元
      智谱备注:批量采购客户,需开增值税发票,注意备注说明
 
[3/3] 北京智能装备公司(智谱置信度88%)
      产品:高精度控制套件 XS-4000 × 1
      报价:¥125,000.00元
      智谱备注:客户注重稳定性,预算充足,可适当强调售后服务
==========================================
共3个任务,智谱已完成分析。确认执行?(y/n):
 
你:y
 
[1/3] 处理中:深圳科技有限公司... ✅ 完成
[2/3] 处理中:上海贸易集团... ✅ 完成
[3/3] 处理中:北京智能装备公司... ✅ 完成
 
✅ 全部完成!汇总报告已生成:output/批量报价汇总_20250615.txt

你说了一次目标,智谱自己分析、自己规划、自己执行。而且注意计划里多了一行「智谱备注」——这是真正的AI规划才有的东西,它在分析每个任务时,结合客户历史偏好给出了提示,不是死板的字段组装。

坦白说,看完这个输出,我觉得效率提升相当明显。


二、这期智谱具体做什么

图片

在规划能力里,智谱api参与两个关键环节:

环节一:批量客户匹配

把所有任务的customer_keyword一次性发给智谱,让它统一判断每个关键词对应哪个客户,同时给出置信度和匹配理由。这比上期一个一个搜索更高效,智谱还能发现任务之间的关联(比如两个任务描述的是同一个客户)。

环节二:执行计划分析

每个任务匹配到客户后,智谱结合客户资料(行业、备注、历史偏好)分析这个任务,生成一条「智谱备注」——比如发现客户历史上要求开增值税发票,就会在计划里提醒你。这是固定逻辑做不到的,只有真正理解客户资料的AI才能做。


三、目标漂移:批量操作最危险的问题

图片

在讲实操之前,必须先说清楚批量场景特有的风险:目标漂移

⚠️ 什么是目标漂移:你告诉Agent做A,它做着做着变成做B了——没有报错,反而悄悄偏离了目标,去做了一件「相关但你没要求」的事。

在我们的报价单场景里,目标漂移可能是这样的:

你说:「帮我批量生成这3份报价单」

智谱实际做的:生成了报价单,还顺手分析了每个客户的付款风险,还建议你修改某份报价单的金额……

结果:报价单生成了,但智谱做了一堆你没要求的事,甚至可能修改了客户资料文件。

批量操作里目标漂移的后果被无限放大——出错的不仅仅是一份文件,可能是全部。

防范方法:

  • 给智谱的prompt加明确边界:「只做客户匹配和计划分析,不修改任何文件,不做报价单之外的建议」
  • 执行前展示完整计划让你确认:智谱列出它打算做什么,你看完再决定是否执行
  • 所有写入只在output文件夹:代码层面限制写入范围,不依赖智谱自觉

这三条在下面的实操里都会体现。说实话,这些安全机制比功能本身更重要——批量场景一旦出错,代价是很大的。


四、实操开始:给Agent加上规划能力

在第3、4期的基础上继续,不需要新建项目。

这期的实操分4步:

  1. 准备批量任务清单
  2. 用Codex生成planner.py(智谱做计划分析)
  3. 修改主程序支持批量模式
  4. 运行测试,看到智谱自主规划的完整流程

第一步:准备批量任务清单

sales-agent文件夹里新建文件批量任务.json,复制以下内容:


{
  "task_name": "6月第三周报价批次",
  "created_date": "2025-06-15",
  "instructions": "只生成报价单,不修改任何客户资料文件,不做报价单之外的建议",
  "tasks": [
    {
      "customer_keyword": "深圳科技",
      "product_name": "工业传感器套件",
      "product_model": "XS-2000B",
      "quantity": 1,
      "unit_price": 58000,
      "notes": "含安装调试服务,交货期15天"
    },
    {
      "customer_keyword": "上海贸易",
      "product_name": "基础套件",
      "product_model": "XS-1000",
      "quantity": 10,
      "unit_price": 3200,
      "notes": "批量采购,需开增值税发票"
    },
    {
      "customer_keyword": "北京智能",
      "product_name": "高精度控制套件",
      "product_model": "XS-4000",
      "quantity": 1,
      "unit_price": 125000,
      "notes": "含一年免费维保"
    }
  ]
}

📌 注意instructions字段——这是给智谱的约束指令,明确告诉它只能做什么、不能做什么,是防止目标漂移的第一道防线。

你的文件夹结构现在应该是:

1sales-agent/
├── templates/
│   └── 报价单模板.docx
├── output/
├── customers/
│   └── 客户资料.json
├── config.json
├── agent.py
├── llm.py
├── memory.py
└── 批量任务.json        ← 新增

第二步:用Codex生成planner.py

图片

打开Codex,发送以下提示词:


📋 发给Codex的提示词(直接复制使用):


我在做一个销售报价单Agent,需要一个规划模块,文件名planner.py。
已有llm.py(提供ask_zhipu、ask_zhipu_json)和memory.py(提供search_customer、load_config)。
 
【需要实现的功能】
 
1. load_batch_tasks(file_path)
   - 读取批量任务JSON文件
   - 验证格式(必须有tasks数组,每个task必须有customer_keyword)
   - 返回:{"task_name": ..., "instructions": ..., "tasks": [...]}
   - 打印:读取到X个任务
 
2. make_plan(batch_data, customers)
   - 这是核心函数,用智谱来分析所有任务并制定执行计划
   - 参数:batch_data是load_batch_tasks返回的完整数据,customers是客户列表
   - 实现步骤:
 
   步骤A:用智谱批量匹配客户
   构造以下prompt发给ask_zhipu_json:
 
   「以下是客户列表:
   {把每个客户格式化为:编号|公司名|联系人|行业|备注}
 
   以下是需要处理的任务列表:
   {把每个任务格式化为:序号|customer_keyword|product_name|quantity|unit_price}
 
   约束指令:{batch_data["instructions"]}
 
   请为每个任务找到最匹配的客户,并分析任务。
   返回JSON数组,每个元素格式:
   {
     "task_index": 0,
     "matched_customer_id": "C001",
     "confidence": 0.95,
     "match_reason": "关键词深圳科技与公司名高度匹配",
     "total_price": 58000.0,
     "zhipu_note": "该客户偏好传感器套件,对价格敏感,建议在备注中说明交货期"
   }
   如果某个任务找不到匹配客户,matched_customer_id返回null,confidence返回0」
 
   步骤B:根据智谱的返回结果,组装完整的执行计划列表
   每个计划项包含:
   - task_index、customer(完整客户对象)、confidence、match_reason
   - product_name、product_model、quantity、unit_price、total_price(格式化为「¥XX,XXX.00元」)
   - notes、zhipu_note
   - status:confidence > 0.6时为"ready",否则为"needs_confirm"
 
   步骤C:打印完整的计划预览,格式如下:
   ========== 智谱制定的执行计划 ==========
   [1/3] 深圳科技有限公司(置信度95%)
         产品:工业传感器套件 XS-2000B × 1
         报价:¥58,000.00元
         智谱备注:该客户偏好传感器套件,对价格敏感
   [2/3] ...
   ==========================================
   共X个任务,就绪X个,待确认X个
 
   - 返回完整的计划列表
 
3. execute_plan(plan, template_path, output_folder, config)
   - 遍历执行计划,逐个处理
   - 跳过status为"needs_confirm"的任务(在执行前已提示用户)
   - 对每个ready任务:
     a. 调用read_file读取模板(每次重新读取,不复用文档对象)
     b. 组装字段数据:
        客户名称、联系人、联系电话 → 来自customer对象
        报价日期 → 今天日期(从config读取格式)
        销售员 → config["salesperson_name"]
        产品名称、产品型号、数量、单价、总金额、备注 → 来自plan项
     c. 调用write_content填写内容
     d. 调用save_file另存为新文件:报价单_{客户名称}_{日期}.docx
     e. 打印:[X/总数] 处理中:客户名... ✅ 完成 / ❌ 失败(原因)
   - 每个任务记录结果(成功/失败/跳过/原因)
   - 返回执行结果列表
 
4. generate_summary_report(plan, results, output_folder, task_name)
   - 生成文本汇总报告,保存到output文件夹
   - 文件名:批量报价汇总_{task_name}_{日期}.txt
   - 报告内容:任务名、执行时间、成功/失败/跳过数量、每条任务结果
   - 打印:📊 汇总报告已生成
 
【技术要求】
- 从llm.py导入:ask_zhipu_json
- 从agent.py导入:read_file、write_content、save_file
- 从memory.py导入:load_config、save_quote_history
- 代码有清晰的中文注释
- 每个函数要有错误处理,单个任务失败不影响其他任务
- 所有写入只能在output文件夹内,不能修改templates和customers里的文件

图片

Codex自动生成并写入planner.py

从它的操作来看已经顺利完成,并按照预期实现了。


第三步:修改主程序支持批量模式

打开Codex对话框,发送以下提示词修改agent.py


📋 发给Codex的提示词(直接复制使用):


请帮我修改agent.py的main()函数,让程序支持两种运行方式。
 
【方式一:单个客户模式(保留第4期功能,不改动)】
直接运行python agent.py,进入交互模式:
- 加载配置和客户数据
- 提示输入客户描述,调用智谱匹配客户
- 确认后手动输入产品信息,生成单份报价单
 
【方式二:批量模式(新增)】
运行python agent.py --batch 批量任务.json,进入批量模式:
 
1. 加载配置和客户数据
2. 调用load_batch_tasks读取任务文件
3. 打印提醒:
   「⚠️ 批量模式:将生成X份报价单,所有文件保存到output文件夹,原始文件不会被修改」
4. 打印:「🤖 智谱正在分析批量任务,制定执行计划...」
5. 调用make_plan让智谱分析任务并生成计划(这步会调用智谱API)
6. 如果计划中有needs_confirm的任务,打印:
   「⚠️ 以下任务智谱匹配置信度较低,将被跳过:[列出任务]」
7. 提示用户确认:「以上计划是否正确?确认后开始执行 (y/n):」
8. 用户输入y后,调用execute_plan批量执行
9. 执行完成后调用generate_summary_report生成汇总报告
 
【技术要求】
- 用sys.argv或argparse识别--batch参数
- 从planner.py导入load_batch_tasks、make_plan、execute_plan、generate_summary_report
- 代码有清晰的中文注释

第四步:运行测试

先确认单个客户模式没被影响:

1python agent.py

图片

跑一遍,确认第4期的智谱语义搜索功能还正常工作。

再运行批量模式:

1python agent.py --batch 批量任务.json

你会看到智谱真正参与规划的完整过程:


🚀 Agent启动中...
✅ 已加载配置
✅ 已读取3个客户
 
📋 读取批量任务:批量任务.json
✅ 读取到3个任务
 
⚠️  批量模式:将生成3份报价单,所有文件保存到output,原始文件不会被修改
 
🤖 智谱正在分析批量任务,制定执行计划...
 
========== 智谱制定的执行计划 ==========
[1/3] 深圳科技有限公司(置信度95%)
      产品:工业传感器套件 XS-2000B × 1
      报价:¥58,000.00元
      备注:含安装调试服务,交货期15天
      智谱备注:客户偏好传感器套件,对价格敏感,建议确认交货期是否满足需求
 
[2/3] 上海贸易集团(置信度92%)
      产品:基础套件 XS-1000 × 10
      报价:¥32,000.00元
      备注:批量采购,需开增值税发票
      智谱备注:批量采购客户,注意备注中已说明需开增值税发票
 
[3/3] 北京智能装备公司(置信度88%)
      产品:高精度控制套件 XS-4000 × 1
      报价:¥125,000.00元
      备注:含一年免费维保
      智谱备注:客户注重稳定性和售后服务,一年免费维保是重要卖点
==========================================
共3个任务,就绪3个,待确认0个
 
以上计划是否正确?确认后开始执行 (y/n):y
 
🚀 开始执行批量任务...
 
[1/3] 处理中:深圳科技有限公司...
      ✅ 完成 → output/报价单_深圳科技有限公司_20250615.docx
 
[2/3] 处理中:上海贸易集团...
      ✅ 完成 → output/报价单_上海贸易集团_20250615.docx
 
[3/3] 处理中:北京智能装备公司...
      ✅ 完成 → output/报价单_北京智能装备公司_20250615.docx
 
📊 汇总报告已生成:output/批量报价汇总_6月第三周报价批次_20250615.txt
 
✅ 全部完成!成功3份,失败0

注意看「智谱备注」这一行——这是真正的AI规划才有的东西。智谱读懂了每个客户的历史备注,结合当前任务给出了针对性的提示,这是写死的逻辑规则做不到的。 图片

第五步:验收结果

功能验收:
单个客户模式仍然正常(第4期功能没被破坏)
批量模式能正确读取批量任务.json
计划预览中每个任务都有智谱的置信度和备注
用户输入n时程序停止,不执行任何操作
output文件夹里生成了3份报价单,内容正确
汇总报告存在,包含每份报价单的处理状态
templates/customers/`里的原始文件未被修改

加一个低置信度测试:

批量任务.json里一个任务的customer_keyword改成「火星科技公司」(不存在的客户),重新运行批量模式。

期望结果:

  • 智谱返回这个任务的confidence为0,matched_customer_id为null
  • 计划预览里这条任务显示「待确认」
  • 执行时这条任务被跳过
  • 汇总报告里显示「跳过1份,原因:智谱未找到匹配客户」

五、遇到问题怎么办

情况一:make_plan里智谱返回的JSON解析失败

在Codex对话框里说:「planner.py里make_plan调用ask_zhipu_json时解析失败,请检查发给智谱的prompt,在末尾加上更强的约束:『只返回JSON数组本身,不要有任何解释文字、不要有markdown代码块标记(不要有```json)』」

情况二:智谱计划里所有任务都是needs_confirm,置信度都很低

在Codex对话框里说:「make_plan里发给智谱的客户列表格式需要优化,智谱无法正确匹配客户,请修改客户信息的格式化方式,确保每个客户的公司名称、行业、联系人都清楚呈现在prompt里」

情况三:某份报价单打开是空白的

在Codex对话框里说:「output/报价单_xxx.docx打开是空白,请检查execute_plan里是否每次都重新调用了read_file读取模板,确认没有复用同一个文档对象——每份报价单必须从干净的模板开始,不能继承上一份的内容」

情况四:智谱API调用太慢,批量任务等很久

这是正常现象。智谱分析3个任务大约需要3-8秒。如果任务很多(比如20个),可以在Codex对话框里说:「请优化make_plan,把所有任务一次性发给智谱分析,而不是逐个调用API——现在是1次API调用分析所有任务,不要改成多次调用」


六、这期做了什么——小结

这期你给Agent装上了真正的AI规划能力:

  • planner.py:智谱批量分析任务、匹配客户、生成带备注的执行计划
  • agent.py升级:支持单个模式和批量模式
  • 智谱的参与从「搜索一个客户」升级到「分析一批任务、给出完整规划」

现在的文件结构:


sales-agent/
├── templates/
├── output/
├── customers/
├── config.json
├── agent.py       ← 工具 + 主程序(第3期起)
├── llm.py         ← 智谱API封装(第4期加入)
├── memory.py      ← 记忆 + 单客户搜索(第4期)
├── planner.py     ← 智谱规划 + 批量执行(本期新增)
└── 批量任务.json

坦白说,做完这个功能之后,我觉得效率提升相当明显。以前要跑5次程序,现在一次就能批量处理完,而且还有汇总报告,省了不少事。

现在Agent能批量处理任务了,但还有一个问题没解决:智谱和程序都说「全部成功」,但填进报价单的内容真的是对的吗?  金额有没有填错位置?客户名称有没有张冠李戴?

下期我们来解决这个问题——让智谱在保存每份文件之前,先自己检查结果是否正确。


下期预告:  Agent说「全部完成」不代表全部正确。第6期我们给它加上智谱自检——在保存前让智谱审查每份报价单,判断字段有没有遗漏、内容有没有填错位置。我们还会故意制造两种错误,看智谱能不能发现并拦截。

思考题:  你看了智谱给每个任务写的备注,有没有觉得它的分析准确?还是有什么明显的错误?评论告诉我,我会在下期开头汇总。


关注公众号「AI淇橦学」,和AI一起成长。

有问题或建议?后台留言即可。