零基础学 Agent:评估与自检——让智谱审查每一份报价单 第 6 期

0 阅读13分钟

图片

大家好,我是AI淇橦学。

上期我们给 Agent 装上了规划能力:智谱批量分析任务、匹配客户、制定带备注的执行计划,你确认后自动生成所有报价单。

但跑完批量任务之后,你有没有逐一打开每份报价单检查过?

报价金额有没有填到了联系电话那一栏?客户名称有没有张冠李戴?日期格式对不对?

如果你有 10 份报价单,逐一检查要花不少时间。如果没检查就直接发给客户——发出去之后才发现金额写错了,那就麻烦了。

这期我们来解决这个问题:在每份报价单保存之前,让智谱先审查一遍,发现问题自动拦截,不让错误的文件进入 output 文件夹。

做完这期,你会得到:

  • 一个 validator.py 自检模块,保存前自动执行两层检查
  • 第一层:程序规则检查(快速扫描有没有未填写的占位符)
  • 第二层:智谱智能审查(理解字段内容是否合理,发现规则检测不到的问题)
  • 实际演示:故意制造两种错误,看智谱能不能发现并拦截

一、最重要的认知:没有报错 ≠ 做对了

很多人默认「程序没报错,就说明成功了」。这个逻辑在传统软件里大致成立,但 Agent 不一样——它可以完美地「执行成功」一件错误的事。

来看一个我们场景里真实可能发生的情况:

你让 Agent 批量处理 3 份报价单,它告诉你:「✅ 全部完成,成功 3 份,失败 0 份。」

你打开第一份报价单……

图片

字段内容都是真实的,都来自客户资料——但全部填错了位置。Agent 没有报错,因为它确实把每个字段都写入了内容,每一步都「执行成功」了。

「执行成功」说的是步骤完成了,不是结果正确了。  这两件事必须分开验证。

坦白说,这个问题如果不解决,Agent 批量处理的越多,出错的概率就越大,最后可能还不如手动填单。


二、为什么用智谱来做自检,而不是规则

图片

你可能会想:用正则表达式也能检查字段格式,为什么要用智谱?

规则检查的局限在于:它只能检查你预先想到的情况。

比如金额字段,规则可以检查「必须包含数字」,但检查不了这些:

  • 「2025年6月15日」——包含数字,但明显是日期不是金额
  • 「李总」——纯文字,规则能发现,但不知道这是联系人名字填错了位置
  • 「XS-2000B」——包含数字,规则认为通过,但这是产品型号不是金额

智谱(大模型)不一样。它理解字段含义——「报价金额字段里填了一个日期」这件事,智谱一眼就能看出来是错的,不需要你提前写规则覆盖每种情况。

所以这期的自检设计是两层结合

  • 第一层:程序规则检查(快、不消耗 API)——检查有没有未替换的占位符,这种明确的问题用规则检查最高效
  • 第二层:智谱智能审查(慢一点、消耗 API)——把填好的报价单内容发给智谱,让它判断每个字段的内容是否合理,覆盖规则检测不到的问题

两层都通过,才保存文件。

我觉得这个设计挺巧妙的——规则检查过滤掉低级错误,智谱处理复杂问题,既节省 API 费用,又能保证质量。


三、报价单场景的 4 种常见错误

图片

了解具体会出什么错,才能理解为什么需要两层检查。

① 字段遗漏:有些占位符没被替换,还是 【产品名称】 这种原始状态。规则检查能发现。

② 字段错位:内容是真实的,但填错了位置——联系人填到了联系电话那栏。规则难以发现,智谱能发现。

③ 格式错误:内容位置都对,但格式不符合要求——金额写成了「58000」而不是「¥58,000.00元」。智谱能判断。

④ 内容异常:字段里填了明显不合逻辑的内容——金额字段填了「待定」、日期字段填了产品型号。规则难以完全覆盖,智谱能理解。

这四种错误,我在实际测试中真的都遇到过。所以这期的自检不是过度设计,而是实打实的需要。


四、实操开始:给 Agent 加上两层自检

在第3、4、5期的项目基础上继续。

这期的实操分 3 步:

  1. 用 Codex 生成 validator.py(两层检查:规则 + 智谱)
  2. 把自检接入批量处理流程
  3. 故意制造错误,测试智谱能否发现并拦截

第一步:用 Codex 生成自检模块

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


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

12345678910111213141516171819202122232425262728293031323334我在做一个销售报价单 Agent,需要一个自检模块,文件名 validator.py。
已有 llm.py(提供 ask_zhipu、ask_zhipu_json)可以调用智谱 API。
 
