Perceive:为 RAG 流水线构建的 Web 内容提取工具
浏览器和大语言模型看同一个 URL,看到的是完全不同的东西。浏览器看到的是渲染后的界面:导航栏、Cookie 提示、按钮、广告、侧边栏、图片、脚本、交互组件。而大语言模型需要的是干净、结构化的文本内容。一位开发者在 Dev.to 上分享了他们构建 Perceive 的过程——一个专门为 RAG(检索增强生成)流水线设计的 Web 内容提取工具。
问题:网页内容提取的挑战
在 RAG 应用中,从网页提取高质量的文本内容是关键的第一步。但传统的网页抓取方法存在很多问题:
- 噪音过多:现代网页包含大量与正文无关的元素(导航、广告、侧边栏、页脚等),这些噪音会降低 RAG 的检索质量
- 动态内容:很多网页使用 JavaScript 动态渲染内容,简单的 HTTP 请求无法获取完整内容
- 结构化数据丢失:传统的 HTML 到文本转换会丢失标题层级、列表、表格等结构化信息
- 内容重复:网页模板中的重复内容(如导航栏、页脚)会在每个页面中重复出现,影响检索结果
- 多媒体内容:图片、视频、图表等多媒体内容中的信息无法被纯文本提取捕获
这些问题导致 RAG 系统检索到的内容质量不高,进而影响生成答案的准确性和相关性。
Perceive 的设计思路
Perceive 的核心设计思路是:为 RAG 优化,而不是为通用网页抓取优化。
传统的网页抓取工具(如 BeautifulSoup、Scrapy、Playwright)是通用工具,适用于各种网页抓取场景。但 Perceive 专门针对 RAG 流水线的需求进行优化,关注的是:
- 提取最相关的正文内容
- 保留对 LLM 有用的结构化信息
- 去除对检索无用的噪音
- 输出适合分块(chunking)和向量化的格式
核心技术方案
1. 渲染层
Perceive 使用无头浏览器(Headless Browser)渲染网页,确保能够获取 JavaScript 动态渲染的内容。渲染层负责:
- 加载页面并等待动态内容渲染完成
- 处理 Cookie 同意弹窗和登录墙
- 模拟真实用户行为(滚动、等待)
- 捕获渲染后的 DOM 结构
2. 内容识别层
渲染完成后,Perceive 需要从复杂的 DOM 结构中识别出正文内容。这一步使用了多种技术的组合:
- 基于 DOM 结构的分析:分析 DOM 树的结构,识别包含主要内容的容器元素
- 基于文本密度的分析:计算各个元素的文本密度,正文区域通常具有较高的文本密度
- 基于语义的分析:使用轻量级的语义分析,识别与页面主题最相关的内容区域
- 模板匹配:识别并去除网页模板中的重复元素(导航、页脚、侧边栏等)
3. 内容清洗层
识别出正文内容后,Perceive 对内容进行清洗,去除对 RAG 无用的元素:
- 移除广告、推广内容、相关文章链接
- 移除脚本、样式、注释等非内容元素
- 规范化空白字符和换行
- 处理特殊字符和 HTML 实体
- 可选:移除链接 URL(保留链接文本)
4. 结构化保留层
与简单的 HTML 转文本不同,Perceive 刻意保留了对 LLM 有用的结构化信息:
- 标题层级(H1-H6):保留文档的结构层次
- 列表(有序/无序):保留列表的结构
- 表格:将表格转换为 LLM 友好的格式
- 代码块:保留代码块的格式和语言标识
- 引用块:保留引用内容的标识
- 图片描述:提取图片的 alt 文本和标题
这些结构化信息帮助 LLM 更好地理解文档的组织和内容之间的关系。
5. 输出层
Perceive 输出多种格式,适应不同的 RAG 流水线需求:
- 纯文本:适合简单的 RAG 系统
- Markdown:保留结构化信息,适合大多数 RAG 系统
- JSON:包含元数据和结构化内容,适合复杂的 RAG 系统
- 分块输出:直接输出适合向量化的文本块
性能优化
为了在大规模 RAG 流水线中使用,Perceive 进行了多项性能优化:
- 并发抓取:支持并发抓取多个页面,提高吞吐量
- 缓存机制:对已抓取的页面进行缓存,避免重复抓取
- 增量更新:支持只抓取更新的内容,减少重复处理
- 资源限制:对每个页面的渲染时间和内存使用进行限制
- 失败重试:对失败的抓取进行智能重试,提高成功率
与传统工具的对比
| 特性 | 传统抓取工具 | Perceive |
|---|---|---|
| 设计目标 | 通用网页抓取 | RAG 优化的内容提取 |
| 动态内容 | 需要额外配置 | 原生支持 |
| 噪音去除 | 需要手动配置 | 自动识别和去除 |
| 结构化保留 | 通常丢失 | 刻意保留 |
| 输出格式 | 原始 HTML/纯文本 | Markdown/JSON/分块 |
| 性能优化 | 通用优化 | RAG 场景专项优化 |
适用场景
Perceive 适用于以下场景:
- 知识库 RAG:从网站提取内容构建知识库
- 文档问答:从技术文档、博客、帮助中心提取内容构建问答系统
- 竞争情报:定期抓取竞争对手网站内容进行分析
- 内容聚合:从多个网站聚合内容进行统一检索
- 学术研究:从学术网站、论文库提取内容进行研究
局限性
Perceive 也有一些局限性:
- 复杂网站的适配:对于结构非常复杂或使用反爬技术的网站,提取质量可能下降
- 多媒体内容:无法直接提取图片、视频中的内容(需要结合 OCR、语音识别等技术)
- 登录后内容:需要用户提供登录凭证才能抓取需要登录的内容
- 实时内容:对于实时更新的内容(如聊天、直播),需要特殊处理
总结
Perceive 展示了为特定场景(RAG)优化工具的价值。与通用网页抓取工具相比,专门为 RAG 优化的内容提取工具能够提供更高质量的内容,进而提升整个 RAG 系统的效果。
对于构建 RAG 应用的开发者来说,内容提取是容易被忽视但至关重要的一环。投入时间和精力优化内容提取质量,往往比优化检索算法或生成模型能带来更大的效果提升。
原文链接:https://dev.to/thephoenix229/how-we-built-perceive-web-content-extraction-for-rag-pipelines-48p0