大家好,我是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步:
- 准备批量任务清单
- 用Codex生成
planner.py(智谱做计划分析) - 修改主程序支持批量模式
- 运行测试,看到智谱自主规划的完整流程
第一步:准备批量任务清单
在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一起成长。
有问题或建议?后台留言即可。