Docmod:Word文档的XML手术刀
一个被忽视的问题 让AI改一份Word文档,改完之后SmartArt没了,图表炸了,批注消失了,页眉页脚全乱了。它把你的文档拆了,用碎片拼了一个新的。 目前缺少一个好的工具让AI在保留文档完整性的前提下做局部编辑。Docmod就是为了解决这个问题。 问题的根源 .docx本质上是一个ZIP压缩包,里面装着结构化的XML: report.docx (ZIP) ├── [Content_Types].xml ├── word/ │ ├── document.xml ← 正文 │ ├── styles.xml ← 样式定义 │ ├── comments.xml ← 批注 │ ├── header1.xml ← 页眉 │ ├── footer1.xml ← 页脚 │ └── media/ ← 图片 └── _rels/ ← 关系定义 现有方案用OpenXML SDK或python-docx把文档解析成对象模型,让AI操作对象模型,再序列化回docx。在实践中,大多数库的序列化会重写整个XML树。SDK不认识的元素、自定义的命名空间、精心调过的格式——全部丢失。改一个错别字,输出的是一份"长得像原文"的全新文档。 走过的弯路 让AI直接输出OpenXML? OpenXML的复杂度远超AI的舒适区。一个加粗的段落: <w:r><w:rPr><w:b/></w:rPr><w:t>文字</w:t></w:r> 让AI在这种层级的XML里精确操作,错误率极高,调试极痛苦。 用Markdown作为中间格式? 表达力不够。表格合并、精确的字体大小、段落缩进——这些Word文档的核心价值在Markdown中无法表达。用Markdown做中转等于主动丢弃信息。 三个条件交叉筛选——AI的训练数据中大量存在、能表达Word文档的结构和样式、可以做精确的元素级diff——符合的格式只有一个:扁平化的HTML。 核心洞察:扁平HTML作为可diff的中间表示 1995年风格的HTML——每个元素自带完整的内联样式,没有外部CSS,没有继承,没有级联。现代HTML把样式藏在CSS文件里,需要级联计算才能确定最终效果;扁平HTML把这层复杂性彻底消除了。 <h1 data-id="p1" style="font-size:22pt; font-weight:bold;"> 季度报告 </h1> <p data-id="p2" style="font-size:10.5pt; text-indent:2em;"> 营收同比增长<b>23%</b>。 </p> 两个元素的字符串相等,就代表它们在语义上完全相同。 没有CSS级联干扰,变更检测退化为简单的字符串比较。 每个元素上的data-id是手术的定位标记。docx转HTML时,转换器按顺序为每个body元素分配ID,同时建立一张映射表:data-id → 原始document.xml中对应XML节点的(Start, End)索引范围。这张映射表是后续精准定位的坐标系。 ...