Nëse jeni duke punuar në një kompani që përdor të dhënat e uebit, ju e dini me siguri se është vetëm shtresa e parë e një produkti më kompleks. Në fakt, të dhënat e grumbulluara në ueb janë ruajtur tradicionalisht në skedarë ose baza të dhënash (buckets e ruajtjes së re, liqene të të dhënave ose depo të të dhënave) dhe pastaj analizohen duke përdorur mjete të Inteligjencës së Biznesit (BI), si komerciale ashtu edhe pronësore. Për shembull, një ekip mund të grumbullojë çmimet e produkteve ose komente të konsumatorëve nga uebi, të ruajë të dhënat e para si skedarë CSV / JSON, ta ngarkojë atë në një depo të të dhënave SQL, dhe pastaj të përdorë platforma Sot, Modelet e Gjuhës së Madhe (LLM) po e ndryshojnë këtë paradigmë. Në vend që të mbështeten vetëm në bordet statike ose pyetjet SQL, organizatat mund të përdorin asistentët e AI për të nxjerrë njohuri nga të dhënat e gërryera përmes këshillave të gjuhës natyrore. Me fjalë të tjera, në vend që një njeri të shkruajë një pyetje ose të interpretojë një tabelë, një asistent AI mund të përgjigjet drejtpërdrejt në pyetje rreth të dhënave. Mendoni për të pasur ndërfaqen tuaj të ngjashme me ChatGPT dhe shkruani disa këshilla për të marrë njohuri, duke shmangur krijimin e bordit. Kam parë këtë lloj qasje në disa produkte para se të dalin LLMs, por pa sukses të madh. Peizazhi evoluues i AI Imagjinoni duke pyetur, Kjo qasje premton qasje më të shpejtë, më intuitive në informacion për përdoruesit jo-teknikë pa mbipeshën e ndërtimit të diagrameve ose të shkruarit të kodit.Në kompanitë e kaluara ku kam punuar, kam parë shumë herë një proliferim të dashboards të ndryshme për grup përdoruesish (nëse jo për përdorues), nganjëherë nxjerrjen e numrave të ndryshëm nga njëri-tjetri. “Cili konkurrent ka pasur çmimin më të lartë në tremujorin e kaluar?” Natyrisht, lind një sërë sfidash të reja: çka për halucinacionet?Nëse nuk e shohim numrin themelor të një përgjigje, a mund të jemi 100% të sigurt se përgjigja është e saktë? Në këtë post (dhe në të ardhmen në serinë Lab), ne do të ndërtojmë një projekt end-to-end ku do të fillojmë duke grumbulluar artikujt në këtë newsletter, duke i vënë ato në një bazë të dhënash të përshtatshme për përdorimin e AI, duke marrë këtë njohuri, dhe pastaj duke botuar një aplikacion web që mund të përdorë një version të pasuruar të një modeli GPT. Përmirësimi i njohurive LLM Integrimi i të dhënave të personalizuara (të tilla si dataset tuaj të grumbulluar) në një LLM mund të bëhet kryesisht në dy mënyra: modelit ose duke përdorur , dhe secila prej këtyre metodave ka pro dhe kundër.Le të shohim se si ato ndryshojnë dhe cila qasje mund të jetë më e mira për rastin tonë të përdorimit. fine-tuning Retrieval-Augmented Generation (RAG) Fine-Tuning vs. Retrieval-Augmented Gjeneratë do të thotë trajnimin e bazës LLM në të dhënat shtesë në mënyrë që të absorbojë njohuritë e reja. Në thelb, ju merrni një model të trajnuar paraprakisht dhe vazhdoni të trajnoni atë në grupin tuaj të të dhënave specifike të domain-it, duke rregulluar peshat e saj për të përfshirë atë njohuri. Për shembull, nëse keni gërryer një koleksion të artikujve teknikë, mund të përshtateni mirë një LLM në ato artikuj. Fine-tuning është bërë shpesh duke i dhënë modelit një grup të madh të çifteve pyetje-përgjigje ose pasazhe tekst nga të dhënat tuaja në mënyrë që ai mëson të përgjigjet me atë informacion kur është e rëndësishme. – njohuritë bëhen pjesë e parametrave të saj. herën tjetër që ju kërkoni modelin, ai mund të nxjerrë në këtë informacion të baked-in pa pasur nevojë për ndihmë të jashtme. Fine-tuning intrinsically knows augmented from the inside përdor një qasje të ndryshme: modeli mbetet i pandryshuar, por ne i japim atij qasje në një bazë njohuri të jashtme (zakonisht nëpërmjet një kërkimi vektor). LLM pastaj gjeneron përgjigjen e saj me ndihmën e atij konteksti shtesë. Për boomers si unë, e konsideroni atë si futjen e një CD në kokën e Neos në Matrix për të mësuar aftësi të reja dhe lëvizje. Në rastin tonë, baza e njohurive mund të jetë një koleksion i artikujve të gërryer në internet të ruajtur në një bazë të dhënash të specializuar. RAG është si një provim i librit të hapur për LLM - në kohën e pyetjes ajo shikon në "faqen" përkatëse të të dhënave dhe e përdor atë për të formuluar një përgjigje, në vend që të mbështetet vetëm në kujtesën e saj të brendshme. Retrieval-Augmented Generation (RAG) retrieve relevant documents Siç mund ta imagjinoni, një dallim kyç është ku mbeten njohuritë shtesë: me përshtatjen e hollë, njohuritë janë të integruara. (peshat e modelit janë përditësuar). me RAG, njohuritë mbeten Fine-tuning është i ngjashëm me mësimin e modelit të fakteve të reja përgjithmonë, ndërsa RAG është si pajisja e modelit me një bibliotekë dinamike që mund të referohet në flutur. in the model itself external Të dy metodat kanë pro dhe kundër të ndryshme: 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: Për shembullin tonë të përdorimit të integrimit të të dhënave të përditësuara vazhdimisht, RAG duket një qasje më e mirë: ju mund të vazhdimisht tërhiqni të dhëna të reja web dhe të keni asistentin tuaj ta përdorni atë menjëherë në vend që periodikisht të ri-trajnoni të gjithë modelin. Para se të vazhdoni, vlen të theksohet se përshtatja e hollë dhe RAG nuk janë të përjashtueshme nga njëra-tjetra; ato mund të plotësojnë njëra-tjetrën. për shembull, ju mund të përshtatni një model për të rregulluar tonin e tij ose aftësinë për të ndjekur udhëzimet (ose për të shtuar njohuri që janë të vogla dhe statike), dhe ende përdorni RAG për t'i dhënë atij qasje në një bazë më të madhe të njohurive që përditësohet shpesh. Përdorimi i një modeli lokal vs. një API të jashtëm Një konsideratë tjetër është për asistentin tuaj të AI: një model lokal (burim i hapur) që ju drejtoheni vetë ose një model i hostuar përmes një API (si OpenAI GPT-3.5 / GPT-4 ose të tjerët). what LLM to use – Modele të tilla si LLaMA 2, Mistral, ose Falcon mund të drejtohen në serverat tuaj. Të dhënat tuaja të grumbulluara kurrë nuk largohen nga mjedisi juaj, gjë që është e rëndësishme nëse përmban informacione të ndjeshme. Ju mund t'i përshtatni ato lirisht në të dhënat tuaja ose të modifikoni mënyrën se si funksionojnë. Në mënyrë kosto-modele, drejtimi i një modeli lokal mund të jetë më i lirë për vëllime të mëdha të pyetjeve (pa tarifa API), por ju duhet të investoni në infrastrukturën hardware ose cloud për ta strehuar atë. Disavantazhi është se shumë modele të hapura nuk mund të përputhen me performancën e GPT-ve më të fundit. Ju mund të keni nevojë të përdorni modele më të mëdha ose më të specializuara për të marrë performancë të krahasueshme, e cila mund të jetë komplekse për të menaxhuar. duke pasur një grup të dhënash shumë specifike të domain-it dhe ekspertizën, një model lokal mund të përshtatet mirë për të përsosur në atë domain, duke e bërë atë një zgjidhje të fortë për një "GPT privat". Local Open-Source LLMs control and privacy Do të – Duke përdorur një API si OpenAI GPT-4 do të thotë që ju nuk keni nevojë të shqetësoheni për të drejtuar modelin; ju thjesht dërgoni porositë tuaja në shërbimin e tyre dhe merrni përfundimin. Kjo është shumë e përshtatshme dhe zakonisht ju jep qasje në cilësinë e modelit të përparuar pa probleme në infrastrukturë. Për skenarin tonë, ju mund të përdorni RAG thjesht duke paraparë dokumentet e gjetura në porosinë tuaj dhe duke kërkuar API për t'iu përgjigjur. Disavantazhet këtu kanë të bëjnë me personalizimin dhe privatësinë. Jo çdo model është në dispozicion për t'u përshtatur mirë ( Ju gjithashtu i nënshtroheni rregullave të ofruesit (për shembull, ata mund të kenë filtra përmbajtjeje që mund të parandalojnë disa pyetje të lidhura me scraping).Nga pikëpamja e privatësisë, ju jeni duke dërguar të dhënat tuaja (kërkesa dhe konteksti i gjetur) tek një palë e tretë, kështu që unë nuk do të sugjeroj këtë qasje për të dhënat e ndjeshme ose të mbuluara me të drejtat e autorit. External API LLMs (e.g. OpenAI’s) OpenAI, për shembull, ju lejon ta bëni atë në GPT4-o dhe GPT4-mini OpenAI, për shembull, ju lejon ta bëni atë në GPT4-o dhe GPT4-mini Në përgjithësi, nëse rasti juaj i përdorimit përfshin të dhëna shumë të ndjeshme ose kërkon kontroll të plotë, një LLM lokal rekomandohet pavarësisht nga përpjekja shtesë. Nëse prioriteti juaj është aftësia më e mirë e mundshme e gjuhës dhe konfigurimi i shpejtë, një model i hostuar si OpenAI mund të jetë zgjedhja më e mirë. Në zbatimin e këtij postimi, ne do të ilustrojmë duke përdorur GPT API të OpenAI për thjeshtësi dhe cilësi, por sistemi i marrjes që ndërtojmë mund të ushqejë po aq lehtë në një model me burim të hapur si Llama2 nëpërmjet bibliotekave HuggingFace ose LangChain. Mekanizmi i marrjes (vendosja e bazës së të dhënave + kërkimi i ngjashmërisë) mbetet i njëjtë; vetëm modeli përfundimtar që gjen Duke marrë parasysh këto vendime, le të integrojmë artikujt e mi të gërryer në një asistent AI.Ne do të përdorim qasjen RAG me një model OpenAI, i cili përputhet mirë me të dhënat e përditësuara vazhdimisht në web dhe shmang nevojën për punë të shtrenjta të përshtatjes së mirë. Scraping TWSC me Firecrawl është një motor skraping web ekspozuar si një REST API dhe SDK. Ajo është projektuar posaçërisht për të kthyer faqet e internetit në (në formate të tilla si tekst i pastër ose markdown), trajtimin e të gjitha ngritjen e rëndë, të tilla si crawling lidhje, rendering JavaScript, dhe kështu me radhë. përfitimi i madh i Firecrawl është se me një thirrje API, ju mund të scrape një faqe të tërë. zjarrfikës LLM-ready data zjarrfikës zjarrfikës Për blogun e The Web Scraping Club, ne do të përdorim sitemap-in e saj për të zbuluar të gjitha URL-të e artikullit. (Blogu është i strehuar në Substack, i cili siguron një sitemap XML që liston të gjitha postimet.) Firecrawl mund të crawl faqen pa një sitemap, por duke e përdorur atë si një pikë fillimi mund të jetë më efikase dhe të sigurojë që ne të mos humbasim ndonjë faqe. Së pari, ne vendosim Firecrawl duke instaluar SDK-në e tij Python dhe duke autentifikuar me një çelës API (duke supozuar se ju keni regjistruar dhe keni marrë një çelës): 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' ]}) Me vetëm disa rreshta të kodit, artikujt tanë janë tashmë në formatin Markdown. Zgjedhja e një baze të të dhënave vektor për RAG a) është një komponent kyç i zbatimit të RAG. Ajo ruan embeddings e dokumenteve tuaja (reprezentime vektor) dhe lejon kërkimin e shpejtë të ngjashmërisë për të marrë dokumente relevante për një zbatim të caktuar të pyetjes. Ka shumë opsione në dispozicion, duke përfshirë bibliotekat me burim të hapur dhe shërbimet e menaxhuara të cloud, por për zbatimin tonë, ne do të përdorim . vector database Pinecone është a E ndërtuar për kërkim të shpejtë, të shkallëzuar të ngjashmërisë.Ndryshe nga bazat e të dhënave me burim të hapur që kërkojnë vetë-hosting, Pinecone është një zgjidhje cloud-native, që do të thotë që ne nuk duhet të shqetësohemi për menaxhimin e infrastrukturës. Pinokinë fully managed vector database Pinokinë Vendosja e Pinecone Hapat e parë janë, natyrisht, të regjistroheni në Pinecone dhe të merrni API_KEY dhe mjedisin nga dashboard. pip install pinecone Së fundi, atëherë, ne mund të lidhemi me Pinecone në skripin tonë from pinecone import Pinecone, ServerlessSpec pc = pinecone.Pinecone( api_key="YOUR API KEY" ) Vlera e mjedisit vjen nga konsola e internetit Pinecone kur krijoni çelësin tuaj API. Krijimi i një indeksi Pinecone Një indeks është vendi ku të dhënat tuaja janë ruajtur për një retrivial të mëvonshëm nga LLM. Në vend që të jetë në tekst të thjeshtë, ajo është në formatin vektor (në thelb një rresht numri), e cila lejon LLM për të kuptuar se cila hyrje në indeks është më shumë gjasa një përgjigje e mirë për pyetjen që LLM bën. Në a si , përveç të dhënave vektor, ne gjithashtu kemi metadata: metadata është Secili prej tyre është i lidhur me njëri-tjetrin për t’u bërë më i përshtatshëm. vector database Pinecone, , or ChromaDB të rënda extra information ChromaDB ChromaDB të rënda të rënda Ndërsa Përfaqësues përdorur për kërkimin e ngjashmërisë, jep informacion të strukturuar për atë që përfaqëson vektor. Ndërsa në të dhënat vektor do të futim shënimin e artikujve, në metadata do të përdorim disa informacione që dëshirojmë që LLM të ndajë me ne, si autori i blogut të përdorur për përgjigjen, titulli dhe lidhja me postin. 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) Siç mund ta shihni nga kodi, ne në thelb përsërisim çdo artikull të skrapuar më parë dhe e shtojmë atë në një indeks të krijuar së fundmi të quajtur . article-index Nëse doni të luani më shumë me Pinecone ka një dokumentacion të gjerë në faqen e tyre. një dokumentacion të gjerë në faqen e tyre. Por tani që kam futur të gjitha artikujt në indeks, a mund të nxjerrim informacionin që na nevojitet? Kam krijuar një skrip bazë të quajtur query.py për të testuar rezultatet e kërkimeve në indeks. Kur pyetur “A mund të ju lutem listoni disa artikuj në lidhje me kalimin Kasada?”, pyetja kthen artikujt e mëposhtëm: {'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}} Jo keq!Të gjitha tre artikujt ishin saktësisht në lidhje me temën! Për sot është e mjaftueshme, në episodin e ardhshëm do të shohim se si ta lidhim këtë DB me GPT4 dhe pastaj të krijojmë një ndërfaqe të thjeshtë përdoruesi për të shkruar këshilla dhe për të marrë të dhënat që ju nevojiten. Artikulli është pjesë e serisë "The Lab" nga Pierluigi Vinciguerra. Shikoni faqen e tij Substack për më shumë njohuri në Web Scraping. Artikulli është pjesë e serisë "The Lab" nga Pierluigi Vinciguerra. Shikoni faqen e tij Substack për më shumë njohuri në Web Scraping. “Në laborator”