快速结论:该问题通常出现在 Open WebUI 已积累较多 user 类型记忆、且注入时触发 memories.user_char_limit(默认 2000 字符)上限的场景;优先检查 add_memory_context 对 user 记忆的拼接与截断逻辑,以及记忆库总量是否已无界增长。
适用环境:Open WebUI v0.12.3(用户同时确认当前 dev 分支可复现),Docker 部署,操作系统 QTS 5.2.9(QNAP NAS)。Issue 未提供 Python、CUDA、PyTorch、显卡及 Ollama 版本信息。
最快修复方案:暂无确认的一步修复方案。Issue 以缺陷报告和期望行为为主,未给出经过验证的补丁或配置值。
注意事项:Issue 中提到的相关 Issue(#30235、#30234)只是自动关联的候选,不能视为已确认的修复;在官方修复前,手动清理记忆库只能缓解症状,不能改变截断仍会落在记忆中间这一行为。
问题场景
用户在 Docker 中运行 Open WebUI v0.12.3,启用记忆功能并长期使用后,user 类型记忆总量超过 2000 字符。此后每次发送聊天消息,发往模型的 system prompt 中 [User Memory] 区块都会在字符上限处被直接切断,后面的记忆完全消失;同时记忆库持续增长(报告中达到 209 条、约 102K 字符),记忆向量检索和后台审查提示词随之变差、变长。
报错原文
issue: memories injected without relevance selection, and auto-truncated mid-memory
该 Issue 没有抛出异常或日志报错,问题表现为注入内容被静默截断,模型中看到的只是被截断的片段,且没有任何“已丢弃记忆”的提示。
原因分析
最可能的原因是 backend/open_webui/utils/memory.py 中的 add_memory_context:它把所有 user 类型记忆拼进同一个 section 字符串,随后用 [:user_limit] 按字符直接切片。因此截断点会落在某条记忆的文本中间,后续记忆整体丢失,既没有按记忆边界丢弃整条记录,也没有告诉用户或模型有内容被省略。另外,代码对 context 类型记忆做了 top-k 语义选择,但 user 类型记忆是每轮全量注入,没有相关性筛选。
存储侧同样没有收敛机制:无衰减、无去重强制、无压缩或清理告警,导致记忆库无界增长,进而拖累语义检索、后台审查提示词(最多列出 80 条已有记忆)以及模型可见的记忆工具。以上基于 Issue 描述与代码位置,属于对根因的推断,尚未有官方修复确认。
环境排查
- 确认 Open WebUI 版本是否为 v0.12.3,以及在当前
dev分支上是否仍可复现。 - 确认部署方式为 Docker,并核对实际加载的镜像版本。
- 确认记忆功能已启用,并查看
memories.user_char_limit的当前值(默认 2000 字符)。 - 统计 user 类型记忆的条数与总字符数,判断是否已超过该上限。
- 检查
add_memory_context所在文件的实现,确认是否仍是对拼接后的字符串执行字符切片。 - Issue 未涉及 Ollama、CUDA、显卡或 PyTorch 版本,无需作为本次排查重点。
解决步骤
- 复现确认:启用记忆后,创建总长度超过
memories.user_char_limit的 user 类型记忆(例如 15 条约 200 字符),发送任意聊天消息,检查发往模型的 system prompt(可通过代理抓取),确认[User Memory]区块是否在中间被切断、截断点之后的记忆是否缺失。 - 确认代码路径:定位
backend/open_webui/utils/memory.py中的add_memory_context,核对 user 类型记忆是否被整体拼接到一个 section 后以[:user_limit]截断,且没有按记忆边界处理。 - 缓解存储膨胀:手动整理 or 删除旧的 user 类型记忆,把总量压回字符上限以内,避免注入块继续被截断。这只是临时缓解,不能解决注入逻辑本身的问题。
- 关注关联讨论:跟踪 Issue #30235(按相关性、按整条记忆裁剪注入上下文)和 #30234(为注入记忆设置独立的相关性阈值),判断是否已有可用的修复或合并到
dev的改动。 - 若需自行修改,可优先尝试(未在 Issue 中验证):在拼接前对 user 记忆按相关性排序并逐条累加,超限时丢弃整条记忆,而不是对拼接字符串做字符切片;同时保留向用户或模型提示“部分记忆被省略”的能力。
验证方法
重新发送聊天消息并检查 system prompt:[User Memory] 区块应结束在完整记忆的边界上,不再出现半句话;若发生省略,应能看到明确提示。若同时清理了记忆库,可再统计 user 记忆总量,确认已低于字符上限,并观察记忆检索与后台审查提示词的长度是否恢复正常。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。


![[Bug]: Stream cut after finish_reason but before the include_usage chunk is logged as success with locally counted usage (cached_tokens lost](https://www.chat-gpts.plus/wp-content/uploads/2026/10/47332-45006be2-768x403.jpg)