bug: Playwright web loader loses rendered page content during UnstructuredHTML extraction

该报错通常出现在 Open WebUI 通过 Playwright 加载网页、再由 UnstructuredHTML 提取正文时,页面明明已经渲染成功,但抽取结果只剩导航栏、品牌等少量文本。优先排查 Playwright 渲染后的页面内容是否被 UnstructuredHTML 提取步骤丢弃,而不是

快速结论:该报错通常出现在 Open WebUI 通过 Playwright 加载网页、再由 UnstructuredHTML 提取正文时,页面明明已经渲染成功,但抽取结果只剩导航栏、品牌等少量文本。优先排查 Playwright 渲染后的页面内容是否被 UnstructuredHTML 提取步骤丢弃,而不是页面本身加载失败。

适用环境:Open WebUI 0.11.0,以及当前 ghcr.io/open-webui/open-webui:main(digest sha256:6a773e5c3a246b65cbe74ce942b294292c0e5f81c138f703d111bc162f7d7c3d);Docker 部署;Synology DSM 7.4(Linux x86_64)。Issue 未提供 Python、CUDA、显卡、浏览器版本或 Ollama 版本信息,无需据此推断。

最快修复方案:暂无确认的一步修复方案。Issue 中提出的修复方向是:保留结构化提取作为默认路径,仅当结构化提取为空,或规范化后的结构化结果明显小于已渲染正文(正文至少 500 字符且至少为结构化结果的 3 倍)时,回退到渲染后的页面正文文本。该方案已由提交者在 dev 分支(ffda8aea8)复现并准备 PR,但尚未合并发布;可优先尝试等待或合入该 PR 后验证。

注意事项:回退逻辑仅在“结构化提取异常收缩”时触发,正常结构化输出不会被替换;渲染正文在 evaluator 运行后读取,因此已配置的 remove_selectors 仍会生效。正文读取失败被设计为非致命错误,不会中断加载。上述行为来自提交者描述的待合并方案,是否进入正式版本、是否影响其他文档元数据需以实际合并结果为准。

问题场景

用户在 Open WebUI 中使用 Playwright web loader 抓取网页时触发该问题。以 Ubiquiti Tech Specs 页面为例,Playwright 已正确渲染页面,渲染后的 innerText 约 3115 字符,但 PlaywrightURLLoader evaluator 输出只有 131 字符,只剩导航和品牌类文本,规格数据全部丢失。相同现象在 Open WebUI v0.11.0 上也能复现。

报错原文

bug: Playwright web loader loses rendered page content during UnstructuredHTML extraction

Rendered innerText: 3115 chars
Evaluator output:   131 chars

'25G': rendered=True, evaluator=False
'720W': rendered=True, evaluator=False
'460 Gbps': rendered=True, evaluator=False
'230 Gbps': rendered=True, evaluator=False
'342 Mpps': rendered=True, evaluator=False

evaluator 实际只返回了以下内容:

UniFi

UISP

Branding

Cloud Gateways

Switching

WiFi

Physical Security

Door Access

Integrations

Advanced Hosting

Accessories

原因分析

问题不在 Playwright 渲染阶段。Issue 中的对照测试显示,完整数据同时存在于渲染后的 DOM 和序列化 HTML 中:

Rendered innerText:     3322 chars
Serialized page HTML:   595591 chars
Unstructured result:    131 chars

'25G': innerText=True, HTML=True, unstructured=False
'720W': innerText=True, HTML=True, unstructured=False
...

因此可能原因是:页面内容在后续 UnstructuredHTML 结构化提取阶段被丢弃,提取器把大量正文判定为可忽略内容,只保留了导航、品牌等少量文本。提交者在 dev 分支复现后描述的触发条件为:结构化提取结果为空,或规范化后的结构化结果相对已渲染正文出现异常收缩。

环境排查

  • 确认 Open WebUI 版本:Issue 中涉及 0.11.0 与 ghcr.io/open-webui/open-webui:main(digest sha256:6a773e5c3a246b65cbe74ce942b294292c0e5f81c138f703d111bc162f7d7c3d)。
  • 确认部署方式为 Docker(Issue 中为 Docker / Synology Container Manager)。
  • 确认操作系统:Synology DSM 7.4(Linux x86_64)。
  • 确认是否使用了 Playwright web loader 及其相关 evaluator / UnstructuredHTML 提取路径。
  • Issue 未提供 Python、CUDA、PyTorch、显卡、浏览器和 Ollama 版本,排查时无需假设这些版本相关。
  • 对照渲染结果与提取结果:分别输出渲染后 innerText 字符数与 evaluator 输出字符数,判断是否出现异常收缩。

解决步骤

  1. 在出现问题的 Open WebUI 实例中,用 Playwright 加载目标网页,记录渲染后 innerText 是否包含预期规格数据(例如 25G、720W、460 Gbps)。
  2. 查看 PlaywrightURLLoader evaluator 的输出字符数,与渲染后 innerText 字符数对比,确认是否只剩导航/品牌文本。
  3. 若确认是 UnstructuredHTML 提取阶段丢内容,可优先尝试 Issue 中提交者提出的修复方案:在结构化提取为空,或规范化结构化结果明显小于已渲染正文(正文至少 500 字符且至少为结构化结果的 3 倍)时,回退到渲染后的页面正文文本。
  4. 该回退逻辑应在 evaluator 运行后读取渲染正文,以保留已配置的 remove_selectors;同时对正文读取失败做非致命处理,并覆盖同步与异步 loader 路径。
  5. 在合入或等待该修复前,可先确认该 PR 是否已进入你使用的镜像版本,再决定是否升级或临时替换加载逻辑。

验证方法

使用同一 Ubiquiti Tech Specs 页面进行回归验证:

HTTP status:          200
Rendered body:        3115 chars
Unstructured output:  131 chars
Proposed output:      3115 chars

'25G':     extracted=False, rendered=True, proposed=True
'720W':    extracted=False, rendered=True, proposed=True
'460 Gbps': extracted=False, rendered=True, proposed=True
'230 Gbps': extracted=False, rendered=True, proposed=True
'342 Mpps': extracted=False, rendered=True, proposed=True

若应用修复后,evaluator 输出字符数恢复到与渲染正文相近的水平,且上述规格值均能在提取结果中命中,即可确认问题已解决。同时应检查正常结构化输出、短页面、缺失渲染正文和空白字符规范化场景未被回退逻辑破坏。

参考来源

open-webui/open-webui #28643

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 26547

发表回复

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