
issue: content-filter refusal text becomes the RAG retrieval query when query generation returns no JSON
快速结论:当 Open WebUI 的 RAG 查询生成任务调用被后端内容过滤器拦截,返回拒绝文本(如 “I can’t help with that request.”)而非 JSON 时,拒绝文本本身会被当作相似度搜索查询词,导致检索结果降质。优先排查网关内容过滤器是否拦截了内部任务提示,或考虑关闭检索查询生成功能。
问题场景
在 Open WebUI v0.10.2(Docker 部署)中,使用 OpenAI 兼容后端(如 AWS Bedrock Guardrails、Azure OpenAI 内容过滤),当 RAG 知识库查询生成任务调用被内容过滤器拦截并返回 finish_reason: "content_filter" 及拒绝文本时,该文本成为向量搜索查询,而非回退到用户最新消息。问题发生在 backend/open_webui/utils/middleware.py 的 chat_completion_files_handler 函数中。
报错原文
# 问题代码段(L1786-L1796 on v0.10.2)
try:
bracket_start = queries_response.rfind('{')
bracket_end = queries_response.rfind('}') + 1
if bracket_start == -1 or bracket_end == -1:
raise Exception('No JSON object found in the response')
queries_response = queries_response[bracket_start:bracket_end]
queries_response = json.loads(queries_response)
except Exception as e:
queries_response = {'queries': [queries_response]} # raw model text becomes the query
# 因此 queries 为 ["I can't help with that request."],后续 len(queries) == 0 回退永不触发
原因分析
可能原因:内容过滤器返回的拒绝文本中不含 { 字符,导致 JSON 解析失败进入 except 分支,该分支将原始模型输出(即拒绝文本)直接包装为查询列表。由于此时列表非空,原本用于空列表回退(if len(queries) == 0:)的机制不会触发。Open WebUI 开发者指出,这种宽松解析是故意的——许多模型会直接返回查询字符串而非 JSON 结构,将原始输出包装起来可以保持检索功能正常。改为 {'queries': []} 会破坏这些部署。根本问题在于网关的内容过滤器拦截了内部任务提示,导致包括标题生成、标签生成、自动补全等所有任务调用均受影响。
环境排查
- Open WebUI 版本(建议升级到最新版本,但官方指出当前
main和dev分支的代码未变) - 后端是否使用 OpenAI 兼容端点(如 AWS Bedrock Guardrails、Azure OpenAI)
- 网关或代理是否启用了内容过滤器并返回
finish_reason: "content_filter" - 是否设置了
TASK_MODEL或TASK_MODEL_EXTERNAL环境变量
解决步骤
- 可优先尝试:将任务模型指向一个允许内部任务提示的端点。通过设置
TASK_MODEL(本地连接)或TASK_MODEL_EXTERNAL(外部连接)环境变量实现。这可以一次性解决所有任务调用(标题生成、标签生成、自动补全等)被拦截的问题。 - 备选方案:设置
ENABLE_RETRIEVAL_QUERY_GENERATION=false。这样检索将直接使用用户消息作为查询,效果等同于 Issue 期望的回退行为。 - 临时调试:检查网关或代理日志,确认内容过滤器是否拦截了 Open WebUI 的内部任务提示(提示模板中包含 “### Task: Analyze the chat history…”)。
验证方法
设置环境变量后重启 Open WebUI,发送一条触发 RAG 查询的问题(如 “Explain this week’s key topics”),检查检索日志或调试输出(如 queries_generated 状态事件),确认查询词不再包含拒绝文本,而是使用用户消息或正确的模型生成查询。



