웹사이트 스크래핑으로 챗봇 지식 베이스 구축하기: 크롤링, 청크, 인용
지원 봇은 제공된 정보만큼만 유용합니다. 크롤링을 통해 문서, FAQ, 도움말 센터를 청크로 나누고 인용하여 깨끗한 마크다운으로 변환하세요. 답변을 근거 있게 유지하고 인용하는 파이프라인을 소개합니다.
지원 챗봇은 제공된 정보만큼만 유용하며, 가장 좋은 정보는 보통 자신의 웹사이트 — 이미 유지하고 있는 문서, FAQ 및 도움말 센터 기사입니다. 문제는 봇이 사람처럼 웹사이트를 읽을 수 없다는 것입니다; 각 조각에 출처가 첨부된 깨끗하고 청크로 나뉘며 검색 가능한 텍스트가 필요합니다. 이 가이드는 전체 파이프라인입니다: 사이트를 마크다운으로 크롤링하고, 청크로 나누고, 벡터 저장소에 임베드하고, 쿼리 시점에 인용된 컨텍스트를 검색하여 사이트가 변경될 때마다 정확한 지식 베이스를 유지합니다.
왜 RAG인가, 파인 튜닝이 아닌
모델을 콘텐츠에 맞게 파인 튜닝할 수도 있지만, 지원 봇에는 잘못된 도구입니다: 재훈련은 느리고 비용이 많이 들며, 문서를 편집하는 순간 오래된 것이 됩니다. 검색 보강 생성(RAG)은 지식을 모델 외부에 유지합니다 — 콘텐츠를 청크로 나누고, 임베드하고, 질문 시점에 가장 관련 있는 조각을 검색하여 모델에 컨텍스트로 제공합니다. 문서를 업데이트하고 다시 크롤링하면 봇의 지식도 업데이트됩니다. 수요는 실제입니다: 챗봇 시장은 2030년까지 23.3% CAGR로 성장할 것으로 예상되며, KPMG 연구에 따르면 이미 69%의 사람들이 챗봇을 사용하고 있으며, 스탠포드 및 MIT의 5,179명의 지원 에이전트 연구에서는 생성 AI 지원으로 평균 14%의 생산성 향상을 측정했습니다 — 최신 에이전트의 경우 35%입니다.
1단계: 사이트를 깨끗한 마크다운으로 크롤링하기
원시 HTML을 RAG 파이프라인에 공급하면 탐색, 쿠키 배너 및 스크립트 태그로 오염됩니다. 대신 마크다운으로 직접 크롤링하세요 — 제목, 목록 및 표를 유지하면서 프레젠테이션 노이즈를 제거합니다. 이는 LLM이 가장 잘 소화하는 것입니다. 크롤 모드가 있는 Scraper API는 사이트를 탐색하고 각 페이지를 깨끗한 마크다운으로 반환합니다.
import requests
resp = requests.post(
"https://api.quantumproxies.io/crawl",
json={"url": "https://docs.example.com", "limit": 300, "format": "markdown"},
headers={"Authorization": "Bearer YOUR_API_KEY"},
timeout=120,
)
pages = resp.json()["pages"] # each: {"url": ..., "markdown": ...}
자신의 사이트를 크롤링하는 것은 간단하지만, 지리적 제한이나 속도 제한이 있는 문서를 크롤링할 때는 올바른 IP를 통해 라우팅하는 것이 중요합니다. 그래야 크롤링이 중단되지 않고 완료됩니다. 마크다운 우선은 LLM에 신선한 웹 데이터를 공급하는 것과 동일한 원칙입니다.
2단계: 제목별로 청크로 나누고 출처 유지하기
전체 페이지를 임베드하지 마세요 — 검색은 집중된 청크에서 가장 잘 작동합니다. 각 페이지를 제목별로 나누어 각 청크가 하나의 일관된 주제가 되도록 하고, 나중에 인용할 수 있도록 각 청크에 출처 URL을 포함하세요. 이는 좋은 소스 문서가 가치 있는 이유이기도 합니다: 명확한 제목, 각기 다른 아이디어, 텍스트에 재진술된 질문이 있는 기사는 장문의 글보다 훨씬 더 나은 청크를 만듭니다 (봇은 사람이 이해할 수 있는 컨텍스트를 추론할 수 없습니다):
def chunk_markdown(md, source_url):
chunks, cur = [], {"heading": "", "text": ""}
for line in md.splitlines():
if line.startswith("#"):
if cur["text"].strip():
chunks.append({**cur, "source": source_url})
cur = {"heading": line.lstrip("# ").strip(), "text": ""}
else:
cur["text"] += line + "\n"
if cur["text"].strip():
chunks.append({**cur, "source": source_url})
return chunks
all_chunks = [c for p in pages for c in chunk_markdown(p["markdown"], p["url"])]

