构建更好的 RAG 流水线:抓取技术文档并生成干净的 Markdown
Source: Dev.to
通用爬取的问题
如果你仅仅使用 curl 一个文档页面或使用通用爬虫,你的 LLM 上下文会被噪音淹没:
- 导航菜单 在每个页面上重复出现(例如 “Home > Docs > API…”)。
- 侧边栏 干扰语义搜索。
- 页脚、Cookie 横幅和脚本。
- 代码块缺失语言标签 导致破碎。
你的检索系统可能会匹配到页脚中的 “服务条款” 链接,而不是你真正想要的 API 方法。
解决方案:框架感知爬虫
我构建了 Tech Docs to LLM‑Ready Markdown 来解决这个问题。
该 Apify actor 检测文档框架(Docusaurus、GitBook、MkDocs 等),并智能提取 仅 你关心的内容,而不是把每个页面当作一堆 HTML 标签。

🚀 RAG 流水线的关键特性
1. 智能框架检测
自动识别底层技术栈并应用专门的抽取规则:
- ✅ Docusaurus
- ✅ GitBook
- ✅ MkDocs (Material)
- ✅ ReadTheDocs
- ✅ VuePress / Nextra
2. 自动清理
剔除:
- 侧边栏和顶部导航
- “编辑此页” 链接
- 目录(对向量化来说是冗余的)
- 页脚和法律文本
3. 为 RAG 设计的输出格式 🤖
爬虫输出结构化数据,便于导入向量数据库:
doc_id– URL 的稳定唯一哈希(便于去重)section_path– 面包屑路径(例如Guides > Advanced > Configuration)chunk_index– 内置分块支持
示例输出
{
"doc_id": "acdb145c14f4310b",
"title": "Introduction | Crawlee",
"section_path": "Guides > Quick Start > Introduction",
"content": "# Introduction\n\nCrawlee covers your crawling...",
"framework": "docusaurus",
"metadata": {
"wordCount": 358,
"crawledAt": "2025-12-12T03:34:46.151Z"
}
}
🛠️ 与 LangChain 的集成
因为输出已经是结构化的,使用 ApifyDatasetLoader 将其加载到 LangChain 非常简单。
from langchain.document_loaders import ApifyDatasetLoader
from langchain.docstore.document import Document
loader = ApifyDatasetLoader(
dataset_id="YOUR_DATASET_ID",
dataset_mapping_function=lambda item: Document(
page_content=item["content"],
metadata={
"source": item["url"],
"title": item["title"],
"doc_id": item["doc_id"],
"section": item["section_path"] # <--- 稍后可按章节过滤!
}
),
)
docs = loader.load()
print(f"Loaded {len(docs)} clean documents.")
📉 成本与性能
该 actor 基于自定义轻量抽取引擎(在 Cheerio 之上),既快又便宜:
- 定价: 按结果付费(每 1,000 页 $0.50)
- 速度: 每分钟可处理数百页
试一试
如果你正在为库、SDK 或内部文档构建 AI 助手,快来试试吧。它能为你节省大量数据清洗时间。
在评论区告诉我还有哪些文档框架希望我加入! 👇