더 나은 RAG 파이프라인 구축: 기술 문서를 스크래핑해 깨끗한 마크다운 만들기

발행: (2025년 12월 12일 오후 12:56 GMT+9)
4 min read
원문: Dev.to

Source: Dev.to

일반적인 스크래핑의 문제점

문서 페이지를 단순히 curl 하거나 일반적인 크롤러를 사용할 경우, LLM 컨텍스트가 잡음으로 가득 차게 됩니다:

  • 네비게이션 메뉴가 모든 페이지에 반복적으로 나타남(예: “Home > Docs > API…”).
  • 사이드바가 의미 검색을 혼란스럽게 함.
  • 푸터, 쿠키 배너, 스크립트.
  • 언어 태그가 사라진 깨진 코드 블록.

이로 인해 검색 시스템이 실제 찾고자 하는 API 메서드 대신 푸터에 있는 “Terms of Service” 링크와 매치될 수 있습니다.

해결책: 프레임워크 인식 스크래퍼

이 정확한 문제를 해결하기 위해 Tech Docs to LLM‑Ready Markdown 를 만들었습니다.
각 페이지를 HTML 태그의 무리로 취급하는 대신, 이 Apify 액터는 문서 프레임워크(Docusaurus, GitBook, MkDocs 등)를 감지하고 여러분이 필요로 하는 콘텐츠만을 지능적으로 추출합니다.

Tech Docs to Markdown for RAG & LLM – Apify

🚀 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 어시스턴트를 구축하고 있다면 한 번 시도해 보세요. 데이터 정리에 드는 시간을 크게 절감할 수 있습니다.

Tech Docs Scraper 사용해 보기

댓글에 추가하고 싶은 다른 문서 프레임워크가 있으면 알려 주세요! 👇

Back to Blog

관련 글

더 보기 »