[Bug] Service API / console segment update clears attachments when attachment_ids is omitted

当通过 Service API 或控制台更新知识库分段时,如果请求体只修改了 content 而未携带 attachment_ids 字段,Dify 会误将附件与多模态向量全部清空。优先排查更新接口的入参中是否显式传入了 attachment_ids,或升级到修复版本。

快速结论:当通过 Service API 或控制台更新知识库分段时,如果请求体只修改了 content 而未携带 attachment_ids 字段,Dify 会误将附件与多模态向量全部清空。优先排查更新接口的入参中是否显式传入了 attachment_ids,或升级到修复版本。

适用环境:Dify main (1.17.x),Self Hosted (Docker) 部署。涉及 Python 后端服务中的 dataset/vector 服务逻辑,与具体 Python 或 CUDA 版本无直接关联。

最快修复方案:暂无确认的一步修复方案。Issue 中已定位根因并指出修复方向,但尚未合入正式代码。

注意事项:该 Bug 属于数据破坏类行为,影响已建立索引的分段附件。若已触发,需要重新上传附件或从备份恢复数据。

问题场景

在 Dify 中创建包含一个或多个附件(即数据库中 SegmentAttachmentBinding 记录)的知识库分段后,调用 Service API 或控制台的“更新分段”接口,并只传入修改后的 content 文本(未携带 attachment_ids)。保存后重新加载分段,附件丢失,且启用了多模态检索的向量数据也被清空。

报错原文

[Bug] Service API / console segment update clears attachments when attachment_ids is omitted

SegmentUpdateArgs.attachment_ids defaults to None.
VectorService.update_multimodel_vector(segment, args.attachment_ids or [], dataset, session=session)
None or [] becomes [].
update_multimodel_vector treats that as a full replace with an empty set, deletes existing bindings (and multimodal vectors when enabled).

原因分析

可能原因(已获维护者确认):update_segment 流程中无条件调用了向量更新函数。由于 SegmentUpdateArgs.attachment_ids 的默认值是 None,代码中 args.attachment_ids or [] 会把“未传该字段”和“显式传入空数组”两种情况都折叠成 []。当 update_multimodel_vector 收到空列表并与当前已有绑定对比时,发现不一致,便将其视为“全量替换为空集”,从而删除现有附件绑定及其多模态向量并直接返回。因此,仅修改 content 的部分更新也会将附件清空。这与 #41315 中 QA 的 answer 字段省略问题属于同一类“部分更新歧义”缺陷。

环境排查

  • Dify 版本:main 分支(1.17.x),请确认是否包含 #41774 的修复提交。
  • 部署方式:Self Hosted (Docker)。
  • 相关代码位置:api/services/entities/knowledge_entities/knowledge_entities.pyattachment_ids 字段定义;api/services/dataset_service.pyupdate_segment 调用逻辑;api/services/vector_service.pyupdate_multimodel_vector 的实现。
  • 若更新请求中包含其他字段(如 keyword),同样受该逻辑影响,需要一并排查。

解决步骤

  1. 临时规避(可优先尝试):在调用更新接口时,始终保持显式传入原有 attachment_ids 列表(不允许为空数组)。若不确定原值,可先查询分段详情确认当前绑定 ID。
  2. 检查调用日志:在出现附件被清空的时间点,确认请求体中是否确实未包含 attachment_ids 字段。
  3. 若已触发清空:检查数据库表中分段附件是否仍可恢复(如通过备份或事件日志)。Dify 界面中通常无法直接还原,需重新上传附件。
  4. 修复方向(基于 Issue 讨论,可优先尝试):后端应在更新前判断 attachment_ids 是否在请求中被显式提供,例如通过 model_fields_set 或哨兵默认值区分“未传”与“传空数组”。仅当显式传入时才调用 update_multimodel_vector;当字段被省略时,应保留现有绑定不作处理。
  5. 关注上游修复 PR:跟踪 #41774 中维护者的修复进展,在修复版本发布后进行升级。正式修复前可在自己分叉的代码中应用上述逻辑改动。

验证方法

执行一次只修改 content、不携带 attachment_ids 的更新请求,随后重新查询该分段的附件绑定(如通过 Service API 获取分段详情或直接查 SegmentAttachmentBinding 表)。确认附件与多模态向量记录仍然存在,即表示问题已修复或规避成功。

参考来源

langgenius/dify #41774

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 22082

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注