issue: content-filter refusal text becomes the RAG retrieval query when query generation returns no JSON

在 Open WebUI v0.10.2(Docker 部署)中,使用 OpenAI 兼容后端(如 AWS Bedrock Guardrails、Azure OpenAI 内容过滤),当 RAG 知识库查询生成任务调用被内容过滤器拦截并返回 finish_reason: "content_filte

issue: content-filter refusal text becomes the RAG retrieval query when query generation returns no JSON

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.pychat_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 版本(建议升级到最新版本,但官方指出当前 maindev 分支的代码未变)
  • 后端是否使用 OpenAI 兼容端点(如 AWS Bedrock Guardrails、Azure OpenAI)
  • 网关或代理是否启用了内容过滤器并返回 finish_reason: "content_filter"
  • 是否设置了 TASK_MODELTASK_MODEL_EXTERNAL 环境变量

解决步骤

  1. 可优先尝试:将任务模型指向一个允许内部任务提示的端点。通过设置 TASK_MODEL(本地连接)或 TASK_MODEL_EXTERNAL(外部连接)环境变量实现。这可以一次性解决所有任务调用(标题生成、标签生成、自动补全等)被拦截的问题。
  2. 备选方案:设置 ENABLE_RETRIEVAL_QUERY_GENERATION=false。这样检索将直接使用用户消息作为查询,效果等同于 Issue 期望的回退行为。
  3. 临时调试:检查网关或代理日志,确认内容过滤器是否拦截了 Open WebUI 的内部任务提示(提示模板中包含 “### Task: Analyze the chat history…”)。

验证方法

设置环境变量后重启 Open WebUI,发送一条触发 RAG 查询的问题(如 “Explain this week’s key topics”),检查检索日志或调试输出(如 queries_generated 状态事件),确认查询词不再包含拒绝文本,而是使用用户消息或正确的模型生成查询。

参考来源

open-webui/open-webui #27047

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

celebrityanime
celebrityanime
文章: 15086

发表回复

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