Kung nagtatrabaho sa isang kumpanya na gumagamit ng data sa web, alam mo na ito ay lamang ang unang layer ng isang mas malakas na produkto. Sa katunayan, ang data ng web-scraping ay tradisyonal na ibinibago sa mga file o database (cloud storage buckets, data lakes, o data warehouses) at pagkatapos ay i-analysado gamit ang mga tool ng Business Intelligence (BI), ang mga commercial at mga proprietary. Halimbawa, ang isang team ay maaaring i-scrape ang mga presyo ng produkto o mga review ng customer mula sa web, i-save ang mga raw data bilang mga file CSV / JSON, i-load ito sa isang SQL data warehouse, at pagkatapos ay gamitin ang mga platform ng BI tulad ng Tableau o Power BI upang bumuo ng dashboards at mga report. Modernong mga solus Ngayon, ang mga Large Language Models (LLMs) ay nagbabago sa paradigma na ito. Sa halip ng pag-iisip lamang sa mga static dashboards o SQL queries, ang mga organisasyon ay maaaring gamitin ang mga assistant ng AI upang makakuha ng mga pag-iisip mula sa mga data sa pamamagitan ng natural language prompts. Sa iba pang mga salita, sa halip ng isang tao na magsulat ng isang query o pag-interpretasyon ng isang diagram, ang isang assistant ng AI ay maaaring mag-sagot sa mga tanong tungkol sa data. Mag-iisip tungkol sa paggawa ng iyong ChatGPT-like interface at mag-script ng ilang mga prompts upang makakuha ng mga pag-iisip, pag-aayos ng pag-iisip, pag-aari ng mga dashboard creation. I've nakita ang uri ng Imagine mo ang tanong, Hindi lamang ang katotohanan, ngunit ito ay, bilang isang gulay, ay lamang ang pinaka-cool na bagay na manufactured sa pamamagitan ng Ina Earth. “Ano ang mga competitor na may pinakamataas na presyo sa last quarter?” Gayunpaman, ang isang bagong set ng mga problema ay tumutulong: ano ang halucinations? Kung hindi natin makita ang pangunahing bilang ng isang solusyon, maaari naming maging 100% sigurado na ang solusyon ay totoo? Sa post na ito (at ang susunod na sa serye ng Lab), i-build ang isang end-to-end na proyekto kung saan magsimula namin sa pamamagitan ng pag-scrap ng mga artikulo sa newsletter na ito, i-set ang mga ito sa isang database na matatagpuan para sa paggamit ng AI, i-recover ang kaalaman na ito, at pagkatapos ay i-publish ang isang web app na maaaring gamitin ang isang na-enriched bersyon ng isang modelo ng GPT. Pagbutihin ang Mga Pangunahing Mga Kaganapan sa LLM Ang pag-integrate ng custom data ( tulad ng iyong scraped dataset) sa isang LLM ay maaaring gawin sa pangunahing dalawang paraan: sa pamamagitan ng sa pamamagitan ng model o sa pamamagitan ng Magbigay ng inspirasyon sa kontemporaryong designer ay maaaring gumawa ng kahit ano, kahit ano, at ang New Year - ay walang exception. fine-tuning Retrieval-Augmented Generation (RAG) Fine-Tuning vs. Retrieval-Augmented Generation sa loob ng isang araw Siguro magtraining ang pangunahing LLM sa mga karagdagang data upang i-absorb ang bagong kaalaman. Sa pangunahing, ikaw ay may isang pre-trained model at patuloy na magtraining ito sa iyong domain-specific dataset, i-adjust ang kanyang mga payo upang i-embed na ang kaalaman. Halimbawa, kung i-scraped mo ang isang koleksyon ng mga teknolohiya ng mga artikulo, maaari mong i-tune ng isang LLM sa mga artikulong ito. Pagkatapos ng fine-tuning, ang modelo Ang maliliit na negosyo sa mga sumusunod na sektor ay kinakailangan: pagproseso ng produktong agrikultural ( - ang kaalaman ay naging bahagi ng kanyang mga parameter. Ang susunod na pagkakataon na i-question ang modelo, ito ay maaaring i-draw sa ito baked-in na impormasyon nang walang kinakailangan ng eksternal na tulong. Fine-tuning intrinsically knows augmented from the inside nagtatrabaho sa isang iba't ibang paraan: ang modelo ay hindi mababago, ngunit nagbibigay namin ito ng access sa isang external knowledge base (mga karaniwang sa pamamagitan ng isang vector search). mula sa iyong data at i-feed ang mga ito sa modelo kasama ang tanong. Ang LLM pagkatapos ay gumaganap ang kanyang solusyon gamit ang tulong ng na suplemento kontekstong. Para sa mga boomers tulad ng akin, tingnan ito tulad ng pag-insert ng isang CD sa Neo's head sa Matrix upang malaman ang mga bagong kakayahan at moves. Sa aming kaso, ang knowledge base ay maaaring maging isang koleksyon ng scraped web articles na ibinibigay sa isang espesyalista database. RAG ay tulad ng isang open-book exam para sa LLM - sa oras ng query ito ay tumingin sa mga relevant na "page" ng data at gumagamit ito upang formulate ang isang solusyon, hindi lamang sa kanyang internal memory. Retrieval-Augmented Generation (RAG) retrieve relevant documents Tulad nila Tirso at Lyn ang mga anak nila, very friendly at magalang. (Ang mga timbang ng modelo ay na-update). Sa RAG, ang kaalaman ay matatagpuan Ang Fine-tuning ay tulad ng pag-aaral ng modelo ng mga bagong katotohanan permanentemente, habang ang RAG ay tulad ng pag-aalok ng modelo ng isang dinamisya na library na ito ay maaaring reference sa fly. in the model itself external Ang dalawang approach ay may iba't ibang pros at cons: 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: Sa katunayan, fin-tuning bakes sa isang fokusadong pag-iisip, habang ang RAG ay nagbibigay-daan sa real-time access sa kaalaman. Para sa aming kasaysayan ng paggamit ng pag-integro ng patuloy na-update na scraped data, ang RAG ay nagpapakita ng isang mas mahusay na paraan: maaari mong continuously i-track sa mga bagong web data at magkaroon ng iyong assistant upang gamitin ito ngayong hindi periodically re-training ang buong modelo. Sa gitna ng Pagpatay ng sarili niyang Olympic maskot , Ang Dysfunctional clean up Ng maruming tubig nito, ang Pag-shutdown ng doping lab nito , Ang Deklarasyon ng isang emergency na pinansiyal , Ang Pagkakaroon ng virus Zika , At Iba't ibang mga kalamidad , Ang Olympic ambitions ng Rio ay isang kalamidad. Paggamit ng isang Local Model vs. isang External API Ang iba pang consideration ay para sa iyong AI assistant: isang lokal (open-source) modelo na i-run ang iyong sarili o isang hosted modelo sa pamamagitan ng isang API (tulad ng OpenAI's GPT-3.5/GPT-4 o iba pang mga tao). Ang parehong fine-tuning at RAG ay maaaring gawin sa parehong, ngunit may mga kompromiso: what LLM to use – Mga modelo tulad ng LLaMA 2, Mistral, o Falcon ay maaaring i-run sa iyong mga server. Ang iyong mga scraped data ay hindi maiiwas sa iyong lugar, na kung saan ito ay mahalaga kung ito ay may sensitibo na impormasyon. Maaari mong i-fine-tune ang mga ito libreng sa iyong data o i-modify kung paano sila ay gumagana. Cost-wise, mag-execute ng isang lokal na modelo ay maaaring maging mas madaling para sa maraming mga volumes ng mga query (no API fee), ngunit kailangan mong i-invest sa hardware o cloud infrastructure upang i-host ito. Ang disadvantage ay na ang maraming mga open na mga modelo ay hindi maaaring matugunan ang pagganap ng mga pinakabagong GPT. Maaari mong gamitin ang mas mataas o higit pa ng mga espesyalista na mga modelo upang makakuha ng katumbas na pagganap, na maaaring maging malusog sa pag-manage. may isang mataas na domain-specific dataset at ang karanasan, ang isang local model ay maaaring fin-tuned upang magkakaiba sa domain na ito, gumagawa ito ng isang malakas na solusyon para sa isang "private GPT." Local Open-Source LLMs control and privacy sa – Ang paggamit ng isang API tulad ng OpenAI's GPT-4 ay nangangahulugan na hindi mo na kailangang mag-alala tungkol sa pag-unlad ng modelo; ikaw lamang magpadala ng iyong mga prompts sa kanilang serbisyo at makakuha ng paghahatid. Ito ay napaka-pakinabang at karaniwang nagbibigay sa iyo ng access sa high-end na kalidad ng modelo nang walang problema sa infrastructure. Para sa aming scenario, maaari mong gamitin ang RAG sa pamamagitan ng simpleng paghahatid ng mga dokumento na natagpuan sa iyong prompt at mangyaring ang API upang makipag-usap. Ang mga disadvantage dito ay may kaugnayan sa customization at privacy. Hindi lahat ng modelo ay magagamit para sa fine-tuning ( Sinusuportahan mo rin ang mga patakaran ng provider (halimbawa, maaaring may mga filter ng nilalaman na maaaring maiwasan ang ilang mga query na may kaugnayan sa scraping). mula sa punto ng privacy, inilathala mo ang iyong data (query at pagkuha ng kontekstong) sa isang third party, kaya hindi ko mag-recommend ito para sa sensitibo o copyrighted data. Ang isa pang limitasyon ay gastos - bawat API call ay nagkakahalaga ng mga token, na maaaring sumunod kapag ikaw ay naglalaman ng maraming kontekstong (scraped text) sa mga prompts. External API LLMs (e.g. OpenAI’s) OpenAI, halimbawa, ay nagbibigay-daan sa iyo upang gawin ito sa GPT4-o at GPT4-mini OpenAI, halimbawa, ay nagbibigay-daan sa iyo upang gawin ito sa GPT4-o at GPT4-mini Sa pangkalahatan, kung ang iyong kaso ng paggamit ay naglalaman ng mataas na sensitibo na data o nangangailangan ng buong kontrol, ang isang lokal na LLM ay inirerekomenda maliban sa karagdagang pag-aaral. Kung ang iyong prioridad ay ang pinakamahusay na posible na kapasidad ng wika at mabilis na pag-setup, isang hosted modelo tulad ng OpenAI ay maaaring maging ang mas mahusay na pagpipilian. Sa implementasyon ng post na ito, makikita namin ang paggamit ng OpenAI's GPT API para sa simplicity at kalidad, ngunit ang sistema ng paghahanap na kami binuo ay maaaring parehong madaling i-feed sa isang open-source modelo tulad ng Llama2 sa pamamagitan ng HuggingFace o LangChain libraries. Ang paghahanap mekanismo (vector database + similarity search) ay parehong; lamang Upang gamitin ang mga ito, i-integrate ang aking mga artikulo sa isang AI assistant. Kami ay gumagamit ng RAG approach sa isang modelo ng OpenAI, na matatagpuan na mabuti sa continuously updated web data at humihingi ng pangangailangan ng mahal na mga trabaho ng pag-tuning. Paggamit ng TWSC sa Firecrawl ito ay isang web scraping engine na itinatag bilang isang REST API at SDK. Ito ay dinisenyo upang i-convert ang mga website sa (sa mga format tulad ng clean text o markdown), nagtatrabaho ang lahat ng mababang lifting, tulad ng crawling links, rendering JavaScript, at iba pa. Ang malaking halaga ng Firecrawl ay na may isang isang API call, maaari mong scrape ang isang buong site. Ito ay gumagawa ito para sa mabilis na pagkuha ng lahat ng nilalaman mula sa aking newsletter upang i-feed sa isang AI. ang firecrawl LLM-ready data ang firecrawl ang firecrawl Para sa blog ng The Web Scraping Club, ginamit namin ang sitemap nito upang matuklasan ang lahat ng mga artikulong URL. (Ang blog ay naka-host sa Substack, na nagbibigay ng isang sitemap ng XML na naglalarawan ng lahat ng mga post.) Firecrawl ay maaaring i-crawl ang site nang walang sitemap, ngunit gamitin ito bilang isang pumasok na punto ay maaaring maging mas mahusay at maghahatid sa amin na hindi natagpuan ang anumang mga pahina. I-set up ang Firecrawl sa pamamagitan ng pag-install ng kanyang Python SDK at pag-authenticate sa isang API key (isipin na ikaw ay nag-sign up at nakuha ng isang key): 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' ]}) Sa loob lamang ng ilang linya ng code, ang aming mga artikulo ay na-markdown na format. Pagpili ng isang Vector Database para sa RAG A ang Ito ay isang pangunahing bahagi ng pag-implementasyon ng RAG. Ito ay i-save ang mga embeddings ng iyong mga dokumento (vector representations) at nagbibigay-daan ng mabilis na paghahanap ng similarity upang makuha ang mga katulad na dokumento para sa isang tiyak na pag-embedding ng query. Maraming mga opsyon ay magagamit, kabilang ang mga library ng open-source at managed cloud services, ngunit para sa aming pag-implementasyon, kami ay gumagamit . vector database Pinecone ay a Binuo para sa mabilis, scalable na paghahanap ng likasidad. Sa iba't ibang open-source databases na nangangailangan ng self-hosting, Pinecone ay isang cloud-native na solusyon, kung saan kailangan nating mag-alala tungkol sa pag-management ng infrastructure. Ito ay automatically nagtatrabaho sa indexing, search latency optimization, at scaling. Pinapanood fully managed vector database Pinapanood Paglalarawan ng Pinecone Ang unang pagkakataon ay, siyempre, mag-sign up sa Pinecone at makakuha ng API_KEY at environment mula sa dashboard. Pagkatapos, maaari naming i-install ang Python SDK tulad ng karaniwang pip install pinecone Pagkatapos, maaari naming mag-connect sa Pinecone sa aming script from pinecone import Pinecone, ServerlessSpec pc = pinecone.Pinecone( api_key="YOUR API KEY" ) Ang halaga ng environment ay dumating mula sa Pinecone web console kapag lumikha mo ang iyong API key. Paggawa ng isang Pinecone Index Ang isang index ay kung saan ang iyong data ay maglagay para sa isang later retrivial mula sa LLM. Sa halip ng maging sa simpleng teksto, ito ay sa vectoral na format (mga pangunahing string ng mga numero), na nagbibigay ng LLM upang malaman kung ano ang entry sa index ay mas malamang na isang mahusay na solusyon para sa query na ang LLM ay gumagawa. sa a ako sa pagitan ng vector data, mayroon kaming metadata: metadata ay Magbigay ng inspirasyon sa kontemporaryong designer ay maaaring gumawa ng kahit ano, kahit ano, at ang New Year - ay walang exception. vector database Pinecone, , or ang chromaDB Pumunta extra information ang chromaDB ang chromaDB Pumunta Pumunta habang Representasyon na ginagamit para sa paghahanap ng similarity, Nagbibigay ng mga strukturadong impormasyon tungkol sa kung ano ang vector represents. Ito ay nagbibigay Habang sa data ng vector kami ay mag-insert ang markdown ng mga artikulo, sa metadata kami ay gumagamit ng ilang impormasyon na nais na ang LLM upang ibahagi sa amin, tulad ng ang tagapamahagi ng blog na ginagamit para sa pagsasabi, ang title at ang link sa post. 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) Tulad ng makikita mo mula sa code, nag-iterate namin ang bawat artikulong nag-crawl bago at ilagay ito sa isang newly-created index na tinatawag na . article-index Kung nais mong i-play ang Pinecone ay may isang malaking dokumento sa kanyang website. isang malaking dokumento sa kanyang website. Ngunit ngayon ay naka-insert ko ang lahat ng mga artikulo sa index, maaari naming i-extract ang impormasyon na kailangan natin? Natuklasan ko ang isang pangunahing script na tinatawag na query.py upang i-test ang mga resulta ng paghahanap sa index. Kapag nag-aalok ang tanong, "Can you please list some articles about bypassing Kasada?", ang query ay nagpapakita ng mga sumusunod na mga artikulo: {'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}} Hindi maganda! ang lahat ng mga artikulo ay tungkol sa tema na ito! Para sa ngayon ito ay sapat, sa susunod na episode makikita namin kung paano mag-connect ang DB na ito sa GPT4 at pagkatapos ay lumikha ng isang simpleng user interface upang i-writing mga prompts at makakuha ng ang mga data na kailangan mo. Ang artikulong ito ay bahagi ng serye ng "The Lab" ng Pierluigi Vinciguerra. Tingnan ang kanyang Substack pahina para sa karagdagang impormasyon sa Web Scraping. Ang artikulong ito ay bahagi ng serye ng "The Lab" ng Pierluigi Vinciguerra. Tingnan ang kanyang Substack pahina para sa karagdagang impormasyon sa Web Scraping. “Ang lab”