3단계: 임베드, 저장, 인용과 함께 검색
각 청크를 벡터로 임베드하고 출처 URL을 메타데이터로 하여 벡터 데이터베이스에 업서트하세요. 쿼리 시점에 사용자의 질문을 임베드하고, 상위 몇 개의 일치 항목을 가져와 모델에 컨텍스트로 전달하세요 — 그리고 출처 링크를 표면화하여 답변이 검증 가능하고 블랙박스가 되지 않도록 하세요:
# index each chunk with its source as metadata
for c in all_chunks:
vec = embed(c["heading"] + "\n" + c["text"])
index.upsert(id=uid(c), values=vec,
metadata={"source": c["source"], "text": c["text"]})
# at query time: retrieve, ground, and cite
hits = index.query(embed(user_question), top_k=4)
context = "\n\n".join(h.metadata["text"] for h in hits)
citations = list({h.metadata["source"] for h in hits})
answer = llm(f"Answer using only this context:\n{context}", question=user_question)
모델을 검색된 컨텍스트에 기반을 두고 — 그 컨텍스트에서만 답변하도록 지시하는 것이 지원 봇이 정책을 자신 있게 발명하는 것을 막는 것입니다. 인용은 이중 역할을 합니다: 사용자가 검증할 수 있게 하고, 봇이 잘못된 문서를 참조할 때 이를 발견할 수 있게 합니다. 더 깊은 메커니즘에 대해서는 오래되지 않은 RAG 파이프라인에 대한 가이드에서 청크 및 검색에 대해 더 자세히 설명합니다.
4단계: 갱신하지 않으면 부패합니다
지식 베이스는 살아 있는 것입니다. 문서는 다시 작성되고, 가격은 변하고, 새로운 기사가 나타납니다 — 지난달의 크롤링에서 답변하는 봇은 완전한 확신으로 잘못된 답변을 제공합니다. 다시 크롤링을 예약하고 각 페이지를 이전 버전과 비교하여 변경된 것만 다시 임베드하여 갱신 비용을 절감하세요. 각 청크에 가져온 날짜를 기록하여 답변의 출처가 얼마나 최신인지 항상 알 수 있게 하세요. 크롤링과 갱신을 직접 실행하는 대신 관리되고 항상 신선한 피드를 소비하고 싶다면, LLM을 위한 웹 데이터가 수집 측면을 처리합니다.

자주 묻는 질문
웹사이트에서 챗봇 지식 베이스를 어떻게 구축하나요?
사이트를 깨끗한 마크다운으로 크롤링하고, 각 페이지를 출처 URL이 첨부된 제목 기반 청크로 나누고, 청크를 벡터 데이터베이스에 임베드하고, 쿼리 시점에 가장 관련 있는 청크를 검색하여 모델의 답변을 근거 있게 만드세요. 최신 상태를 유지하기 위해 다시 크롤링을 예약하세요. 이 RAG 접근 방식은 문서를 편집하면 재훈련 없이 봇의 지식이 업데이트된다는 것을 의미합니다.
내 콘텐츠에 모델을 훈련시켜야 하나요?
아니요 — 그리고 지원 봇의 경우 그렇게 하지 않아야 합니다. 파인 튜닝은 느리고 비용이 많이 들며, 콘텐츠가 변경될 때마다 오래된 것이 됩니다. 검색 보강 생성은 지식을 모델 외부의 벡터 저장소에 유지하여 봇이 항상 현재 크롤링에서 답변하도록 합니다. 콘텐츠가 변경될 때만 다시 크롤링하고 다시 임베드하면 되며, 이는 재훈련보다 훨씬 저렴합니다.
HTML 대신 마크다운으로 크롤링하는 이유는 무엇인가요?
원시 HTML은 탐색, 광고, 쿠키 배너 및 스크립트를 포함하여 소음을 추가하고 임베드 예산을 낭비합니다. 마크다운은 의미 있는 구조 — 제목, 목록, 표 — 를 유지하면서 프레젠테이션 레이어를 제거합니다. 이는 LLM이 가장 깨끗하게 소화하는 것입니다. 더 깨끗한 입력은 더 관련성 있는 검색과 덜 혼란스러운 답변을 의미합니다. 봇은 이미지나 비디오를 읽을 수 없으므로 주요 정보를 텍스트로 유지하세요.
지식 베이스를 최신 상태로 유지하려면 어떻게 해야 하나요?
주기적인 다시 크롤링을 예약하고, 변경된 페이지를 감지하고, 변경된 것만 다시 임베드하세요 — 전체 다시 크롤링은 대역폭과 컴퓨팅을 낭비합니다. 각 청크에 가져온 날짜를 저장하여 답변의 출처가 얼마나 신선한지 알 수 있게 하고, 인덱스를 버전 관리하여 잘못된 크롤링이 검색을 저하시킬 경우 롤백할 수 있게 하세요. 점진적인 갱신은 실제 변화에 비례하여 비용을 유지합니다.
파이프라인이 여기서 제품입니다: 마크다운으로 크롤링, 제목별로 청크, 출처와 함께 임베드, 검색 및 인용, 그런 다음 일정에 따라 갱신하세요. 이렇게 하면 지원 봇이 실제 콘텐츠에서 답변하고, 출처를 링크하며, 사이트가 발전함에 따라 최신 상태를 유지합니다 — 사람들이 신뢰하는 봇과 피하는 법을 배우는 봇의 차이입니다. AI 에이전트에게 표준 인터페이스를 통해 동일한 데이터에 대한 실시간 액세스를 제공하려면 QuantumProxies MCP 서버에 대한 가이드를 참조하세요.