더 나은 RAG 파이프라인 구축: 기술 문서를 스크래핑해 깨끗한 마크다운 만들기
Source: Dev.to
일반적인 스크래핑의 문제점
문서 페이지를 단순히 curl 하거나 일반적인 크롤러를 사용할 경우, LLM 컨텍스트가 잡음으로 가득 차게 됩니다:
- 네비게이션 메뉴가 모든 페이지에 반복적으로 나타남(예: “Home > Docs > API…”).
- 사이드바가 의미 검색을 혼란스럽게 함.
- 푸터, 쿠키 배너, 스크립트.
- 언어 태그가 사라진 깨진 코드 블록.
이로 인해 검색 시스템이 실제 찾고자 하는 API 메서드 대신 푸터에 있는 “Terms of Service” 링크와 매치될 수 있습니다.
해결책: 프레임워크 인식 스크래퍼
이 정확한 문제를 해결하기 위해 Tech Docs to LLM‑Ready Markdown 를 만들었습니다.
각 페이지를 HTML 태그의 무리로 취급하는 대신, 이 Apify 액터는 문서 프레임워크(Docusaurus, GitBook, MkDocs 등)를 감지하고 여러분이 필요로 하는 콘텐츠만을 지능적으로 추출합니다.

🚀 RAG 파이프라인을 위한 핵심 기능
1. 스마트 프레임워크 감지
기반 기술 스택을 자동으로 식별하고 특화된 추출 규칙을 적용합니다:
- ✅ Docusaurus
- ✅ GitBook
- ✅ MkDocs (Material)
- ✅ ReadTheDocs
- ✅ VuePress / Nextra
2. 자동 정리
다음 요소들을 제거합니다:
- 사이드바 및 상단 네비게이션
- “Edit this page” 링크
- 목차(임베딩에 불필요)
- 푸터 및 법적 텍스트
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.")
📉 비용 및 성능
이 액터는 Cheerio 기반의 경량 추출 엔진을 커스텀으로 사용해 빠르고 저렴합니다:
- 가격: 결과당 결제($0.50 / 1,000 페이지)
- 속도: 분당 수백 페이지 처리 가능
직접 사용해 보기
라이브러리, SDK, 혹은 내부 문서를 위한 AI 어시스턴트를 구축하고 있다면 한 번 시도해 보세요. 데이터 정리에 드는 시간을 크게 절감할 수 있습니다.
댓글에 추가하고 싶은 다른 문서 프레임워크가 있으면 알려 주세요! 👇