Agent 一接富文本编辑器就开始改错块:从 Selection Grounding 到 Undo Fence 的工程实战
很多团队以为 Agent 接上富文本编辑器后剩下只是“把字打进去”。真到生产环境事故常出在另一层模型知道要改哪一句人却只看到整篇文档被误覆盖。最常见的现象不是不会写而是改错块、删错段、撤销失控。这类问题一旦进入客服或知识库后台风险甚至高于普通表单误填。⚠️富文本编辑器表面像输入框内部却是 block tree、selection range、history stack 三套状态机。Agent 如果只看 DOM 文本或截图很容易把“当前光标所在位置”误认为“允许修改的范围”。真正要治理的不是生成质量而是写入动作和编辑结构是否被精确绑定。图 1富文本编辑器表面是文本框底层却是块级结构和选区状态问题为什么总出在“选区”而不是“文案”很多富文本编辑器会把段落、列表、引用和表格存成独立节点。Agent 若仅依赖contenteditable的可见文本就会把“视觉上相邻”误判为“结构上连续”。结果是替换一个 bullet 时把整个 list node 一起重写修改摘要时连后面的引用块也被吞掉。另一类坑来自异步 UI。用户刚点击某一段编辑器还没完成 selection flushAgent 已经开始粘贴。此时 DOM 里的 anchor node、浏览器原生 selection、编辑器内部 transaction selection 可能并不一致。根因其实是选区 grounding 缺失。图 2浏览器选区、DOM 结构和编辑器事务状态常常不同步一套可复现的 Selection Grounding 方案更稳的做法是先把编辑动作从“按像素点点击”升级为“按 block id 提交补丁”。每次执行前先读取编辑器导出的结构化快照块类型、块顺序、当前 selection 起止位置、最近一次 transaction id。只有当目标 block id、选区范围和 transaction id 同时命中才允许真正写入。✅关键实现可以像下面这样asyncfunctionguardedReplace(editor,targetBlockId,expectedTxn,text){constsnapshoteditor.exportSnapshot();constblocksnapshot.blocks.find(bb.idtargetBlockId);if(!block)thrownewError(block_missing);if(snapshot.selection.blockId!targetBlockId)thrownewError(selection_drift);if(snapshot.txnId!expectedTxn)thrownewError(stale_snapshot);editor.replaceBlockText(targetBlockId,text);editor.pushUndoFence({reason:agent_patch,blockId:targetBlockId});}这段逻辑看着简单却比“找到编辑器然后 CtrlA 粘贴”可靠得多。它把可写范围压缩到单个 block同时在提交后插入undo fence保证用户一次撤销只回滚当前 Agent patch。️实战验证为什么 Undo Fence 比全量回写更关键在一个内部知识库编辑流里团队对比了两种方案一种是读取全文后重写目标段落另一种是 block 级 patch undo fence。前者在 200 次回放中有 11 次误覆盖相邻块平均一次撤销会回滚 3.4 个编辑动作后者误覆盖降到 1 次且撤销粒度稳定在单 patch。方案误改相邻块单次撤销回滚动作数用户可恢复性全文回写11 / 2003.4低Block Patch Undo Fence1 / 2001.0高真正有价值的结论不是“模型更聪明了”而是写入协议更保守了。富文本场景里结构隔离往往比生成能力更决定可用性。图 3以 block patch 和事务校验替代全文重写才能把误改范围收住深度思考不要把富文本当成普通表单笔者认为很多 Agent 产品在富文本场景里迟迟上不了线不是因为模型不会写而是因为系统没有把“编辑权限边界”产品化。表单只要字段绑定富文本却需要 block identity、selection proof、undo segmentation 三层保护。少任何一层线上就会出现难以复盘的误改。接下来 3 到 6 个月这类能力大概率会从“编辑器插件技巧”升级成 Agent 基础设施。谁先把 selection grounding、undo fence、patch ledger 做成通用层谁就更有机会把 Agent 稳定接进 CRM 和知识库后台。实用建议是先限制 Agent 只能改单块再逐步放开跨块操作不要一上来追求整页自动改写。以上就是这类问题的核心治理思路。你在接入 Quill、ProseMirror、Slate 或 Notion 类编辑器时踩过最难复现的坑是什么欢迎在评论区聊聊。如果这篇文章对你有帮助记得点赞、收藏和关注后续会继续拆更难的 Agent 工程细节。⭐
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2580089.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!