Jeśli pracujesz w firmie, która wykorzystuje dane internetowe, na pewno wiesz, że jest to tylko pierwsza warstwa bardziej złożonego produktu. W rzeczywistości, dane skrapione w sieci są tradycyjnie przechowywane w plikach lub bazach danych (skrzynki do przechowywania danych w chmurze, jeziora danych lub magazyny danych), a następnie analizowane przy użyciu narzędzi Business Intelligence (BI), zarówno komercyjnych, jak i własnych. Na przykład zespół może skrapać ceny produktów lub opinie klientów z sieci, zapisać surowe dane jako pliki CSV/JSON, załadować je do magazynu danych SQL, a następnie używać platform BI, takich jak Tableau lub Power BI, do tworzenia tablic i raportów. Nowoczesne rozwiązania do skrapowania stron internetowych nawet produkują dane w ustrukturyzowanych Dzisiaj duże modele językowe (LLM) zmieniają ten paradygmat. Zamiast polegać wyłącznie na statycznych tablicach sterowania lub zapytaniach SQL, organizacje mogą korzystać z asystentów AI, aby uzyskać wgląd z skrapanych danych za pośrednictwem wskazówek języka naturalnego. Innymi słowy, zamiast pisania zapytania przez człowieka lub interpretowania wykresu, asystent AI może bezpośrednio odpowiedzieć na pytania dotyczące danych. Pomyśl o tym, aby mieć interfejs podobny do ChatGPT i napisać kilka wskazówek, aby uzyskać wgląd, omijając tworzenie tablic sterowania. Widziałem tego rodzaju podejście w kilku produktach, zanim LLM wyszły, ale bez dużego sukcesu. Ewolucyjny krajobraz AI i cotygodniowe ulepszenia, które widzim Wyobraź sobie pytania, To podejście obiecuje szybszy, bardziej intuicyjny dostęp do informacji dla nietechnicznych użytkowników bez konieczności budowania wykresów lub pisania kodu.W poprzednich firmach, w których pracowałem, zaobserwowałem zbyt wiele razy proliferację różnych wykresów na grupę użytkowników (jeśli nie na użytkownika), czasami wyodrębniając różne liczby od siebie. Który z konkurentów miał najwyższą cenę w ostatnim kwartale? Oczywiście, pojawia się nowy zestaw wyzwań: co z halucynacjami? Jeśli nie widzimy podstawowej liczby odpowiedzi, czy możemy być w stu procentach pewni, że odpowiedź jest poprawna? W tym poście (i następnym w serii Lab) zbudujemy projekt end-to-end, w którym zaczniemy od skrobania artykułów w tym biuletynie, umieszczania ich w bazie danych odpowiedniej do wykorzystania AI, pobierania tej wiedzy, a następnie publikowania aplikacji internetowej, która może używać wzbogaconej wersji modelu GPT. Poprawa wiedzy LLM Integracja niestandardowych danych (takich jak skrojony zestaw danych) w programie LLM może odbywać się głównie na dwa sposoby: Wzorem lub przy użyciu , a każda z tych metod ma zalety i wady. zobaczmy, jak się różnią i jakie podejście może być najlepsze dla naszego przypadku użycia. fine-tuning Retrieval-Augmented Generation (RAG) Fine-Tuning vs. generacja wzmocniona oznacza szkolenie podstawy LLM na dodatkowych danych, aby wchłonąć nową wiedzę. W istocie, można wziąć wstępnie przeszkolony model i kontynuować szkolenie go na danym obszarze danego zbioru danych, dostosowując jego wagi, aby wstawić tę wiedzę. Na przykład, jeśli skrapali zbiór artykułów technicznych, można dopasować LLM na tych artykułach. Fine-tuning jest często wykonywany przez dostarczanie modelu z dużym zestawem par pytań-odpowiedzi lub fragmentów tekstu z twoich danych, aby nauczył się odpowiadać z tymi informacjami, gdy są one istotne. - wiedza staje się częścią jego parametrów. następnym razem, gdy kwestionujesz model, może on czerpać z tych informacji bez potrzeby pomocy zewnętrznej. Fine-tuning intrinsically knows augmented from the inside przyjmuje inne podejście: model pozostaje niezmieniony, ale dajemy mu dostęp do zewnętrznej bazy wiedzy (zwykle za pośrednictwem wyszukiwania wektorowego). LLM następnie generuje swoją odpowiedź za pomocą tego kontekstu uzupełniającego. Dla boomers jak ja, rozważ to jak wstawianie CD w głowie Neo w Matrix, aby nauczyć się nowych umiejętności i ruchów. W naszym przypadku baza wiedzy może być zbiorem skrapanych artykułów internetowych przechowywanych w specjalistycznej bazie danych. RAG jest jak egzamin z otwartej książki dla LLM - w czasie zapytania przygląda się odpowiedniej „stronie” danych i używa go do sformułowania odpowiedzi, zamiast opierać się wyłącznie na swojej wewnętrznej pamięci. Retrieval-Augmented Generation (RAG) retrieve relevant documents Jak można sobie wyobrazić, jedna kluczowa różnica polega na tym, gdzie pozostaje dodatkowa wiedza: przy wyrafinowaniu wiedza jest osadzona. (wagi modelu są aktualizowane). z RAG, wiedza pozostaje Fine-tuning jest podobny do nauczania modelu nowych faktów na stałe, podczas gdy RAG jest jak wyposażenie modelu w dynamiczną bibliotekę, do której może się odwoływać na lotu. in the model itself external Oba podejścia mają różne plusy i minusy: Fine-Tuning: Once fine-tuned, the model can respond faster and more integratedly to new knowledge. It doesn't need lengthy prompts with documents each time. A well-fine-tuned model typically outperforms the base model on domain-specific questions because it has a deeper understanding of that niche terminology and content. Pros: Fine-tuning can be resource-intensive and time-consuming – you need sufficient training data and computing power (or budget if using a service). It also makes the model static concerning that training snapshot. If your scraped data changes or new information comes in, you’d have to fine-tune again to update the model. There’s also a risk of the model or overriding some of its original knowledge if not carefully managed. Importantly, fine-tuning means your data becomes part of the model’s parameters, which could be a privacy concern if the model weights are exposed or if using a third-party service to fine-tune (your data is uploaded for training). Last but not least, once the knowledge is embedded in the model, you cannot cite any article used to improve it. Cons: forgetting Retrieval-Augmented Generation (RAG): No need to modify the LLM itself – you leave the base model as-is and simply provide relevant context at query time. This makes updating or expanding the knowledge base easy: add or remove documents in your external index, and the model will use the latest data. It’s very flexible and (which can be more secure). RAG can reduce hallucinations by grounding answers in real sources – essentially, the model has the “receipts” to back up its answer. It also typically requires less upfront work than full fine-tuning; most effort goes into setting up the retrieval system. Pros: keeps your proprietary data external RAG introduces more moving parts – you need a system for embedding and indexing documents and retrieving them at runtime. At query time, you pay the cost in latency and token length for feeding documents into the model’s prompt. If the retrieved documents aren’t relevant (due to a bad query or vector mismatch), the answer will suffer. The LLM is also limited by its input size; if the documents plus question exceeds the model’s context window, you might have to truncate or select fewer documents. Additionally, the raw text of documents might influence the model's style, which could lead to less coherent or conversational answers unless you prompt it to refine the wording. Cons: W skrócie, subtelne dostosowywanie działa w celu skoncentrowanego zrozumienia, podczas gdy RAG umożliwia dostęp do wiedzy w czasie rzeczywistym.W naszym przypadku wykorzystania integracji stale aktualizowanych danych skrawanych, RAG wydaje się lepszym podejściem: można stale wciągać nowe dane internetowe i mieć swojego asystenta używać go natychmiast, zamiast okresowo ponownie szkolić cały model. Zanim przejdziemy dalej, warto zauważyć, że fine-tuning i RAG nie są wzajemnie wykluczające się; mogą się wzajemnie uzupełniać. Na przykład, możesz fine-tune model, aby dostosować jego ton lub zdolność do przestrzegania instrukcji (lub dodać wiedzę, która jest mała i statyczna), i nadal używać RAG, aby dać mu dostęp do większej bazy wiedzy, która aktualizuje się często. Używanie modelu lokalnego vs. zewnętrznego API Kolejnym rozważaniem jest dla twojego asystenta AI: lokalny (open-source) model, który uruchamiasz samodzielnie lub model hostowany za pośrednictwem API (takiego jak OpenAI GPT-3.5/GPT-4 lub inne). what LLM to use – Modele takie jak LLaMA 2, Mistral lub Falcon mogą być uruchamiane na własnych serwerach. Twoje skrapione dane nigdy nie opuszczają Twojego środowiska, co jest ważne, jeśli zawierają wrażliwe informacje. Możesz je swobodnie dostosować do swoich danych lub modyfikować sposób ich działania. W sensie kosztów uruchamianie modelu lokalnego może być tańsze na duże ilości zapytań (bez opłat API), ale musisz zainwestować w infrastrukturę sprzętową lub w chmurę, aby go hostować. Wadą jest to, że wiele otwartych modeli nie może odpowiadać wydajności najnowszych GPT. Możesz potrzebować większych lub bardziej wyspecjalizowanych modeli, aby uzyskać porównywalną wydajność, co może być skomplikowane do zarządzania. Mając wysoce specyficzny dla danej domeny zbiór danych i wiedzę fachową, model lokalny może być dostosowany do doskonałości w tej dziedzinie, co czyni go silnym rozwiązaniem dla „prywatnego GPT”. Local Open-Source LLMs control and privacy do – Korzystanie z API, takiego jak GPT-4 OpenAI, oznacza, że nie musisz się martwić o uruchomienie modelu; po prostu wyślesz swoje zaproszenia do ich serwisu i otrzymasz zakończenie. Jest to bardzo wygodne i zazwyczaj daje Ci dostęp do najnowocześniejszej jakości modelu bez kłopotów z infrastrukturą. W naszym scenariuszu możesz użyć RAG, po prostu przesyłając pobrane dokumenty do zaproszenia i prosząc API o odpowiedź. Wady tutaj dotyczą dostosowania i prywatności. Nie każdy model jest dostępny do fine-tuning ( Podlegają one również zasadom dostawcy (na przykład mogą mieć filtry zawartości, które mogą uniemożliwić niektóre zapytania związane ze skrapaniem).Z punktu widzenia prywatności wysyłasz swoje dane (zapytanie i pobrany kontekst) do strony trzeciej, więc nie sugeruję tego podejścia do danych wrażliwych lub chronionych prawami autorskimi. External API LLMs (e.g. OpenAI’s) OpenAI, for example, allows you to do it on GPT4-o and GPT4-mini OpenAI, na przykład, pozwala to zrobić na GPT4-o i GPT4-mini Ogólnie rzecz biorąc, jeśli twój przypadek użytkowania obejmuje bardzo wrażliwe dane lub wymaga pełnej kontroli, zaleca się lokalny LLM pomimo dodatkowego wysiłku. Jeśli twoim priorytetem jest najlepsza możliwa zdolność językowa i szybka konfiguracja, model hostowany, taki jak OpenAI, może być lepszym wyborem. W implementacji tego posta ilustrujemy korzystanie z GPT API OpenAI dla prostoty i jakości, ale system odzyskiwania, który zbudujemy, mógłby równie łatwo zasilać model open-source, taki jak Llama2 za pośrednictwem bibliotek HuggingFace lub LangChain. Mechanizm odzyskiwania (baza wektorowa + wyszukiwanie podobieństwa) pozostaje taki sam; tylko ostateczny model generujący odpowiedź byłby inny. Będziemy korzystać z podejścia RAG z modelem OpenAI, który dobrze pasuje do stale aktualizowanych danych internetowych i uniknie potrzeby kosztownych zadań fine-tuning. Scraping TWSC z Firecrawl jest silnikiem skrapienia stron internetowych, który jest eksponowany jako REST API i SDK. Jest specjalnie zaprojektowany, aby przekształcić strony internetowe w (w formatach takich jak czysty tekst lub markdown), obsługuje wszystkie ciężkie podnoszenie, takie jak skanowanie linków, renderowanie JavaScript itp. Wielką zaletą Firecrawla jest to, że za pomocą jednego połączenia API można skrapać całą witrynę. ognisko LLM-ready data ognisko ognisko Dla bloga The Web Scraping Club, będziemy korzystać z mapy witryny, aby odkryć wszystkie adresy URL artykułu. (Blog jest hostowany na Substack, który zapewnia mapę witryny XML zawierającą listę wszystkich postów.) Firecrawl może przeglądać witrynę bez mapy witryny, ale używanie jej jako punktu wyjścia może być bardziej wydajne i upewnić się, że nie przegapimy żadnych stron. Po pierwsze, zainstalowaliśmy Firecrawl, instalując jego Python SDK i uwierzytelniając za pomocą klucza API (pod warunkiem, że się zarejestrowałeś i otrzymałeś klucz): from firecrawl import FirecrawlApp import os os.environ["FIRECRAWL_API_KEY"] = "YOURKEY" # or load from .env app = FirecrawlApp() # Define the sitemap URL (we can loop this for multiple years if needed) map_result = app.map_url('https://substack.thewebscraping.club/sitemap.xml', params={ 'includeSubdomains': True }) print(map_result) for article in map_result['links']: if '/p/' in article: print(article) response = app.scrape_url(url=article, params={'formats': [ 'markdown' ]}) Z zaledwie kilku wierszy kodu, nasze artykuły są już w formacie Markdown. Wybór wektorowej bazy danych dla RAG a jest kluczowym elementem wdrażania RAG. Przechowuje wkłady dokumentów (reprezentacje wektorowe) i umożliwia szybkie wyszukiwanie podobieństw w celu uzyskania odpowiednich dokumentów dla danego wkładu zapytania. Istnieje wiele opcji, w tym biblioteki open-source i usługi zarządzane w chmurze, ale w naszej implementacji użyjemy . vector database Pinecone Jest a W przeciwieństwie do baz danych o otwartym źródle, które wymagają samodzielnego hostowania, Pinecone jest rozwiązaniem w chmurze, co oznacza, że nie musimy martwić się zarządzaniem infrastrukturą. automatycznie obsługuje indeksowanie, optymalizację opóźnienia wyszukiwania i skalowanie. Pinekony fully managed vector database Pinekony Ustawienie Pinecone Pierwsze kroki to oczywiście zalogowanie się do Pinecone i uzyskanie API_KEY i środowiska z pulpitu. pip install pinecone Wreszcie możemy połączyć się z Pinecone w naszym scenariuszu from pinecone import Pinecone, ServerlessSpec pc = pinecone.Pinecone( api_key="YOUR API KEY" ) Wartość środowiska pochodzi z konsoli internetowej Pinecone podczas tworzenia klucza API. Tworzenie indeksu Pinecone Indeks to miejsce, w którym Twoje dane są przechowywane do późniejszej retrybucji z LLM. Zamiast być w prostym tekście, jest w formacie wektorowym (w zasadzie struną liczb), co pozwala LLM zrozumieć, który wpis w indeksie jest bardziej prawdopodobna dobra odpowiedź na zapytanie, które LLM robi. w a jak , oprócz danych wektorowych, mamy również metadane: metadane są Umieszczane są obok każdego wektoru (wklejanie), aby odzyskiwanie było bardziej znaczące. vector database Pinecone, , or ChromaDB Wiedźmin extra information ChromaDB ChromaDB Wiedźmin Wiedźmin Podczas gdy Przedstawiamy wykorzystywane do wyszukiwania podobieństw, dostarcza strukturalnych informacji na temat tego, co reprezentuje wektor. Podczas gdy w danych wektorowych będziemy wstawiać znaczniki artykułów, w metadanych będziemy używać pewnych informacji, które chcemy, aby LLM dzielił się z nami, takich jak autor bloga użytego do odpowiedzi, tytuł i link do posta. vectors numerical embeddings metadata filtering, categorization, and interpretability index_name = "article-index" if not pc.has_index(index_name): index_model = pc.create_index_for_model( name=index_name, cloud="aws", region="us-east-1", embed={ "model":"llama-text-embed-v2", "field_map":{"text": "chunk_text"} } ) #pc.describe_index(index_name) #to get the host index=pc.Index(host='YOURINDEXENDPOINT') ..... article_data = [ {"id": f"article-{i}", "text": page["markdown"], "url": page["metadata"]["url"], "title": page["metadata"]["title"], "author": page["metadata"]["author"][0]} for i, page in enumerate(scrape_results['data']) ] #print(article_data) # Generate embeddings using LLaMA v2 for article in article_data: # Estrai il testo dell'articolo text = article["text"] #print(text) # Single article insert to avoid failures embedding = pc.inference.embed( model="llama-text-embed-v2", inputs=[text], parameters={"input_type": "passage"} ) # Prepare data for Pinecone upsert vector_data = { "id": article["id"], # Unique article ID "values": embedding[0]["values"], # Embedding vector "metadata": { "url": article["url"], # Store article URL "content": text[:300], # Store first 500 chars as a preview/snippet "title": article["title"][:100], "author": article["author"][:50] } } #print(vector_data) # Upsert the single article into Pinecone index.upsert(vectors=[vector_data], namespace="articles") print(f"✅ Upserted: {article['id']} ({article['title']})") # Optional: Add a short delay to prevent API rate limits (adjust as needed) time.sleep(1) Jak widać z kodu, w zasadzie powtarzamy każdy artykuł skrapany wcześniej i dodajemy go do nowo utworzonego indeksu o nazwie . article-index Jeśli chcesz grać więcej z Pinecone tam jest an extensive documentation on their website. Duża dokumentacja na ich stronie internetowej. Ale teraz, gdy wstawiłem wszystkie artykuły na indeksie, czy możemy wyodrębnić potrzebne nam informacje? Stworzyłem podstawowy skrypt o nazwie query.py, aby przetestować wyniki wyszukiwań w indeksie. Na pytanie „Czy możesz wymienić kilka artykułów na temat obejścia Kasady?”, zapytanie zwraca następujące artykuły: {'matches': [{'id': 'article-0', 'metadata': {'author': 'Pierluigi Vinciguerra', ..., 'title': 'THE LAB #76: Bypassing Kasada With Open ' 'Source Tools In 2025', 'url': 'https://substack.thewebscraping.club/p/bypassing-kasada-2025-open-source'}, 'score': 0.419812053, 'values': []}, {'id': 'article-129', 'metadata': {'author': 'Pierluigi Vinciguerra', ..., 'title': 'How to by-pass Kasada bot mitigation?', 'url': 'https://substack.thewebscraping.club/p/how-to-by-pass-kasada-bot-mitigation'}, 'score': 0.418432325, 'values': []}, {'id': 'article-227', 'metadata': {'author': 'Pierluigi Vinciguerra', ..., 'title': 'Scraping Kasada protected websites', 'url': 'https://substack.thewebscraping.club/p/scraping-kasada-protected-websites'}, 'score': 0.378159761, 'values': []}], 'namespace': 'articles', 'usage': {'read_units': 6}} Nie jest źle!Wszystkie trzy artykuły były dokładnie na ten temat! Na dziś wystarczy, w następnym odcinku zobaczymy, jak podłączyć ten DB do GPT4, a następnie utworzyć prosty interfejs użytkownika, aby napisać polecenia i uzyskać potrzebne dane. Artykuł jest częścią serii „The Lab” przez Pierluigi Vinciguerra. Sprawdź jego substack stronę, aby uzyskać więcej informacji na temat skrapienia stron internetowych. Artykuł jest częścią serii „The Lab” przez Pierluigi Vinciguerra. Sprawdź jego substack stronę, aby uzyskać więcej informacji na temat skrapienia stron internetowych. „Laboratorium”