快速结论:当通过 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.py中attachment_ids字段定义;api/services/dataset_service.py中update_segment调用逻辑;api/services/vector_service.py中update_multimodel_vector的实现。 - 若更新请求中包含其他字段(如 keyword),同样受该逻辑影响,需要一并排查。
解决步骤
- 临时规避(可优先尝试):在调用更新接口时,始终保持显式传入原有
attachment_ids列表(不允许为空数组)。若不确定原值,可先查询分段详情确认当前绑定 ID。 - 检查调用日志:在出现附件被清空的时间点,确认请求体中是否确实未包含
attachment_ids字段。 - 若已触发清空:检查数据库表中分段附件是否仍可恢复(如通过备份或事件日志)。Dify 界面中通常无法直接还原,需重新上传附件。
- 修复方向(基于 Issue 讨论,可优先尝试):后端应在更新前判断
attachment_ids是否在请求中被显式提供,例如通过model_fields_set或哨兵默认值区分“未传”与“传空数组”。仅当显式传入时才调用update_multimodel_vector;当字段被省略时,应保留现有绑定不作处理。 - 关注上游修复 PR:跟踪 #41774 中维护者的修复进展,在修复版本发布后进行升级。正式修复前可在自己分叉的代码中应用上述逻辑改动。
验证方法
执行一次只修改 content、不携带 attachment_ids 的更新请求,随后重新查询该分段的附件绑定(如通过 Service API 获取分段详情或直接查 SegmentAttachmentBinding 表)。确认附件与多模态向量记录仍然存在,即表示问题已修复或规避成功。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。

![Misc. bug: [Fix provided] --fit on + --sleep-idle-seconds: failed to fit params to free device memory: model_params::tensor_buft_overrides a](https://www.chat-gpts.plus/wp-content/uploads/2026/09/24684-be7abf56-768x403.jpg)
