让知识库及时清除失效的电子合同
作者为 Cognee 开发 DocuSign 连接器,将合同正文、签署信息和自定义字段导入知识图谱,并在后续运行中按状态变化增量同步。作废、删除或清除的合同会被移除,相关代码仍处于 PR 阶段。
AI 深度解读
旧合同已经移进 DocuSign 的 Deleted 文件夹,AI 助手却还在引用旧付款条款。问题出在知识同步:源文件退出了业务流程,检索系统里的文本、向量和关联知识却没有跟着消失。
作者为 Cognee 开发的 DocuSign connector,重点就是让助手及时「忘记」。最有价值的部分是:删除不一定改变状态时间,增量同步必须补上一条核对路径,而且不能把接口失败误判成删除。
为什么按状态增量同步会漏掉删除
Cognee 会把文档转成智能体可检索的知识图谱。这个 connector 将每个 envelope,也就是 DocuSign 的协议封套,映射为一份文档:前面放发送人、签署角色和时间、自定义字段、签署人填写的表单数据,后面接已签署 PDF 的文本。
用户可以按状态、文件夹或起始日期选择同步范围,后续运行只查询状态发生变化的封套。接入代码如下,它负责将来源合并到指定数据集:
source = docusign_source() # DOCUSIGN_* from the environment
await cognee.remember(source, dataset_name="docusign",
write_disposition="merge")
要留意 write_disposition="merge":这是持续同步的入口,删除识别还得由 connector 完成。
作者使用 from_date 和 from_to_status=changed 拉取增量,但 completed 封套不能再被 voided。用户移除已完成协议时,通常是移入 Deleted 文件夹,或者执行 purge。这两种操作都不会推进状态日期,时间游标便看不到它们。
增量列表没有返回某份协议,既不能证明它已删除,也不能证明它仍然有效。
因此,每次同步还要核对:此前入库、此次列表没有返回的封套,按 id 重新查询文件夹和清除状态。确认它进入回收站、被清除、已不存在或超出同步范围后,才生成删除操作。dlt 删除数据行,Cognee 的孤儿清理再移除图谱和向量中的对应内容。
怎样证明助手真的忘了
作者认为误删比漏删更糟,因此设了几条保护规则:分页失败、401 或长时间限流,都会让运行在删除和游标推进之前停止;空列表也不会直接清空数据集。
验证分成两层。第一层是假 DocuSign 服务,但仍通过真实 HTTP session 执行 JWT 交换、分页和重试。59 项测试通过,其中一项运行完整 Cognee 管线并 mock LLM,确认内容未变的重复同步不会调用 LLM。
第二层使用免费开发者账号和真实 LLM。作者通过 API 创建 5 份协议,用无头浏览器签署,查询时拿到了全部 5 位签署人及正确时间。
随后,作者把 Deltacorp offer letter 移入 Deleted。它仍是 completed,但下次同步报告 forgotten: 1,文档数从 5 降至 4。再次询问信中的薪资,助手回答上下文没有说明。另一份协议被 purge 后,状态同样保持 completed,只有 purgeState 变为 documents_queued;同步再次报告 forgotten: 1,文档数从 4 降至 3。
真实账号还确认了几个接口细节:按 id 查询不需要 from_date,表单数据符合预期,文件夹类型是 sentitems 和 recyclebin。
不过,扫描 PDF 只有模拟测试覆盖,因为演示环境会给每页盖上文本,无法得到真正空的文本层。connector 没有 OCR;彻底退出所有列表的 purge、生产环境、不同签署邮箱也没有完成实测,5 位签署人用的都是作者自己的邮箱。
我的判断
我认可它把「遗忘」作为同步流程的一部分。对于依赖文档检索的助手,仅在回答提示词里要求使用最新资料,无法解决旧内容仍被检索出来的问题。
它的代价也很明确:每轮都要按 id 核对未出现在增量列表中的历史封套。历史数据越多,额外请求可能越多,但原文没有给出请求量、耗时或大规模运行数据。与全量重建、事件通知等做法相比,目前无法判断它在成本和时效上的优势。
这次实验验证了两条删除路径,没有证明所有生产场景都已覆盖。
薪资问题不再返回旧内容,是有用的结果;但一次问答不能替代对图谱、向量和其他副本的全面验证。另外,这里处理的是 Cognee 检索数据,不能理解成让底层模型删除了训练记忆。代码仍在 issue #5716 对应的 PR 中,也应按待审实现看待。
能拿来做什么
- 给文档类 AI 助手设计同步任务时,把更新检测与删除核对分别实现,并为删除保留源文档 id,避免只依赖时间游标。
- 在 Node 等服务中接入类似外部数据源时,将分页失败、鉴权失败和限流与「数据不存在」区分处理;发生这些错误时,停止删除和游标推进。
- 复现实验可以从
packages/connector/docusign/examples/example.py入手,准备免费开发者账号、带 RSA 密钥对的 integration key,并完成一次授权同意。JWT grant 还需要 user id,API host 应来自userinfo,不要硬编码demo.docusign.net。 - 连接真实协议前,缩小 API 用户权限并使用独立数据集。connector 只发送 GET 请求,但仍会把协议内容写入知识系统,源端权限和下游数据范围都需要控制。