TL;DR
- 一个爬取 API 提供页面;而一个 RAG 流水线需要被接受、标准化、带源文档。
- 原始 HTML 包含导航、脚本、重复的 UI 和不稳定的标记,这可能会污染数据块和检索。
- 转换和验证内容,然后根据结构分块,使用版本化模型嵌入,并保留规范网址和爬取时间。
- 在索引后测量答案支持和引用质量,而不仅仅是爬虫响应的成功。
为什么我不能将原始 HTML 传递给 LLM?
你可以将 HTML 文本传递给模型,但这通常不是一个好的检索语料库。一个页面通常包括菜单、cookie 通知、相关链接、脚本、隐藏文本和重复的模板。如果你按任意字符数分割,数据块可能会跨越标题和表格,或重复同样的导航数百次。检索随后将页面装饰与答案一起排序。Nstdata Crawl 提供 Markdown 和其他输出工件,这是一个有用的起点,但格式转换只是一个质量门槛。
保留足够的来源信息以调试错误答案:原始 URL、规范 URL、检索时间戳、页面状态、标题、输出格式、爬取作业 ID 和原始或可恢复的工件引用。Nstdata 的 爬取文档 将站点作业状态、页面记录和存储读取分开。如果记录包含 markdownRef,在分块之前获取引用的主体。不要将完成的作业视为每个页面都是可用的证明。一个显示“访问被拒绝”的 403 页面可以是语法上有效的 Markdown,但在语义上毫无用处。
实用的 HTML 到文档接受流水线
- 范围发现。 定义允许的域、路径规则、深度和最大 URL。记录跳过的和超出范围的链接。URL 发现指南 解决了在不永远爬取的情况下面找到页面的问题。
- 检索和分类。 分别记录状态代码、内容类型、重定向和爬取错误。对瞬时故障进行重试,设定上限;不要无限期重试永久故障。
- 提取主要内容。 删除重复的站点装饰,同时保留标题、表格、代码和有意义的链接。当转换保持该结构时,Markdown 是有用的。
- 规范身份。 解析规范和重定向,去重,并分配稳定的 ID。存储获取的时间戳,以便可以识别过时的页面。
- 验证。 拒绝空页面、访问被拒绝的模板、近重复和没有有意义的主体文本的页面。为每个 URL 保留拒绝理由。
- 分块和索引。 在节边界上进行分割,设定令牌预算;将 URL、标题、标题路径和时间戳附加到每个数据块。分块策略 提供替代方案。
- 刷新和删除。 按计划重新爬取,更新更改的块,并删除不再存在或被禁止的文档。
Scrapy 概述 显示了拥有爬虫的替代方案。输出契约应该是一个应用级文档,而不是供应商响应。一个最小的记录可能是 {id, canonical_url, title, markdown, fetched_at, status, raw_ref}。不要将存储引用放入 markdown 字段中。Firecrawl 爬取指南 同样将爬取作业与返回的页面数据分开;两个供应商都需要在 RAG 索引之前进行标准化处理。