自检分两层:第一层用程序规则检查,第二层用智谱做智能审查。
 
【需要实现的功能】
 
1. check_completeness(doc)
   【第一层:程序规则检查】
   - 扫描整个 Word 文档(doc 对象)的所有段落和表格单元格
   - 找出所有仍然包含【和】的文本(说明占位符未被替换)
   - 返回:{"passed": True/False, "missing_fields": [未替换的占位符列表]}
   - 打印:✅ 完整性检查通过 / ❌ 发现未填写字段:【xxx】
 
2. check_by_zhipu(doc, customer_name, field_data)
   【第二层:智谱智能审查】
   - 参数:doc、customer_name、field_data
   - 把 field_data 格式化成清单文本
   - 构造发给智谱的 prompt,让它检查字段内容是否合理
   - 调用 ask_zhipu_json 获取智谱的判断
   - 打印智谱的审查结果
   - 返回:{"passed": True/False, "issues": [...]}
 
3. validate(doc, customer_name, field_data)
   - 依次执行两层检查
   - 第一层失败直接返回,不调用第二层
   - 两层都通过才返回 valid=True
 
【技术要求】
- 从 llm.py 导入:ask_zhipu_json
- 使用 python-docx 操作 Word 文档对象
- 代码有清晰的中文注释
- 每个函数要有错误处理
- 第一层失败时不调用智谱(节省 API 费用)

Codex 生成后写入 validator.py图片

第二步:把自检接入批量处理流程

修改 planner.py,在每份报价单保存之前插入自检步骤。

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


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

12345678910111213141516171819202122请帮我修改 planner.py 的 execute_plan 函数,
在每份报价单保存之前加入两层自检。
 
【修改逻辑】
 
原来的流程:
  组装 field_data → write_content → save_file
 
修改后的流程:
  组装 field_data → write_content → validate(两层自检)→ 根据结果决定是否 save_file
 
【具体规则】
1. 调用 write_content 得到填写好的文档对象 doc
2. 调用 validator.py 的 validate(doc, customer_name, field_data) 执行自检
3. 如果 validate 返回 {"valid": True}:调用 save_file 保存文件
4. 如果 validate 返回 {"valid": False}:不保存文件,记录失败原因,继续处理下一个任务
 
【汇总报告修改】
在 generate_summary_report 里,统计分三类:
- 成功:两层自检通过并已保存
- 自检失败:自检未通过,附上智谱发现的具体问题
- 执行失败:程序报错

第三步:故意制造错误,测试智谱自检效果

图片

这是这期最重要的一步——不实际测试,你不知道智谱自检是否真的在工作。

我们分别制造两种错误,分别触发两层检查。


测试一:触发第一层(完整性检查)

打开 批量任务.json,把第一个任务的 product_name 改成空字符串:

12345678{
  "customer_keyword": "深圳科技",
  "product_name": "",
  "product_model": "XS-2000B",
  "quantity": 1,
  "unit_price": 58000,
  "notes": "含安装调试服务"
}

【产品名称】 占位符不会被替换,完整性检查应该在第一层就拦截,不需要调用智谱。


测试二:触发第二层(智谱审查)

把第二个任务的 unit_price 改成日期字符串(模拟字段错位):

12345678{
  "customer_keyword": "上海贸易",
  "product_name": "基础套件",
  "product_model": "XS-1000",
  "quantity": 10,
  "unit_price": "2025年6月15日",
  "notes": "批量采购"
}

金额字段填了日期——这个完整性检查会通过(占位符已被替换),但智谱审查时应该发现「报价金额字段里填了一个日期,不是金额」。


运行测试:

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

期望看到的结果:

123456789101112131415161718192021222324252627282930🚀 开始执行批量任务...
 
[1/3] 处理中:深圳科技有限公司...
===== 自检报告:深圳科技有限公司 =====
第一层(完整性):❌ 失败 — 发现未填写字段:【产品名称】
=====================================
⚠️ [1/3] 深圳科技有限公司:自检未通过,已跳过保存
(第一层失败,未调用智谱,节省 API 费用)
 
[2/3] 处理中:上海贸易集团...
===== 自检报告:上海贸易集团 =====
第一层(完整性):✅ 通过
🤖 正在调用智谱审查报价单内容...
第二层(智谱审查):❌ 失败
   智谱发现问题:报价金额字段填入了「2025年6月15日×10」,
   这是日期格式而非金额,疑似字段错位
=====================================
⚠️ [2/3] 上海贸易集团:自检未通过,已跳过保存
 
