一句话结论:34 行乱表、8 条规则、63 秒洗完,格式零错误;但它把"完全重复"按自己的理解执行,删掉两行不同订单号的记录。

本次实测

测的是洗数据,办公室里最常见的活。我在沙箱里造了张 34 行的订单表:30 条订单(其中 2 条是重复提交)、1 条合计行、1 条空行、1 条说明行。脏点按真实台账的样子埋——日期六种写法(2026/3/5、3月6日、2026.3.6、03/08/2026 都在),金额五种(1,280元、¥980、1.2万、纯数字、0),手机号带空格、横杠或 +86,城市省市后缀混用,姓名中间夹空格。

任务走 stdin,命令一行:

dsh --profile headless - < prompt.txt

prompt 里列了八条规则:去重复行、去掉合计行空行说明行、日期统一 YYYY-MM-DD、金额转纯数字(1.2万→12000)、手机号留 11 位、城市去省市、姓名去空格、输出 UTF-8。

项目实测值
墙上时间63 秒
模型请求12 轮
工具调用11 次
输出 token10,543
缓存命中 token17,408
产出28 条干净数据

输出之后我没信它的自述,另写了 30 行 Python 逐列正则复核:日期全是四位年月日、金额无逗号无符号、手机号全是 11 位或留空、城市里查不到"省""市""沪"、姓名里没有空格。违规 0 处,金额合计 54,320 元,和我手算一致。

两个判断它做对了,顺手记下来:3月6日 补了年份,03/08/2026 按 月/日/年 解析成 3 月 8 日;SO-1007 手机号原本空的,它没编一个号码填进去。

一条坑:口径它会自己放宽

第一条规则我写的是"去掉完全重复的行,保留第一次出现的"。字面意思,两行完全一样才删。实际产出少了两行:SO-1005 和 SO-1027。它们订单号不同、备注写着"重复提交",其余五列一致。

它把"完全重复"读成"业务字段重复",跳过了订单号和备注。这判断在现实里说得通,重复提交的单子本来就是新单号;可我要的是逐字比较,那这两条有效订单就白丢了。

它没有偷偷删。回执里写了"若按整行所有字段逐字比较,原数据中没有完全相同的两行"。麻烦在于:文件打开是干净的,行数对不上这件事,只有读回执才看得见。

复现一次,规则换成"订单号以外所有字段逐个字比较",并且禁止删行、只加标注列。73 秒,一行没删,dup=1 标了 2 行、clean=0 标了 5 行。它在报告里又补了一句"重复判定未把备注算进去"。它还是在字面上让了一步,只是这次没有单方面动数据。

解法不是把措辞写得更严,写多严都能找到解释的余地。把判断摊到表里:

1. 禁止删行,只加标注列,原始行数一一对应

2. 要求列出每一行被判为重复的明细:哪一行、跟哪一行重、依据哪几列

3. 先看清单,再看文件

代价是一次多花 10 秒,省掉的是月底对账时找差额的那半小时。

还有个小经验:它的推理全走 stderr,这次 23.5 KB,答案走 stdout 只有 1.4 KB。脚本里别把 stderr 丢掉,出问题时能直接看出它在哪一步改了口径。

一句话总评

4.0 / 5。洗格式这活可以交出去,八条规则一次到位,我复核零错误;但删行、改数、合并这类动作,回执得读,判断得自己签。它省下的时间,有一半要还给复核。

文 / 程实