让 Gemini agent 接手表格整理,最后一步还需要人工确认,通常不是模型能不能做的问题,而是三件事没被界定清楚:任务描述里没说哪些字段可以自动写回、表格结构本身有歧义(合并单元格、空行、多表头)、写回动作一旦执行就不容易回退。要判断卡在哪一步,可以先让 agent 输出从读取到写回的过程记录,再看人工确认是集中在格式类操作还是内容判断类操作上。
判断方向:先定位人工确认发生在读取、处理还是写回阶段,再决定是改任务描述还是改表格结构。适用场景是单表或少量工作表的常规整理;操作上让 agent 分步输出中间记录,并把「需人工确认」写成独立的候选文件;验证方式是同一份样例复跑,比较确认项的数量和类型;边界是内容判断类操作(补全缺失值、合并疑似同一实体)通常无法完全自动化,建议保留人工确认点。
记录表格整理任务的每一步输出
不要只看最终结果表。先要求 agent 在每一步输出一份可核对的中间记录,用来判断问题出在读取范围、处理动作还是写回环节。观察节点可以分成三个:读取时确认实际读到的区域和表头行数;处理时确认哪些单元格被改写、哪些被跳过;写回时确认目标表、写入行数和是否覆盖原数据。
下面是一份通用记录骨架,可放在提示词里,也可以要求 agent 以固定字段返回。字段名可按你的实际字段替换,关键是每步都有可对比的量。
任务:整理表格,并按步骤输出中间记录
要求:每步输出一行 JSON,不要只给最终表
{"step":"read","sheet":"Sheet1","range":"A1:F200","rows":199,"header_rows":1}
{"step":"transform","rule":"统一日期格式","changed_cells":["D12","D13"],"skipped":["D20"]}
{"step":"write","target":"sales_clean.csv","written_rows":199,"overwrite":false}验证方式:把 read 的行数、列数与源表核对,把 transform 的 skipped 列表单独导出,把 write 的 written_rows 与源表行数对比。如果 skipped 那一列有内容,人工确认的来源往往就在这里——agent 主动放弃判断的单元格,而不是它写错的地方。
检查输入表格的合并单元格与空值
很多「最后一步要人工确认」的情况,其实是表格结构在前端就制造了歧义。可以先在源表上做一轮结构体检,再决定要不要让 agent 处理。合并单元格会让某一列只有首行有值,读出来就是大量空值;空行和隐藏行会让行号偏移;多表头会让第一条数据被当成表头。
| 结构特征 | 常见影响 | 观察与处理方式 |
|---|---|---|
| 合并单元格 | 被合并列只有首行有值,其余为空 | 先取消合并并向下填充,或在描述里说明「空值继承上一行」 |
| 空行、空列 | 读取范围判断偏差,行数对不上 | 先删除整行为空的记录,再交给 agent |
| 多行表头 | 第一条数据被识别为字段名,列数少一行 | 在描述里写清表头占几行 |
| 公式与文本混排 | 读到公式结果还是公式文本不确定 | 先复制为值,再上传或传入 |
| 文本前后空格、全半角混用 | 同一客户出现多个不同写法 | 作为格式整理步骤显式声明 |
结构问题通常能在本地用几行脚本或表格软件的「定位空值」功能先看清,比事后追查 agent 的输出更省事。
区分格式整理和内容判断两类操作
人工确认之所以集中在最后,常见原因是格式整理和内容判断被写在同一条指令里,agent 对两类操作的处理能力和可验证性完全不同。格式整理有客观标准,结果可以用行数、列数、schema 或 diff 校验;内容判断没有唯一答案,只能给候选值再让人确认。
| 操作类型 | 示例 | 结果验证方式 |
|---|---|---|
| 格式整理 | 去空格、统一日期格式、调整列顺序、重命名表头、删除完全重复行 | 行数列数比对、字段类型校验、前后 diff |
| 内容判断 | 补全缺失的城市、合并疑似同一客户、判断哪一列为准、纠正疑似错别字 | 输出候选值和依据,抽样人工确认 |
如果确认项集中在格式整理,通常说明任务描述或源表结构还有问题;如果集中在内容判断,属于这类任务的正常边界,重点应转向「让确认点更明确」,而不是追求零确认。
把最后一步改成显式确认点
与其事后人工排查,不如在任务描述里提前声明确认条件、确认对象和确认方式。改写前的描述往往把两类操作混在一起:
# 改写前
帮我把 sales.xlsx 整理一下,合并重复客户,补全缺失的城市,输出到新表。改写后把可自动执行、需人工确认、写入条件和输出格式分开写,agent 就有了明确的停点:
# 改写后
目标:整理 sales.xlsx,输出 sales_clean.csv
可自动执行:
- 删除整行为空的行、去掉文本前后空格
- 日期统一为 YYYY-MM-DD
- 表头重命名:客户名 -> customer_name
需人工确认(不要直接写入最终表):
1) 客户名相似度合并,给出疑似同一实体的候选对
2) 缺失城市补全,给出候选值和判断依据
确认方式:
- 先输出 confirm.csv,列:row_id, field, current, proposed, reason
- 只有 approved=yes 的行才写回最终表
输出格式:CSV,UTF-8,首行表头三个要素要写全:确认条件(什么情况触发确认)、确认对象(哪个字段、哪几行)、确认方式(候选文件还是逐行询问)。确认文件比对话里逐条问更省事,因为确认项可以批量处理,也便于留档。
用同一样例复跑并对比人工确认次数
改完描述后,建议用同一份样例复跑几次,记录每次的确认情况。对比的目的不是证明确认次数一定下降,而是看确认项变得更集中、更可解释。
| 跑次 | 任务描述版本 | 人工确认项 | 确认项类型 | 是否事先声明 |
|---|---|---|---|---|
| 1 | 改写前 | 按实际记录填写 | 格式/内容混合 | 否 |
| 2 | 改写后 | 按实际记录填写 | 主要是内容判断 | 是 |
对比维度建议看四项:确认项数量、确认项是否事先声明、确认项是否集中在内容判断类、agent 的输出是否可以直接接受。如果第二轮确认项仍然很多但都落在内容判断上,这通常是可以接受的边界;如果格式类确认项没有减少,需要回去检查源表结构和描述里的规则是否写清楚。
需要结合环境确认的一点是:不同表格工具、不同文件格式(xlsx 与 csv)对合并单元格和空值的处理方式并不一致,先在小样例上验证一次,再决定是否套用到完整表上。