[3/3] 处理中:北京智能装备公司...
===== 自检报告:北京智能装备公司 =====
第一层(完整性):✅ 通过
🤖 正在调用智谱审查报价单内容...
第二层(智谱审查):✅ 通过 — 所有字段内容合理
=====================================
✅ [3/3] 北京智能装备公司 → output/报价单_北京智能装备公司_20250615.docx
 
📊 汇总报告已生成:output/批量报价汇总_20250615.txt
 
✅ 执行完成:成功 1 份,自检失败 2 份,执行失败 0 份

注意两个细节:

第一,测试一在第一层就被拦截了,没有调用智谱。这很重要——完整性这种简单问题不应该浪费 API 费用,先用规则快速过滤。

第二,测试二第一层通过了,智谱才被调用,而且智谱发现了「金额字段填了日期」这种规则写不出来的问题,说清楚了原因。

坦白说,第一次看到这个输出时,我觉得挺震撼的——智谱真的能发现这种隐藏很深的错误。

测试完成后,把 批量任务.json 改回正确数据,再跑一遍,确认 3 份全部通过两层自检并保存成功。 图片

第四步:验收结果

功能验收:
字段遗漏测试:product_name 为空时,第一层拦截,智谱未被调用,文件不被保存
字段错位测试:金额填日期时,第一层通过,智谱发现问题,文件不被保存
正常数据测试:所有字段正确时,两层全部通过,文件正常保存
自检失败不影响其他任务:前两份失败,第三份仍然正常处理
汇总报告里包含自检失败的具体原因(智谱说的是什么)
output 文件夹里没有自检失败的报价单文件
templates/ 和 customers/ 里的原始文件未被修改


五、遇到问题怎么办

情况一:第一层明明有未替换的占位符,但没被检测到

在 Codex 对话框里说:「check_completeness 没有检测到【产品名称】这个未替换的占位符,请检查扫描文档的逻辑,确认同时遍历了所有 paragraphs 和 tables 里的 cells」

情况二:智谱审查总是通过,连明显错误也没拦截

把具体情况告诉 Codex:「check_by_zhipu 里,报价金额填了『2025年6月15日』这个日期,但智谱返回了 passed: true,请检查发给智谱的 prompt,确认字段清单格式是否正确」

情况三:智谱审查太严格,正确的内容也被标记为失败

把具体误判发给 Codex:「智谱把『¥58,000.00元』这个正确的金额标记为有问题,请修改发给智谱的 prompt,明确说明报价金额的合法格式」

情况四:API 费用问题——每份报价单都要调用智谱,费用会不会很高

不用担心。每次智谱审查一份报价单大约消耗 500-800 个 Token,用 glm-4-flash 模型的费用很低。处理 100 份报价单的智谱审查费用不到 1 元人民币。


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

这期你给 Agent 装上了两层自检:

  • 第一层(程序规则) :快速扫描有没有未替换的占位符,有问题直接拦截,不调用智谱
  • 第二层(智谱审查) :理解每个字段的内容是否合理,发现规则检测不到的字段错位、内容异常等问题
  • 两层都通过,才保存文件

现在你的 Agent 有了真正的自我保护能力——不只是「有没有报错」,而是智谱真正读懂了报价单内容,判断填写是否正确。

坦白说,做完这个功能之后,我觉得心里踏实多了。以前批量生成报价单,总是担心万一填错了怎么办,现在有智谱帮我把关,质量有保障了。

到这里,所有模块全部做完了:

模块文件AI 参与了什么
工具agent.py文件读写(无需 AI)
大模型接口llm.py封装智谱 API,供所有模块调用
记忆memory.py智谱做语义理解,匹配客户描述
规划planner.py智谱分析任务,制定执行计划
自检validator.py智谱审查报价单,判断内容合理性
配置config.json长期偏好设置(无需 AI)

现在这 6 个模块全部在终端里运行——下期我们做最后一步:把它们装进一个桌面窗口应用,有界面、有按钮、有进度条,任何人打开就能用。


下期预告:  第7期是整个系列最后的整合。我们把前6期的所有模块装进一个 tkinter 桌面窗口应用——有界面、有按钮、有进度条、有结果展示。做完之后,你把这个程序发给完全不懂技术的同事,他打开就能用,不需要任何命令行操作。

思考题:  你让智谱审查报价单时,它发现了什么你没想到的问题?还是有什么明显的错误它没发现?评论告诉我,我会在下期开头汇总。


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

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

后台回复“Agent”,领取课程讲义文件。