[BUG]: AnythingLLM stops working when/while/after mass-removing documents from workspace

这个报错通常出现在 AnythingLLM 批量删除 workspace 文档的同时,又有文档正在被向量化写入(embedding)时;优先排查是否发生了并发写入,以及 SQLite 数据库所在磁盘是否为本地高速盘。

快速结论:这个报错通常出现在 AnythingLLM 批量删除 workspace 文档的同时,又有文档正在被向量化写入(embedding)时;优先排查是否发生了并发写入,以及 SQLite 数据库所在磁盘是否为本地高速盘。

适用环境:Issue 中确认的环境为 Docker(本地部署),默认使用 SQLite,Prisma clientVersion 5.3.1,Embedder 使用 AnythingLLM 自带 Embedder。操作系统、Python、CUDA、显卡型号未在 Issue 中提供。

最快修复方案:把删除操作与上传/向量化操作改为串行执行,不要并行触发;通过开发者 API 脚本操作时,对每个调用使用 await,并把批量删除合并成单次 update-embeddings 请求,而不是同时发出大量请求。

注意事项:该方案是 Issue 维护者给出的规避建议,不是代码层面的修复;Issue 最终以“环境/使用约束,而非可在代码端明确修复的问题”关闭。若 SQLite 数据库放在网络挂载(NFS/SMB)或某些 Docker Desktop bind mount 上,锁竞争会明显恶化,此时仅靠串行操作可能仍需要重启容器恢复。

问题场景

用户在 Docker 本地运行 AnythingLLM,通过手动操作或开发者 API 批量删除某个 workspace 中的文档。删除过程中或删除后,WebGUI 访问异常,出现 “get started” 引导页,而不是正常的 workspace 概览列表。有时实例会一直停留在错误状态,需要重启 Docker 容器并等待一段时间才能重新连接;有时几分钟后自行恢复。

报错原文

Error occurred during query execution:
ConnectorError(ConnectorError { user_facing_error: None, kind: ConnectionError(Timed out during query execution.), transient: false })
Bulk insert failed PrismaClientUnknownRequestError: 
Invalid `prisma.document_vectors.create()` invocation:

Error occurred during query execution:
ConnectorError(ConnectorError { user_facing_error: None, kind: ConnectionError(Timed out during query execution.), transient: false })
    at wn.handleRequestError (/app/server/node_modules/@prisma/client/runtime/library.js:123:6902)
    at wn.handleAndLogRequestError (/app/server/node_modules/@prisma/client/runtime/library.js:123:6119)
    at wn.request (/app/server/node_modules/@prisma/client/runtime/library.js:123:5839)
    at async l (/app/server/node_modules/@prisma/client/runtime/library.js:128:9763) {
  clientVersion: '5.3.1'
}
[backend] info: prisma:error 
Invalid `prisma.system_settings.findFirst()` invocation:

Error occurred during query execution:
ConnectorError(ConnectorError { user_facing_error: None, kind: ConnectionError(Timed out during query execution.), transient: false })
[backend] error: 
Invalid `prisma.system_settings.findFirst()` invocation:

Error occurred during query execution:
ConnectorError(ConnectorError { user_facing_error: None, kind: ConnectionError(Timed out during query execution.), transient: false })
[backend] info: prisma:error 
Invalid `prisma.system_settings.findFirst()` invocation:

Error occurred during query execution:
ConnectorError(ConnectorError { user_facing_error: None, kind: ConnectionError(Timed out during query execution.), transient: false })
[backend] error: 
Invalid `prisma.system_settings.findFirst()` invocation:

原因分析

Issue 维护者指出,问题不在文档删除逻辑本身,而在于删除与向量化写入发生了并发。日志中失败的查询是 document_vectors.create(),说明在批量删除的同一时刻,仍有文档正在被嵌入并写入向量表。

AnythingLLM 默认使用 SQLite,而 SQLite 同一时间只允许一个写入者。并发的 embed 写入与 delete 写入互相争抢写锁,导致其他查询(例如 system_settings.findFirst())在等待锁时超时。前端读不到 settings,就会退回 “get started” 页面;等写入队列排空后,前端又能正常读取,因此表现为几分钟后自行恢复。若数据库位于网络挂载或部分 Docker Desktop bind mount 上,SQLite 的锁行为会进一步恶化,这通常就是必须重启容器才能恢复的原因。

环境排查

  • 确认 AnythingLLM 是否运行在 Docker(本地)环境,与 Issue 一致。
  • 确认当前是否使用默认 SQLite 数据库,以及 STORAGE_DIR 指向的位置。
  • 检查 STORAGE_DIR 是否位于本地高速磁盘;排除 NFS、SMB 等网络挂载。
  • 检查是否使用了 Docker Desktop 在 Windows/macOS 上的 bind mount,这类挂载可能加重 SQLite 锁竞争。
  • 确认触发问题时是否有上传/嵌入任务与删除操作同时存在。
  • Issue 中记录 Prisma clientVersion 为 5.3.1,可据此核对后端日志中的版本信息。

解决步骤

  1. 停止并行操作:不要在批量删除文档的同时执行上传或向量化嵌入任务,改为先完成一批再执行下一批。
  2. 如果通过开发者 API 脚本操作,对每个 API 调用使用 await,确保前一个请求完成后再发出下一个。
  3. 把批量删除合并为一次 update-embeddings 请求,避免连续快速发出大量独立删除请求。
  4. 确认 STORAGE_DIR 位于快速本地磁盘,避免使用 NFS/SMB 等网络挂载。
  5. 如果是 Docker Desktop(Windows/macOS),尽量避开会显著加重 SQLite 锁问题的 bind mount 方式,将存储放到容器本地卷或本地高速路径。
  6. 若实例已经卡在错误状态,按 Issue 反馈重启 Docker 容器,并等待写入队列排空后再重新访问。

验证方法

按串行方式执行删除与嵌入操作后,观察后端日志中是否还出现 document_vectors.create() 或 system_settings.findFirst() 的 Timed out during query execution。同时访问 WebGUI,确认是否直接进入正常的 workspace 概览页,而不是 “get started” 页。若仍会在几分钟后自行恢复或需要重启容器,说明磁盘/挂载带来的锁竞争可能仍然存在,需要继续调整存储位置。

参考来源

Mintplex-Labs/anything-llm #6606

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 27238

发表回复

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