在 HN 发布: Vespper (YC F24) – 顶尖 Docx MCP

Hacker News Top 工具

摘要

Vespper 推出了一款新的 MCP 工具,供 AI 代理编辑 Word 文档,性能比现有解决方案快 3 倍,成本降低 2 倍,且准确性更高。

大家好!我们是来自 Vespper 的 Dudu 和 Topaz(<a href="https:&#x2F;&#x2F;vespper.com">https:&#x2F;&#x2F;vespper.com</a>)。Vespper 是一个 MCP,让 AI 代理能够高效编辑 Word 文档,由我们微调的模型驱动。目前,它比最接近的替代方案快 3 倍,便宜 2 倍,且更准确。查看产品工作原理概述:<a href="https:&#x2F;&#x2F;youtu.be&#x2F;odKxsgPjzzw" rel="nofollow">https:&#x2F;&#x2F;youtu.be&#x2F;odKxsgPjzzw</a><p>在花了一年时间为制药公司构建 AI 文档编辑器后,我们开始着手解决这个问题。在此之前,Topaz(我自己)是 Snyk 的高级软件工程师,负责分布式系统;Dudu 是 Viz.ai 的深度学习工程师,构建用于中风检测的计算机视觉模型。 我们的编辑器帮助制药公司生成监管文件(例如 CSRs)以加快提交速度。最初,输出是 Markdown,在所见即所得编辑器中显示。然而,用户更喜欢使用他们自己的 Word 模板。问题就从这里开始了。<p>AI 代理不擅长编辑 Word 文档。Word 文档是一个 zip 文件,包含遵循 OOXML 规范的冗长 XML 文件。即使是“小”修改也需要复杂操作,例如:添加编号列表需要在 numbering.xml 中创建条目并分配新 ID,然后在 document.xml 中链接回去;加粗句子需要将其拆分为 3 个以上的运行元素。诸如此类。<p>这使得直接编辑 zip 文件(解压 + grep + sed)对代理来说是个坏主意,因为它们会在这些机制上消耗大量时间和令牌。 实际上,当前的工具大致分为三类。你可以让代理使用底层库(如 python-docx 或 Open XML SDK)编写代码,可以为其提供带有固定编辑工具的 MCP(如 SuperDoc、Office CLI、Adeu 等),或者可以通过 pandoc/mammoth.js 等工具将文件在 Markdown/HTML 之间转换。 这些方法都不理想。前两类仍然让代理的上下文消耗在 Word 机制上,而不是手头的任务(MCP 还引入了新的 DSL 需要学习),第三类则非常损失保真度(pandoc/mammoth.js 等无法保留足够的精度)。<p>根据亲身经验,这些问题会影响下游任务的性能。<p>当我们尝试让代理填写大型文档时,事情很快就失控了。上下文窗口已经充满了客户数据(文件、用户上下文、全局规则等),而代理消耗令牌和时间来探索文档并调试失败的编辑。填写一份 CSR(临床研究报告)大约需要 50 分钟,结果很差(遗漏字段/章节、样式损坏等)。Harvey.ai 的团队也得出了类似结论:<a href="https:&#x2F;&#x2F;www.harvey.ai&#x2F;blog&#x2F;building-an-agent-for-complex-document-drafting-and-editing" rel="nofollow">https:&#x2F;&#x2F;www.harvey.ai&#x2F;blog&#x2F;building-an-agent-for-complex-doc...</a><p>那时我们调整了重点。我们设计了一个 MCP,让代理可以像编辑 HTML 一样编辑 Word 文档。代理接收 HTML,进行查找替换编辑,然后我们将这些编辑重新整合回原始 .docx 文件。 我们选择 HTML 而不是 Markdown,是因为它在结构上更接近 OOXML,并且 CSS 以类似 OOXML 的方式将样式与元素关联。我们不得不编写自己的 DOCX→HTML 转换器,因为 pandoc 和 mammoth.js 无法保留足够的精度。 需要明确的是,我们的 DOCX → HTML 转换也是有损的。但这没问题,因为我们从不将 HTML 转换回 DOCX。HTML 只是代理的投影,因此只需要足够的精度让代理理解其编辑内容的结构和样式。原始文件仍然是事实来源,我们直接对其进行修改。<p>这也意味着代理不需要学习新的 DSL。编辑 Word 文档就像在文件系统上编辑 HTML 文件一样,这是代理已经擅长的事情。许多 DOCX MCP 向代理提供数十甚至数百个工具以供即时使用。我们的 MCP 只公开三个工具(读取、搜索、编辑)。Word 文档被完全抽象化了。<p>当代理向我们发送编辑请求(一个“old_html”和“new_html”对)时,我们会将其重新整合到原始 .docx 文件中。重新整合由我们微调的模型驱动,该模型是一个带有 LoRA 适配器的 3-8B 基础模型。它以 HTML 差异作为输入,连同原始的本地化 OOXML 块,并生成新的 OOXML。“本地化”是确定性完成的:我们获取代理指定的锚点,并尝试找到它们的 XML 对应物,因此重新整合模型只有一个职责。 在这个狭窄任务上,一个小模型达到了前沿、经过良好提示调整的模型的水平,同时足够小和快速,可以放在热路径中。<p>这个项目变成了几个月的工作,但我们很高兴发布 v1 版本。我们的内部基准测试显示,它比 DOCX 技能和原始 python-docx 更准确,同时便宜约 2 倍,快约 3 倍,主要是因为每个任务只需 3 次工具调用(p50),而 DOCX 技能需要 10 次,Office CLI 需要 13 次。<p>事情还不完美。例如,我们目前不支持操作图像或评论。不过,我们已经看到人们以各种方式使用我们的 MCP:<p>- 法律科技公司在 Office.js 中驱动其实时编辑流程。<p>- AI 初创公司优化人们的简历并代为申请。<p>- 需要起草政策备忘录的政府技术部门。<p>- 使用长期运行的代理完成监管表单的生命科学初创公司。<p>关于隐私的说明:我们的 MCP 在云端运行,因此用户将 .docx 文件发送给我们。我们不使用用户数据进行训练,团队可以选择零数据保留(ZDR)或自托管。<p>每月有 500 次编辑的免费层级,欢迎大家试用。我们希望以后能提高这个额度,但我们是一个小团队,运行微调模型并不便宜 :(<p>我们很想听听您关于 docx 编辑的任何想法和评论!我们将在接下来的几个小时内在评论区回复
查看原文
查看缓存全文

缓存时间: 2026/09/28 19:48

# 推出 Vespper DOCX MCP:速度提升3倍、成本降低50%、准确性更高 来源:https://www.vespper.com/blog/launching-vespper-docx-mcp ## 引言 Word文档无处不在。在法律、金融和医疗等领域,Word文档是最终交付物。合同、监管文件和审计报告的起草、修改和签署都在`.docx`格式中进行,企业通常拥有大量日常使用的Word模板。这些工作正越来越多地转向智能体(Agent)。Microsoft Copilot和Claude等Word内置的文档AI工具已成为主流,而越来越多的垂直领域智能体——尤其是在法律科技领域——需要处理`.docx`文件。 然而,AI智能体在Word文档处理方面仍面临挑战。我们与数十位软件工程师(主要来自法律科技和医疗行业)交流发现,他们通常需要数周甚至数月时间调试工具链,以实现可靠的Word文档编辑,并被迫维护极其复杂的内部解决方案。 目前智能体编辑Word文档主要有以下三类方式: - 让智能体编写使用底层SDK(如python-docx、aspose或Open XML SDK)的代码 - 连接MCP服务器(如SuperDoc、Office CLI、safe-docx或Adeu),为智能体提供标准化工具 - 通过有损转换实现Word文档往返处理:使用pandoc/mammoth.js等工具转换为Markdown/HTML,让智能体编辑后再转回`.docx` 现有方案在简单场景下尚可应对,但在复杂场景中往往力不从心。在深入探讨这些方案及其缺陷之前,我们首先需要了解`.docx`文件的本质。 ## 问题分析 `.docx`本质上是遵循OOXML(Office Open XML)规范的ZIP压缩包,内含层级化的XML文件。ZIP包内主要包括: **document.xml**包含主文本内容,**styles.xml**定义可重用样式(类似CSS样式表),**numbering.xml**定义列表/编号行为,此外还有独立的XML文件存储页眉、页脚、脚注、关联关系、媒体内容和文档元数据。 这些XML文件极其冗长。例如在**document.xml**中,即使是一个4-5句话的简短段落,一旦加入样式、元数据、格式信息、文本段分割和XML模板代码,就可能变成**数千个**标记(token)。用户在Microsoft Word中看到的文本可能被分散在多个XML节点中,并以非常冗长的方式存储。 以下交互式组件展示了简单.docx文件的后台工作原理: 这种DOCX编辑特性使其与代码或HTML编辑存在本质差异。对于简单文件,文本表示基本等同于内容本身,且修改是局部的。以Markdown/简单HTML为例,其结构至少是熟悉的,样式也保持局部性。垂直领域AI智能体在这一问题上面临更大挑战——Harvey等公司已遭遇此问题。 当他们重建文档编辑系统(https://www.harvey.ai/blog/building-an-agent-for-complex-document-drafting-and-editing)时,诊断结论是:他们之前要求单个智能体同时充当法律助手和Word状态机。像Harvey这样的智能体任务已经极其复杂——需要审阅对方批注、应用律所标准条款、验证第3条与第27条中的定义术语一致性,并检查刚修改的赔偿上限是否与两页前的责任条款冲突。这些才是核心工作。而分割文本段、追踪编号引用等操作不属于核心任务,却会占用相同的上下文窗口资源。 ## 现状分析 回到上述解决方案,每种方案都有不同的权衡取舍,但最终都陷入相同困境:智能体将上下文预算消耗在Word机制而非实际任务上。 **底层库**(python-docx、aspose、Open XML SDK) - **优点**:智能体易于理解——这些库出现在预训练数据中,提供完整表达能力,通常无功能限制 - **缺点**:速度慢且成本高。智能体处理长篇法律文档时,大部分时间花在编写和调试脚本上,即使是超链接或修订追踪等简单操作也需要复杂的变通处理 **MCP服务器**(SuperDoc、Office CLI、safe-docx、Adeu) - **优点**:相比编写代码更快捷经济 - **缺点**:每个MCP都是智能体需要即时学习的新DSL,面对大量工具和选项。它们通常只覆盖常见80%场景,剩余20%正是真实文档的复杂所在 **往返转换**(DOCX ↔ Markdown/HTML) - **优点**:智能体完全无需考虑Word机制,只需编辑文本 - **缺点**:转换过程存在单向有损,反向转换无法完全还原。特别是Markdown无法表达文档从模板继承的样式关系 在这些方案中,我们坚信第三种方案——往返转换的价值。我们相信通过将智能体从Word思维中解放出来,它们能更好地完成任务。然而往返转换的最大挑战在于:如何实现无损转换? ## 解决方案 在解释协调器(Reconciler)工作原理前,我们想说明为何看好这种解决方案形态。灵感来自基础设施即代码(IaC)领域。在IaC工具流行前,开发者需要登录云账户"手动点击",耗费数小时在AWS/GCP控制台中导航、点击按钮、手工管理基础设施。若不幸需要同步多个环境(预发布、生产、测试、客户环境)或快速创建新环境,情况将迅速失控。 随后Terraform和Pulumi出现。现在开发者只需修改代码,工具就能自动计算(或更准确地说——**协调**)云端所需变更。我们不再需要花费数小时操作控制台。 我们认为这个理念可以很好地迁移到智能体与Word文档的交互中:智能体编辑可读且直观的内容,其他组件则负责将这些编辑映射到实际文件。但如前所述,现有工具尚未成熟。pandoc和mammoth.js等工具在转换过程中损失过多信息,且无法真正"协调"回**原始**文件,意味着这是一种高损耗的方案。 简言之:理念很好,但工具尚不完善。我们决心寻找更好的方案。 首先确定表示格式。Markdown是显而易见的首选,但我们很快放弃——它无法表达样式或关联样式到元素。最终我们选择HTML: - HTML结构接近OOXML:``→``、``→``、``→`` - CSS能将样式关联到特定元素,这与OOXML的样式机制大致相似 这仍然存在有损问题。现有转换器(pandoc、mammoth.js)能将DOCX转为HTML,但生成的HTML无法同时做到最小化、高保真和干净。因此我们从头构建了自己的转换器。 理论上智能体现在只需编辑我们的HTML,剩下只需协调回原始.docx文件。这正是复杂性所在。OOXML拥有庞大体系:无数元素、选项和样式。若在此之上添加自定义HTML表示,将产生极长的边缘案例列表。 我们决定训练模型作为协调器,而非构建巨型协调引擎并手工编写代码处理每个边缘案例:向模型展示大量HTML ↔ OOXML变更对,训练它预测HTML变更对应的OOXML变更。 该模型是解决方案的核心。它接收智能体的HTML意图,生成有效的OOXML块。然后我们将结果与原始块进行差异对比,确定性计算修订追踪,将变更补丁写入文件,最后返回给调用方。 以下交互式序列图展示了我们解决方案的端到端工作流程: 下一节将说明我们如何评估该方案与其他方案的对比。 ## 评估验证 为基准测试我们的方案,我们在内部测试集的279个DOCX编辑任务中对比了5种其他方案,每个任务在两种模型上运行:GPT 5.6 Sol和GPT 5.6 Terra,均采用中等推理强度: - MCP服务器方案 - Vespper MCP(我们的方案) - SuperDoc MCP - v0.18.1 - Office CLI(通过MCP) - v1.0.145 - Adeu MCP - v3.0.2 - 技能/工具链方案 - Anthropic的DOCX技能 - 原生python-docx工具链 对于工具链方案,我们使用LangChain的create_agent(https://reference.langchain.com/python/langchain/agents/factory/create_agent),它简化了智能体实例化和模型切换,与官方mcp包(https://github.com/modelcontextprotocol/python-sdk)兼容良好。我们排除了开箱即用的工具链(如LangChain的deepagents(https://github.com/langchain-ai/deepagents)、Vercel的eve(https://vercel.com/eve)),因为我们希望完全控制并在后台尽可能减少"魔法"操作(如自动压缩、系统提示修改等)。 关于候选方案的补充说明: - **统一系统提示**——所有方案(包括我们的)均未针对特定方案调整提示词 - **移除设置步骤**——几乎所有方案都要求智能体在编辑前执行初始化操作:加载技能、打开文件、追踪会话、完成后保存关闭。我们统一移除了这些步骤:DOCX技能预加载到上下文,会话ID和文件路径在后台注入,SuperDoc的`open`/`save`/`close`等生命周期工具完全隐藏。每个候选方案从第一轮对话起即可读取和编辑文件 - **python-docx作为基准**——我们想观察未经工具设计和调优时的性能表现 ## 数据集构建 ### 智能体任务集 为评估上述方案,我们构建了高质量的Word编辑任务数据集。构建过程大致分为三个阶段: **获取原始文档** 从docxcorp.us(http://docxcorp.us/)获取原始DOCX文件,保留各领域(政府、医疗、金融、法律)的英文文档,剔除低置信度分类文档。 **合成任务** 每个文档需要一组自然语言指令("任务")和相应的评分机制。我们构建了内部标注工具,可快速预览原始文档并在浏览器中合成编辑任务。每条任务都经过人工审核、批准/丢弃/修改。 关于数据集的补充说明: - 确保任务明确直接;避免"撰写引人入胜的介绍"这类模糊任务,而是合成"撰写包含以下内容的引言部分:..."这类明确任务 - 真实文档无噪声(不添加未请求的修改、使用正确样式等) - 为保持数据集纯净,我们手工标注300条任务,并对齐LLM评判器和修复智能体来标记和修正噪声任务 最终数据集包含2046条任务,按文档级别约70/15/15分割(避免数据泄露),并按文档主题、任务领域等元数据分层。每条任务包含三个要素: - **original.docx** - 智能体接收的未修改源文档 - **modified.docx** - 显示预期编辑的参考"标准"版本 - **Prompt** - 描述编辑请求的自然语言提示 以下是数据集中的示例任务: ``` 为附表1(本法案不适用的实体及范围)添加新条目:"根据2005年规划与发展法成立的西澳大利亚规划委员会"。按字母顺序插入,位于"根据2004年州行政法庭法设立的州行政法庭"之后。 ``` 预期输出为: 西澳大利亚规划委员会插入附表1列表的修订追踪记录,附带Vespper建议卡片 示例任务的预期输出。新条目被标记为修订,与周围列表缩进一致,并以与上方行相同的斜体样式显示法案名称。如图所示,样式需要保持一致。本例中,智能体需采用与其他条目相同的缩进格式,并将法案名称设为斜体。**注意**:我们并未明确告知智能体该使用何种样式。我们期望智能体能隐式理解这些要求。 #### 评分机制 评估时,我们运行特定智能体(如GPT 5.6 Sol + DOCX技能)处理上述任务。每个智能体运行生成output.docx,最终得到: - original.docx - modified.docx(标准答案,即文件在预期修改后的状态) - output.docx(智能体生成的文件) 执行以下步骤: 1. 将每个Word文档转换为块序列,大致对应每个`` 2. 对齐original.docx ↔ modified.docx(标准答案)找出实际变更的块,然后对齐modified.docx ↔ output.docx检查智能体是否正确生成。对齐算法采用最长公共子序列(https://en.wikipedia.org/wiki/Longest_common_subsequence) 3. 按内容和样式比较这些块。内容指读者可见的已应用修订内容,样式指渲染后的视觉呈现(非Word格式化XML) 以下是展示特定任务评分流程的交互式图示: ### 协调器任务集 在开发协调器前,我们先定义了两项要求: - 必须高精度(保留内容,样式准确) - 必须**极快** 基于第二项要求,智能体方案不可行。处理文档(如法律文件)通常需要智能体进行数十甚至上百次编辑。如果每次编辑需20秒协调,用户体验将极其糟糕。因此我们将其重构为翻译问题。 模型接收三元组`(html_old, html_new, xml_old)`,输出对应块的`xml_new`。无推理、无工具调用、无循环。寻找`xml_old`不是模型的任务——我们编写了确定性定位器,将HTML块映射到对应OOXML块(单独测试)。这完全将搜索问题排除在模型之外,使其只需专注自身优势:生成与预期变更匹配的有效OOXML。 在模型选择上,我们选定3-8B参数范围。后训练运行的数据集远小于预训练,更新所有参数效率低下。我们采用低秩适配(LoRA)(https://arxiv.org/abs/2106.09685),冻结基础模型并训练少量"适配器"矩阵。早期实验确定采用rank 16、alpha 32、LR 2e-4、AdamW 8-bit配置。 数据集从智能体任务集中自监督挖掘:`(html_old, html_new, xml_old, xml_new)`四元组,加上根据生产环境中智能体实际提交内容生成的增强数据。最终协调器数据集包含约16k任务,按70/15/15分割训练/验证/测试集。 数据集准备就绪后,训练采用监督微调(SFT)。框架使用Unsloth,GPU通过Modal提供: 训练损失曲线在约2800全局步骤后持续下降并趋于稳定 在Unsloth/Modal上协调器SFT训练的损失曲线。我们希望在训练过程中使用可理解的指标评估模型(因为损失值本身解释性有限)。为此采用上文评分方法的简化版本。

相似文章