🔌 第11章 基于MCPServer的办公效率类智能体应用
📄 一句话概括

一句话里要先抽出四件事:行是什么、列是什么、什么类型、什么单位。 表里的数一律由代码算。模型心算出来的合计,错了看不出来。 最后一条自检最硬:分组小计加起来,必须等于总计。

📝 本章和前面几章的关系

上一节的产出物是一个网页,这一节是一张表。表比网页多一层麻烦:数得对。 这一节的三个场景(销售、财务、教育)用的是同一套流程,只是算法不同。 教材这一节是在办公平台里配表格工具做的。界面操作照原样说明,算法部分全部真跑。

一、搭建:先抽出四件事,再动手

用户的原话:「把这几个月的销售数据整理成表,按区域和月份统计」。 这句话里藏着四件事,都得先定下来:行是什么、列是什么、什么类型、什么单位。 行错了,明细和汇总会混在一张表里;列少了,后面分析要重做;类型错了,金额是文本,求和就是零; 单位错了,元写成万元,差一万倍。

四件事里类型和单位最容易漏。文本型的金额在表格里看着和数字一模一样,一求和全零,而且不报错。 所以这一类智能体的第一步不是生成,是把结构问清楚。 问不清就先按最常见的那套定,然后在返回里写明假设。

二、生成:写完立刻读回来数一遍

演示 ② 里写入 sales.csv,返回 5 行 4 列。 这个数是从写下去的内容里数出来的,不是模型说的。这一步能立刻发现「模型少写了一列」。 和第 10 章那个字节数是一个道理:能数的东西,返回里就带上。

为什么要读回来数,而不是边写边数?因为写下去之后可能被截断、被转义、被去重。 以落盘后的内容为准。 这一步成本极低,收益极高。凡是「生成一个结构化文件」的工具,都该这么写。

三、算:三个场景,三种算法

演示 ③ 那张手写表里列了三个场景:销售看各区域合计、财务看环比增长、教育看及格率。 三个算法都很简单:分组求和、除以上月再减一、及格人数除以总人数。 简单到模型每次都能算——也每次都可能算错。 所以演示里换成了实测:华东 271500 元、华南 200200 元、华北 78000 元,环比华东 +12.1%、华南 +8.5%。 这三个数是代码算的。

那张手写的示例表和实测表对不上,正好说明一件事:手写的表只能当示意,不能当结果。 第一条规矩就这么来的:表格里的数必须由代码算,不能让模型心算。心算错了,表面上跟对的一模一样。

四、图:工具只给数,画图交给前端

演示 ④ 那张表比了三种做法:工具直接返图片、工具返数据前端画、工具返表格。 办公场景里最多的是第二种:工具出数,让 Excel 或者网页去画图。 因为图表的样式是审美问题,每次都要调。塞进工具里就是死路——改一个颜色要重新生成一次。

这一条和第 11.1 那个「工具负责机械检查、人负责审美」是同一句话的两面。 所以表格类工具的边界很清楚:算数、排版、导出,三件事;画图不在这三件里。

五、验收:四条自检,最后一条最硬

演示 ⑤ 那四条:列名齐不齐、类型对不对、有没有空值、合计对不对。 前三条靠眼和代码都能查。第四条是最好的自检:分组小计加起来,必须等于总计。 这次是 549700 等于 549700。 不等就说明有一行没被分进任何组——往往是区域名多了个空格,或者大小写不一致。

这类错误不报错、不显眼,只有对总数才能发现。所以但凡做了分组,就顺手做一次总和校验。 这条也能推广:任何汇总都要有一个能反算回去的校验数。行数、总和、笔数,随便哪一个, 只要有对照就够。

六、动手 Demo:数据表格:先定结构,再填数

造一个表格 Server:一个 make 工具,负责把 csv 落盘并返回行列数。 用同一份数据算三种东西:分组求和、环比、及格率。 最后跑四条自检,看分组小计和总计对不对得上。

tb = Server('sheet-mcp')
tb.add(Tool('sheet.make', '把一段 csv 写成文件,返回行数和列数', SCHEMA, mk))

print(call(tb, 'sheet.make', {'name': 'sales.csv', 'csv': CSV}))

rows = read_csv('sales.csv')                 # 读回来,以落盘内容为准
by = group_sum(rows, 'region')               # 分组求和
mom = growth(rows, 'region', 'month')        # 环比
print(by, mom)
print(sum(by.values()) == sum(r['amount'] for r in rows))   # 549700 对 549700

实跑输出:

--------------------------------------------------------------------
数据表格:先定结构,再填数
--------------------------------------------------------------------


  ① 一句话里要先抽出「列」
  --------------------------------------------------------------------
  用户:把这几个月的销售数据整理成表,按区域和月份统计

| 要定的 | 说明 | 定错了会怎样 |
|---|---|---|
| 行是什么 | 一个区域一个月一行 | 明细和汇总混在一张表 |
| 列是什么 | 区域、月份、金额、单量 | 少一列就得重做 |
| 类型 | 金额是数字,不是文本 | 排不了序、算不了和 |
| 单位 | 元还是万元 | 差一万倍 |

  四件事里【类型和单位最容易漏】。文本型的金额在表格里看着一样,一求和就全零。

  ② 生成一张表,再读回来验
  --------------------------------------------------------------------
  写入 sales.csv:5 行 4 列
  【行数和列数是从写下去的内容里数出来的,不是模型说的。】这一步能立刻发现「模型少写了一列」。

  ③ 三个场景,三种算法
  --------------------------------------------------------------------

| 场景 | 要看什么 | 怎么算 | 结果 |
|---|---|---|---|
| 销售 | 各区域合计 | 按区域分组求和 | 华东 271500 / 华南 200200 / 华北 78000 |
| 财务 | 环比增长 | (本月-上月)/上月 | 华东 +12.1%、华南 +8.5% |
| 教育 | 及格率 | 及格人数 / 总人数 | 这里没有这类数据 |

真算一遍,把上面那个表换成实测:

| 区域 | 合计 | 环比 |
|---|---:|---|
| 华东 | 271500 元 | — |
| 华北 | 78000 元 | — |
| 华南 | 200200 元 | — |

环比:华东 +12.1%、华南 +8.5%。
  这张表是代码算的。【上面那张是手写的示例,两张对不上就说明手写的错了。】
  所以做这类工具的第一条规矩:【表格里的数必须由代码算,不能让模型心算。】

  ④ 图表:工具不画,只给数
  --------------------------------------------------------------------

| 做法 | 优点 | 缺点 |
|---|---|---|
| 工具直接返回图片 | 拿过来就能看 | 改一个颜色要重新生成 |
| 工具返回数据,前端画 | 可交互、可改样式 | 要多一步 |
| 工具返回表格 | 最通用 | 看不出趋势 |

  办公场景里最多的是第二种:【工具出数,让 Excel 或网页去画图。】
  因为图表的样式是审美问题,每次都要调,塞进工具里就是死路。

  ⑤ 这张表能不能直接用
  --------------------------------------------------------------------

| 检查 | 怎么看 | 这次 |
|---|---|---|
| 列名齐不齐 | 对比需求里的四列 | 齐 |
| 类型对不对 | 金额是不是能求和 | 能,是数字 |
| 有没有空值 | 逐格看 | 没有 |
| 合计对不对 | 分组和加起来等于总和 | 549700 = 549700 |

  最后一行是最好的自检:【分组小计加起来,必须等于总计。】不等就说明有一行没被分进任何组。

①第一张表四行,第三列是「定错了会怎样」。类型和单位那两行的问题最隐蔽。 ②第二段两个数:5 行 4 列,是从落盘内容里数出来的,不是模型报的。 ③第三段那张实测表三行,合计 549700。旁边那个「—」表示这三个月只有一个月的数据,算不出环比。 ④环比只有华东和华南有数:+12.1% 和 +8.5%。华北缺上月,所以空着,不硬凑。 ⑤最后一行 True 是总和校验:分组小计加起来等于明细总和。这一行比前面所有输出都重要。

30 秒实验

  1. 把某个区域的金额改成文本型(加一对引号),重跑求和,看结果变成什么。
  2. 故意把一行的区域名后面加个空格,看总和校验会不会报 False。
  3. 再加一列「单量」,重跑环比,看算法要不要改。

常见误区

  1. 「让模型算合计更快。」它算得出也会算错,错了跟对的一模一样。让代码算。
  2. 「金额是文本也没关系,看着一样。」一求和全零,而且不报错。
  3. 「分组小计对得上就行,不用对总和。」只有对总和才能发现漏分组的那一行。
自测三问(点开对答案) 1. 生成表格前必须先定哪四件事? —— 行是什么、列是什么、什么类型、什么单位。类型和单位最容易漏。 2. 为什么写完要读回来数行列? —— 以落盘内容为准。写下去可能被截断或转义,读回来数才能发现少写一列。 3. 最好的表格自检是哪一条? —— 分组小计加起来等于总计。不等就说明有一行没被分进任何组。

表是「有数据才有产出」。下一节反过来:手上什么都没有,只有一团想法。产出物从表变成了一棵树。

相关笔记