Zbuduj bazę wiedzy chatbota poprzez scrapowanie strony: Crawlowanie, dzielenie, cytowanie
Bot wsparcia jest tak dobry, jak to, czym go zasilisz. Skieruj go na swoją stronę — dokumentację, FAQ, centrum pomocy — poprzez crawlowanie do czystego markdown i dzielenie na fragmenty do odzyskiwania. Oto pipeline, który utrzymuje odpowiedzi ugruntowane i cytowane.
Chatbot wsparcia jest tak dobry, jak to, czym go zasilisz, a najlepszym źródłem jest zazwyczaj Twoja własna strona — dokumentacja, FAQ i artykuły z centrum pomocy, które już utrzymujesz. Problem polega na tym, że bot nie czyta strony tak jak człowiek; potrzebuje czystego, podzielonego, możliwego do odzyskania tekstu z dołączonym źródłem do każdego fragmentu. Ten przewodnik to pełny pipeline: crawl strony do markdown, dzielenie, osadzanie w magazynie wektorów i odzyskiwanie cytowanego kontekstu w momencie zapytania — ugruntowana baza wiedzy, która pozostaje dokładna w miarę zmian na Twojej stronie.
Dlaczego RAG, a nie fine-tune
Możesz dostroić model do swojej treści, ale dla bota wsparcia to niewłaściwe narzędzie: ponowne trenowanie jest powolne, kosztowne i przestaje być aktualne w momencie edycji dokumentu. Retrieval-augmented generation (RAG) utrzymuje wiedzę poza modelem — dziel swoją treść, osadzaj ją, a w momencie pytania odzyskuj najbardziej istotne fragmenty i przekazuj je modelowi jako kontekst. Zaktualizuj dokument, ponownie crawl, a wiedza bota aktualizuje się wraz z nim. Zapotrzebowanie jest realne: rynek chatbotów ma rosnąć w tempie 23,3% CAGR do 2030 roku, badanie KPMG wykazało, że 69% ludzi już używa chatbotów, a badanie Stanford i MIT na 5,179 agentach wsparcia wykazało średni wzrost produktywności o 14% dzięki generatywnej pomocy AI — 35% dla nowych agentów.
Krok 1: crawl strony do czystego markdown
Podawanie surowego HTML do pipeline RAG zatruwa go nawigacją, banerami cookie i tagami skryptów. Zamiast tego crawl bezpośrednio do markdown — zachowuje nagłówki, listy i tabele, jednocześnie eliminując szum prezentacyjny, co jest dokładnie tym, co LLM najlepiej przyswaja. Scraper API z trybem crawl przechodzi przez stronę i zwraca każdą stronę jako czysty markdown:
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": ...}
Crawlowanie własnej strony jest proste; crawlowanie dokumentów za ograniczeniami geograficznymi lub limitami szybkości to miejsce, gdzie znaczenie ma routing przez odpowiednie IP, aby crawl zakończył się zamiast zatrzymać w połowie. Markdown-first to ta sama zasada, co zasilanie LLM świeżymi danymi z sieci.
Krok 2: dzielenie według nagłówków, zachowaj źródło
Nie osadzaj całych stron — odzyskiwanie działa najlepiej na skoncentrowanych fragmentach. Podziel każdą stronę według jej nagłówków, aby każdy fragment był jednym spójnym tematem, i dołącz URL źródła do każdego, aby móc go później cytować. To także miejsce, gdzie dobry dokument źródłowy się opłaca: artykuły z wyraźnymi nagłówkami, jedna idea każda, i pytania powtórzone w tekście dzielą się znacznie lepiej niż ściana tekstu (bot nie może wywnioskować kontekstu, który zrozumiałby człowiek):
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"])]

