做这个 XLSX 转 Markdown 转换器的时候,我以为电子表格就是一张网格。有行,有列,输出一张漂亮的 Markdown 表格,旁边再配一个 JSON 数组,收工。这个心智模型撑过了大约三份真实工作簿。
第一次翻车来自一份财务模型。A1:F1 是一行横跨合并的标题,第二行是单位,真正的表头在第三行,而汇总数据被放在它所汇总的数据上方三行。转换器忠实输出了一张 Markdown 表,表头行是 "" | "" | "" | ...,第一行数据是 "Q1 Revenue (USD, thousands)"。技术上完全正确,实际上下游任何想解析它的智能体都只能拿到垃圾。
第二次更糟。一张物流表里,两个逻辑表垂直堆叠,中间隔着一个空行,第三个表并排放在 H 列往后。一个 sheet,三份数据集,没有任何元数据说明这件事。扁平化逻辑把它们交错成了一张缝合怪表——"表 1"的 A 列紧挨着"表 3"的 H 列。
修复办法不是更聪明的解析,而是承认一件事:电子表格是给人眼看的,不是给机器看的。我加了一道表头检测,按类型一致性给候选表头行打分——真正的表头行,下面每一列的类型都一致。又加了一个表边界检测器,在整行全空处切分,在从不共享同一行的列块之间切分。JSON 输出不再假装只有一张表,而是多了一个 tables 数组。多 sheet 工作簿仍按 sheet 顺序扁平化,但每个 sheet 现在会报告自己检测到的表数量。
留下来的教训是:当输入格式是为展示而设计的,转换器的工作就不是提取,而是解释。消费你输出的智能体需要知道人类作者把接缝留在了哪里,因为文件本身不会告诉它。
这套东西最后做成了一个转换器,同时返回一份尽力而为的 Markdown 表和一份结构化 JSON 数组,JSON 现在携带每张表的边界,让下游智能体自己决定"这张表"到底指什么。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.