Krok 3: osadzanie, przechowywanie i odzyskiwanie z cytatami
Osadź każdy fragment w wektorze i wstaw go do bazy danych wektorów z URL źródła jako metadanymi. W momencie zapytania osadź pytanie użytkownika, wyciągnij kilka najlepszych dopasowań i przekaż ich tekst modelowi jako kontekst — i wyświetl linki źródłowe, aby odpowiedź była sprawdzalna, a nie czarną skrzynką:
# 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)
Ugruntowanie modelu w odzyskanym kontekście — i nakazanie mu odpowiadania tylko z tego kontekstu — to to, co powstrzymuje bota wsparcia przed pewnym wymyślaniem polityki. Cytaty pełnią podwójną rolę: pozwalają użytkownikom weryfikować i pozwalają zauważyć, kiedy bot sięga po niewłaściwy dokument. Dla głębszej mechaniki, nasz przewodnik po pipeline RAG, które nie są przestarzałe idzie dalej w dzielenie i odzyskiwanie.
Krok 4: odświeżanie, inaczej się psuje
Baza wiedzy to żywy organizm. Dokumenty są przepisywane, ceny się zmieniają, pojawiają się nowe artykuły — a bot odpowiadający z zeszłomiesięcznego crawl daje błędne odpowiedzi z pełnym przekonaniem. Zaplanuj ponowne crawlowanie, porównaj każdą stronę z jej ostatnią wersją i ponownie osadź tylko to, co się zmieniło, aby odświeżanie pozostało tanie. Zachowaj datę pobrania na każdym fragmencie, aby zawsze wiedzieć, jak aktualne jest źródło odpowiedzi. Jeśli wolisz korzystać z zarządzanego, zawsze świeżego źródła danych niż samodzielnie prowadzić crawl i odświeżanie, dane sieciowe zbudowane dla LLM zajmują się stroną zbierania.

Crawl dowolnej strony do czystego markdown dla swojego bota
Najczęściej zadawane pytania
Jak zbudować bazę wiedzy chatbota ze strony?
Crawl strony do czystego markdown, podziel każdą stronę na fragmenty oparte na nagłówkach z dołączonym URL źródła, osadź fragmenty w bazie danych wektorów, a w momencie zapytania odzyskaj najbardziej istotne fragmenty, aby ugruntować odpowiedź modelu. Zaplanuj ponowne crawlowanie, aby utrzymać aktualność. Podejście RAG oznacza, że edytowanie dokumentu aktualizuje wiedzę bota bez potrzeby ponownego trenowania.
Czy muszę trenować model na swojej treści?
Nie — i dla bota wsparcia nie powinieneś. Fine-tuning jest powolny, kosztowny i przestaje być aktualny, gdy tylko zmienia się Twoja treść. Retrieval-augmented generation utrzymuje wiedzę w magazynie wektorów poza modelem, więc bot zawsze odpowiada z aktualnego crawl. Musisz tylko ponownie crawlować i osadzać, gdy zmienia się treść, co jest znacznie tańsze niż ponowne trenowanie.
Dlaczego crawl do markdown zamiast HTML?
Surowy HTML niesie nawigację, reklamy, banery cookie i skrypty, które dodają szumu i marnują Twój budżet osadzania. Markdown zachowuje znaczącą strukturę — nagłówki, listy, tabele — jednocześnie eliminując warstwę prezentacyjną, co LLM najlepiej przyswaja. Czystsze dane wejściowe oznaczają bardziej trafne odzyskiwanie i mniej mylących odpowiedzi. Boty także nie mogą czytać obrazów ani wideo, więc kluczowe informacje trzymaj w tekście.
Jak utrzymać bazę wiedzy aktualną?
Zaplanuj okresowe ponowne crawlowanie, wykryj, które strony się zmieniły, i ponownie osadź tylko te — pełne ponowne crawlowanie marnuje przepustowość i zasoby obliczeniowe. Przechowuj datę pobrania na każdym fragmencie, aby móc określić, jak świeże jest źródło odpowiedzi, i wersjonuj indeks, aby móc cofnąć się, jeśli zły crawl pogorszy odzyskiwanie. Inkrementalne odświeżanie utrzymuje koszty proporcjonalne do rzeczywistych zmian.
Pipeline to tutaj produkt: crawl do markdown, dzielenie według nagłówków, osadzanie ze źródłami, odzyskiwanie i cytowanie, a następnie odświeżanie zgodnie z harmonogramem. Zrób to, a Twój bot wsparcia odpowiada z Twojej rzeczywistej treści, linkuje swoje źródła i pozostaje aktualny w miarę ewolucji Twojej strony — różnica między botem, któremu ludzie ufają, a takim, którego uczą się omijać. Aby dać agentowi AI dostęp na żywo do tych samych danych przez standardowy interfejs, zobacz nasz przewodnik po QuantumProxies MCP server.