Înapoi la catalog
Season 51 14 Episoade 57 min 2026

LlamaIndex: Context-Augmented LLM Applications

v0.14 — Ediția 2026. Un ghid complet pentru LlamaIndex, care acoperă augmentarea contextului, pipeline-uri RAG, agenți autonomi și workflow-uri multi-agent. Învață cum să construiești aplicații LLM gata de producție folosind versiunea 0.14.

Orchestrare LLM RAG Framework-uri AI/ML
LlamaIndex: Context-Augmented LLM Applications
Se redă acum
Click play to start
0:00
0:00
1
Imperativul Context Augmentation
Descoperă conceptele de bază ale LlamaIndex și de ce modelele LLM au nevoie de context extern pentru a fi cu adevărat utile. Acest episod acoperă filozofia din spatele Retrieval-Augmented Generation, workflow-uri și aplicații bazate pe agenți.
4m 18s
2
Ingerarea Datelor: Documents și Nodes
Explorează prima jumătate a pipeline-ului RAG. Vei învăța despre Connectors, Documents, Nodes și procesul critic de indexare a datelor nestructurate în vector embeddings.
5m 14s
3
Pipeline-ul de Interogare: Retrievers și Routers
Pătrunde în a doua jumătate a ciclului de viață RAG. Învață cum Retrievers găsesc fragmentele relevante, cum Routers selectează cea mai bună abordare și cum Postprocessors rafinează contextul pentru LLM.
4m 07s
4
Interfațarea cu LLM-uri și Input-uri Multi-Modale
Stăpânește clasa LLM din LlamaIndex pentru generarea limbajului natural. Acest episod detaliază interfețele de chat, streaming-ul răspunsurilor și furnizarea de imagini către modelele multi-modale.
4m 08s
5
Extragerea Datelor Structurate cu Pydantic
Învață cum să forțezi LLM-urile imprevizibile să returneze date JSON stricte și tipizate. Descoperă cum Pydantic BaseModels acționează ca scheme pentru a extrage informații structurate de încredere din textul brut.
3m 42s
6
Construirea de Function Agents Autonomi
Fă saltul de la cod static la agenți autonomi. Vei învăța cum să împachetezi funcțiile Python în tools și să implementezi un FunctionAgent pentru a executa sarcini în mod dinamic.
3m 53s
7
Extinderea Agenților cu LlamaHub Tools
Îmbunătățește-ți agenții cu integrări pre-construite. Acest episod arată cum să navighezi pe LlamaHub, să instalezi specificațiile pentru tools și să oferi agentului tău capabilități din lumea reală instantaneu.
4m 08s
8
Swarms Multi-Agent cu AgentWorkflow
Treci dincolo de configurațiile cu un singur agent. Învață cum să configurezi un swarm liniar de agenți specializați care își predau autonom sarcinile unul altuia folosind AgentWorkflow.
4m 02s
9
Orchestrator Agent Pattern
Preia controlul granular asupra workflow-urilor tale bazate pe agenți. Descoperă cum să construiești un master orchestrator agent care gestionează agenții subordonați ca tools apelabile.
4m 07s
10
Custom Multi-Agent Planners
Obține flexibilitate multi-agent supremă. Învață cum să îți creezi propria buclă de orchestrare folosind custom XML prompting, Pydantic și execuție imperativă.
3m 47s
11
Workflow-uri Human-in-the-Loop
Previne dezastrele autonome păstrând un om în buclă (human in the loop). Vei învăța cum să pui pe pauză workflow-urile cu evenimente pentru a aștepta confirmarea umană înainte de a executa sarcini periculoase.
3m 51s
12
Observability și Tracing
Nu mai depana AI-ul cu instrucțiuni print. Acest episod explorează callbacks din LlamaIndex și observability cu un singur click pentru a urmări input-urile, duratele și output-urile în pipeline-uri complexe.
3m 55s
13
Metrici de Evaluare RAG
Măsoară adevărata eficiență a aplicațiilor tale. Învață cum să folosești FaithfulnessEvaluator și RetrieverEvaluator pentru a puncta în mod obiectiv calitatea extragerii și a răspunsurilor.
4m 10s
14
Scaffold pentru Producție
Transformă prototipurile în aplicații complete instantaneu. Descoperă cum să folosești create-llama și RAG CLI pentru a genera structura (scaffold) aplicațiilor web full-stack și a chat-urilor de terminal fără a scrie cod boilerplate.
4m 07s

Episoade

1

Imperativul Context Augmentation

4m 18s

Descoperă conceptele de bază ale LlamaIndex și de ce modelele LLM au nevoie de context extern pentru a fi cu adevărat utile. Acest episod acoperă filozofia din spatele Retrieval-Augmented Generation, workflow-uri și aplicații bazate pe agenți.

Descarcă
Salut, sunt Alex de la DEV STORIES DOT EU. LlamaIndex: Aplicații LLM cu context augmentat, episodul 1 din 14. Modelele pre-antrenate sunt geniale, dar nu știu absolut nimic despre documentele private pe care le-ai creat în dimineața asta. Îi ceri unui LLM să-ți rezume noul slide deck financiar pentru Q3, iar el fie ghicește orbește, fie îți spune că nu te poate ajuta. Imperativul de augmentare a contextului este modul prin care poți rezolva asta. Modelele Large Language au capacități incredibile de raționament, dar cunoștințele lor sunt înghețate în timp și limitate la date publice. Nu au acces la wiki-urile tale interne, la ticketele de customer support sau la rapoartele tale financiare private. LlamaIndex există pentru a acoperi exact acest gol. Servește ca țesut de legătură între foundation models și datele tale private, localizate. Când îi ceri unui model să rezume acel slide deck pentru Q3, nu poți pur și simplu să trimiți întrebarea. Ai nevoie de un sistem care găsește slide-urile relevante, extrage textul și furnizează acele informații specifice modelului împreună cu promptul tău. Acest proces este augmentarea contextului. Îi oferi modelului contextul exact de care are nevoie pentru a-și aplica abilitățile de raționament pe datele tale private. LlamaIndex oferă infrastructura pentru a face ingest, a organiza și a face retrieve la datele tale, astfel încât augmentarea contextului să se întâmple într-un mod fiabil. Preluarea textului și răspunsul la o singură întrebare reprezintă doar baseline-ul. Aplicațiile moderne necesită mai multă autonomie. Asta ne aduce la aplicațiile de tip agent. O aplicație de tip agent nu urmează doar o linie dreaptă de la o întrebare, la o bază de date și apoi la un răspuns. Ea ia decizii pe parcurs pentru a gestiona intențiile complexe ale utilizatorilor. Prima piesă din asta este routing-ul. Când un utilizator pune o întrebare, sistemul trebuie să decidă ce sursă de date sau tool este potrivit. Dacă utilizatorul cere un rezumat corporate high-level, router-ul direcționează query-ul către indexul slide deck-ului pentru Q3. Dacă utilizatorul cere defalcarea numerică exactă a vânzărilor regionale, router-ul ar putea trimite query-ul către o bază de date SQL structurată, în schimb. Routing-ul se asigură că modelul folosește tool-ul potrivit pentru treabă, pe baza input-ului. A doua parte este prompt chaining-ul. Task-urile complexe eșuează adesea atunci când îi ceri unui model să le gestioneze într-un singur prompt masiv. Prompt chaining-ul împarte un obiectiv complex în task-uri secvențiale mai mici. Sistemul ar putea rula un prompt pentru a extrage cifrele de venituri din slide deck, să paseze acele cifre către un al doilea prompt care le compară cu datele istorice, și să trimită acel output către un al treilea prompt care redactează un executive summary. Output-ul unui pas devine contextul exact pentru pasul următor. Aici devine interesant. Chiar și cu datele corecte și un chain structurat, modelele fac greșeli. Asta introduce conceptul de reflection. Reflection este un pas automat de quality control. Înainte de a livra rezumatul final al deck-ului pentru Q3 către utilizator, aplicația de tip agent folosește un prompt separat pentru a-și evalua propriul draft. Verifică dacă textul generat este susținut în totalitate de slide-urile extrase. Dacă pasul de reflection detectează o halucinație sau o metrică cheie omisă, respinge draft-ul și declanșează o corecție. Adevărata putere a aplicațiilor cu context augmentat nu este doar să-i dai unui LLM un document de citit, ci să-i oferi un workflow structurat, care se corectează singur, pentru a raționa în siguranță pe datele tale private. Dacă vrei să ajuți la continuarea emisiunii, poți căuta DevStoriesEU pe Patreon și să ne susții acolo. Asta e tot pentru acest episod. Mulțumesc că m-ai ascultat și spor la construit!
2

Ingerarea Datelor: Documents și Nodes

5m 14s

Explorează prima jumătate a pipeline-ului RAG. Vei învăța despre Connectors, Documents, Nodes și procesul critic de indexare a datelor nestructurate în vector embeddings.

Descarcă
Salut, sunt Alex de la DEV STORIES DOT EU. LlamaIndex: Aplicații LLM augmentate prin context, episodul 2 din 14. Nu poți pur și simplu să bagi un PDF de 500 de pagini într-un context window de LLM și să te aștepți la un răspuns precis. Modelul va pierde șirul, va halucina sau pur și simplu va respinge payload-ul pentru că își depășește limitele. Pentru a face fișierele masive utile, trebuie să le descompui în bucăți minuscule și să le traduci într-un format matematic în care mașina poate căuta. Acest proces este exact ceea ce acoperă astăzi Data Ingestion: Documents and Nodes. Gândește-te la procesarea unui manual masiv de HR pentru angajați. Textul se află într-un PDF gigantic, care se întinde pe zeci de capitole complexe. Primul pas într-un pipeline de Retrieval-Augmented Generation este etapa de loading. Aici intră în joc Data Connectors, numiți frecvent Readers. Un connector preia sursa ta de date brute - fie că este vorba de un PDF local, un tabel dintr-o bază de date remote sau un response de la un API extern - și o împachetează într-o structură de date numită Document. Oamenii se încurcă adesea la acest termen. În acest framework, un Document nu înseamnă un fișier Word sau un PDF. Un Document este pur și simplu un container generic pentru orice sursă de date ingerată. Acesta conține textul brut împreună cu câteva proprietăți de bază. Totuși, un singur Document care reprezintă un manual de 500 de pagini este complet inutil pentru o căutare precisă și rapidă. Trebuie să îl descompui. Asta ne aduce la Nodes. Un Node este adevărata unitate atomică de date din LlamaIndex. Este un chunk mai mic, ușor de gestionat, dintr-un Document părinte - poate un singur paragraf care detaliază politica de concediu parental. Când procesezi manualul de HR, framework-ul ia Documentul masiv și îl taie în mii de Nodes. Iată ideea cheie. Aceste Nodes nu conțin doar text izolat. Ele conțin metadata bogate și relații structurale. Un Node știe exact din ce Document părinte provine. De asemenea, știe ce Node îl precede logic și ce Node îl urmează. Această structură legată este cea care permite sistemului să sintetizeze un context mai amplu ulterior, dacă un singur chunk nu conține întregul răspuns. Odată ce ai datele tăiate în Nodes precise, treci la etapa de indexing. Ai nevoie de o modalitate robustă de a găsi acel Node corect atunci când un utilizator pune ulterior o întrebare. Asta necesită traducerea limbajului uman într-un format numeric numit embedding. Un embedding este un array de numere floating-point care reprezintă sensul semantic al textului din interiorul acelui Node. Treci fiecare Node printr-un model de embedding. Modelul citește acel chunk și returnează un vector high-dimensional. Dacă două Nodes discută subiecte conceptual similare - cum ar fi concediul medical și zilele libere plătite - vectorii lor numerici vor sta matematic aproape unul de celălalt în spațiu. Cu acești vectori generați, construiești un Index. Indexul este componenta structurală principală care îți organizează acele Nodes astfel încât să poată fi interogate. Pentru majoritatea aplicațiilor, acest Index este susținut de un Vector Store. Vector Store acționează ca o bază de date specializată, concepută explicit pentru a păstra aceste reprezentări matematice și a efectua calcule de similaritate extrem de eficiente asupra lor. Fluxul logic este extrem de previzibil. Mai întâi, configurezi un data connector care să țintească manualul tău de HR. Connectorul citește fișierul și returnează un singur obiect Document. Apoi, un parser preia acel Document și îl împarte într-un array de obiecte Node independente. În cele din urmă, pasezi acel array de Nodes într-un Index, care coordonează crearea de vector embeddings și le salvează în Vector Store. Întregul ingestion pipeline există pentru a rezolva o limitare fundamentală. Modelele de limbaj mari nu pot citi în mod fiabil cărți întregi dintr-o dată, dar pot calcula instantaneu distanța matematică dintre două arrays de numere. Traducerea fișierelor brute în Documents, tăierea lor în Nodes legate și codificarea lor în vector indexes este ceea ce acoperă acest decalaj. Asta e tot pentru acest episod. Mulțumesc că m-ai ascultat și continuă să construiești!
3

Pipeline-ul de Interogare: Retrievers și Routers

4m 07s

Pătrunde în a doua jumătate a ciclului de viață RAG. Învață cum Retrievers găsesc fragmentele relevante, cum Routers selectează cea mai bună abordare și cum Postprocessors rafinează contextul pentru LLM.

Descarcă
Salut, sunt Alex de la DEV STORIES DOT EU. LlamaIndex: Aplicații LLM augmentate de context, episodul 3 din 14. Iei chunk-ul corect de document, îl trimiți către language model și tot primești un răspuns prost, pentru că a fost îngropat sub zece chunk-uri irelevante. Să găsești textul e doar jumătate din bătălie. Filtrarea, ranking-ul și decizia despre cum să-i faci fetch de la bun început reprezintă punctul în care sistemul chiar are succes sau eșuează. Astăzi ne uităm la faza de execuție din RAG, mai exact la Query Pipeline: Retrievers și Routers. În această etapă, datele tale sunt deja încărcate și indexate. Un utilizator trimite un query. Prima componentă care interceptează acest query este adesea un router. Un router este un motor de decizie. El analizează întrebarea primită și determină ce tool sau index din spate este cel mai potrivit pentru a răspunde la ea. Să zicem că un utilizator pune o întrebare complexă despre un anumit eveniment istoric care include și acronime foarte specifice. Un vector search standard ar putea prinde sensul semantic al evenimentului, dar ar rata acronimele. Un keyword search va nimeri acronimele, dar va rata contextul mai larg. Router-ul evaluează query-ul și decide să-l trimită simultan pe două căi. El face route la request atât către un vector search, cât și către un keyword search. Asta ne aduce la retrievers. Un retriever este responsabil să definească exact cum să faci fetch la contextul relevant dintr-un index. El nu generează răspunsuri. Doar face fetch la date. Urmând scenariul nostru, vector retriever-ul convertește query-ul utilizatorului într-un embedding și extrage cele mai similare nodes din punct de vedere matematic, care sunt doar chunk-uri din documentele tale sursă. În același timp, keyword retriever-ul extrage nodes care conțin exact match-uri de text pentru acele acronime. Acum ai două grămezi distincte de nodes. Nu poți pur și simplu să le dai append orbește pe toate la prompt-ul tău de language model. Context windows sunt limitate, iar modelele sunt ușor distrase de date irelevante. Aici intervin node postprocessors. Iată ideea cheie. Node postprocessors acționează ca un gatekeeper între retrievers și language model. Ele aplică transformări, filtrare sau logică de re-ranking pe acele nodes la care s-a făcut fetch. De exemplu, un postprocessor poate impune un similarity cutoff, eliminând orice nodes care au obținut un scor sub un anumit threshold. Poate să facă deduplicate la nodes dacă vector search-ul și keyword search-ul s-a întâmplat să extragă exact același paragraf. De asemenea, poate să facă re-rank la restul de nodes, astfel încât cel mai relevant chunk absolut să stea chiar în partea de sus din context window. Odată ce postprocessor-ul a curățat și ordonat datele, sistemul le dă mai departe către response synthesizer. Synthesizer-ul are o singură treabă. Ia lista finisată de nodes și query-ul original al utilizatorului, le combină într-un prompt structurat și le trimite către language model. Language model-ul generează apoi răspunsul final human-readable, bazat exclusiv pe acel context furnizat. Faza de execuție a query-ului este strict un pipeline. Faci route la query, faci retrieve la raw nodes, filtrezi și faci rank la acele nodes cu un postprocessor și, în final, sintetizezi textul. Dacă controlezi ce vede language model-ul, controlezi calitatea output-ului. Mersi că ai petrecut câteva minute cu mine. Până data viitoare, numai bine.
4

Interfațarea cu LLM-uri și Input-uri Multi-Modale

4m 08s

Stăpânește clasa LLM din LlamaIndex pentru generarea limbajului natural. Acest episod detaliază interfețele de chat, streaming-ul răspunsurilor și furnizarea de imagini către modelele multi-modale.

Descarcă
Salut, sunt Alex de la DEV STORIES DOT EU. LlamaIndex: Aplicații LLM augmentate cu context, episodul 4 din 14. Construiești un agent care gestionează tickete de suport IT, dar jumătate din cereri sunt doar fotografii de pe smartphone cu beculețe de eroare care clipesc. Procesarea exclusiv text te obligă să construiești vision pipelines separate sau să renunți complet la contextul vizual. Astăzi vorbim despre Interfațarea cu LLM-uri și inputuri multi-modale, ceea ce rezolvă problema asta direct la model layer. În LlamaIndex, interacțiunea cu un language model trece prin clasa de bază LLM. Asta acționează ca o interfață unificată. Indiferent dacă apelezi un model OpenAI, un model Anthropic sau un alt provider, metodele de bază pe care le folosești sunt identice. Această abstractizare îți protejează logica aplicației de modificările de API specifice providerului. Când vrei un răspuns de la model, alegi între două metode principale. Prima este metoda complete. Îi pasezi un singur string de text care conține prompt-ul tău, iar ea returnează un singur răspuns text. Asta e construită pentru task-uri simple, single-shot, cum ar fi rezumarea unui document sau extragerea unei informații specifice. A doua metodă este metoda chat. Asta este concepută pentru conversații sau interacțiuni structurate. În loc de un singur string, îi pasezi o listă de obiecte de tip chat message. Fiecare mesaj are un rol specific atașat, de obicei system, user sau assistant. Pasând o listă, metoda chat îi oferă modelului contextul complet al unui schimb de replici înainte de a genera următorul răspuns. Atât complete, cât și chat așteaptă ca modelul să termine întreaga generare înainte de a returna output-ul. Dacă modelul scrie un răspuns lung, aplicația ta stă idle. Pentru a repara asta, folosești streaming. Apelezi în schimb stream complete sau stream chat. Aceste metode returnează un generator. Pe măsură ce modelul produce tokeni, codul tău îi primește în chunk-uri mici. Faci un loop prin acest generator pentru a afișa răspunsul într-o interfață de utilizator în timp real, eliminând percepția de latență. Acum, a doua parte aici este gestionarea datelor non-text. Aici devine interesant. LLM-urile moderne analizează informații vizuale, iar LlamaIndex suportă asta prin content blocks. În loc să pasezi un simplu string de text în interiorul unui user chat message, poți pasa o listă de blocks. Gândește-te înapoi la ticketul de suport IT cu rack-ul de server defect. Ai nevoie ca modelul să se uite la fotografie și să citească instrucțiunile tale de diagnosticare. Mai întâi, creezi un ImageBlock. Îi dai acestui block datele imaginii. LlamaIndex îți permite să pasezi un file path local, un URL direct sau raw bytes codați base șaizeci și patru. Apoi, creezi un TextBlock. Îi dai prompt-ul de text, cerând modelului să identifice defectul hardware arătat în imagine. Pui atât ImageBlock, cât și TextBlock într-o singură listă, și atașezi acea listă la un nou user chat message. Când pasezi acest mesaj în metoda chat a unui model cu capabilități de vision, LLM-ul procesează layout-ul vizual al rack-ului de server alături de instrucțiunile tale de text. Returnează un diagnostic bazat pe ambele inputuri combinate. Iată ideea cheie. Adevărata putere a acestei arhitecturi este consistența sa. Indiferent dacă trimiți un string pe o singură linie, faci streaming la un răspuns în timp real sau pasezi un array complex de text și image blocks, pattern-ul de interacțiune cu clasa LLM rămâne complet standardizat pe întregul tău codebase. Asta e tot pentru episodul ăsta. Ne auzim data viitoare!
5

Extragerea Datelor Structurate cu Pydantic

3m 42s

Învață cum să forțezi LLM-urile imprevizibile să returneze date JSON stricte și tipizate. Descoperă cum Pydantic BaseModels acționează ca scheme pentru a extrage informații structurate de încredere din textul brut.

Descarcă
Salut, sunt Alex de la DEV STORIES DOT EU. LlamaIndex: Aplicații LLM augmentate cu context, episodul 5 din 14. Nimic nu strică un production pipeline mai repede decât un LLM care decide să adauge „Sigur, iată JSON-ul tău” chiar înainte de data payload-ul propriu-zis. Ceri un machine-readable output, primești conversational filler, iar parser-ul tău dă crash instant. Să faci puntea dintre limbajul natural nestructurat și tipurile programatice fiabile este exact ceea ce rezolvă Structured Data Extraction cu Pydantic. Ia scenariul parsării unui inbox de email dezordonat, plin de mesaje de la furnizori, remindere de plată și chitanțe nestructurate. Sistemul tău trebuie să extragă date structurate de facturare din acest text. Dacă te bazezi pe generare standard de text, obții rezultate imprevizibile. Un răspuns ar putea folosi camel case pentru chei, altul ar putea formata datele calendaristice diferit, iar prețurile se întorc adesea ca string-uri cu simboluri valutare atașate. Ajungi să scrii o logică nesfârșită de string manipulation doar pentru a obține un număr utilizabil din răspuns. În loc să ceri modelului JSON și să speri că se conformează, îți definești cerințele exacte folosind un Pydantic base model. Creezi o clasă Python numită Invoice. În interiorul acestei clase, declari tipurile de date exacte pe care le așteaptă aplicația ta. Definești data ca string, articolele achiziționate ca o listă de string-uri, iar prețul total strict ca float. Iată ideea cheie. LlamaIndex preia clasa ta Pydantic și o serializează automat într-o JSON schema strictă. Când trimiți textul emailului către model, LlamaIndex atașează această schemă și declanșează structured output-ul sau function-calling API-ul modelului. Schema acționează ca un hard boundary. LLM-ul nu mai generează freeform text. Este constrâns să populeze câmpurile din JSON schema specific cu tipurile pe care le-ai cerut. De asemenea, poți ghida raționamentul modelului direct în interiorul structurilor tale de date. Prin atașarea unui field description la un atribut, oferi LLM-ului instrucțiuni targetate. Pentru atributul price, poți adăuga un field description care să precizeze să extragă costul total final, ignorând taxele de transport. LLM-ul citește această descriere ca parte din schema definition și aplică acea logică în timpul fazei de extracție. Când răspunsul se întoarce, LlamaIndex nu îți oferă un raw string sau un dictionary generic. Acesta procesează răspunsul prin Pydantic și returnează un obiect Invoice complet instanțiat. Datele sunt deja validate. Deoarece framework-ul folosește funcționalități native de structured output, modelul știe dinainte că trebuie să ofere un float real pentru preț, nu o reprezentare de tip string a acestuia. Poți accesa imediat atributul invoice dot price în codul tău și poți face calcule matematice cu el. Nu este nevoie să elimini conversational filler-ul, să scoți semnele de dolar sau să faci cast de la string-uri la numere. Tranziția de la limbajul natural la logica aplicației se face seamless la extraction layer. Prin împingerea data schema-ului tău direct în procesul de extracție, forțezi LLM-ul să se adapteze la codul aplicației tale, în loc să scrii cod de aplicație fragil pentru a tolera un comportament imprevizibil al LLM-ului. Asta e tot pentru acest episod. Mulțumesc că m-ai ascultat și continuă să construiești!
6

Construirea de Function Agents Autonomi

3m 53s

Fă saltul de la cod static la agenți autonomi. Vei învăța cum să împachetezi funcțiile Python în tools și să implementezi un FunctionAgent pentru a executa sarcini în mod dinamic.

Descarcă
Salut, sunt Alex de la DEV STORIES DOT EU. LlamaIndex: Aplicații LLM augmentate cu context, episodul 6 din 14. Ce-ar fi dacă aplicația ta ar putea decide ce funcții să ruleze pe baza intenției utilizatorului, în loc de un set rigid de instrucțiuni condiționale? Aceasta este ideea centrală din spatele construirii de agenți autonomi bazați pe funcții. Când construiești un query pipeline standard, tu dictezi calea de execuție. Un agent inversează această paradigmă. Oferi un set de tools, iar un motor de raționament automat folosește un Large Language Model pentru a decide ce tools să apeleze și în ce ordine, pentru a rezolva o problemă. Înainte să mergem mai departe, trebuie să clarificăm o confuzie frecventă. LLM-ul în sine nu execută codul tău Python. El generează doar un request de text structurat prin care spune că vrea să apeleze o anumită funcție cu anumite argumente. Framework-ul de agenți LlamaIndex interceptează acel request, execută codul tău Python local, și apoi trimite rezultatul înapoi către LLM. Pentru ca acest routing autonom să funcționeze, ai nevoie de tools. Un tool este, în esență, o funcție Python standard, încapsulată într-o clasă LlamaIndex numită FunctionTool. Dar, pentru că LLM-ul trebuie să știe când și cum să folosească funcția ta, metadatele codului tău devin o parte critică a sistemului. Framework-ul extrage numele funcției, type hints-urile și docstring-ul, și le transmite LLM-ului ca instrucțiuni. Hai să ne uităm la un scenariu concret. Vrei ca agentul tău să rezolve probleme de matematică. Scrii două funcții Python, una numită add și una numită multiply. Pentru funcția multiply, type hints-urile tale specifică faptul că primește doi întregi și returnează un întreg. Foarte important, scrii un docstring care spune clar că această funcție înmulțește două numere. Încapsulezi ambele funcții în tools și le pasezi într-o listă, împreună cu LLM-ul ales, pentru a inițializa agentul. Aici devine interesant. Întrebi agentul cât face doi plus doi, înmulțit cu trei. Agentul intră într-un reasoning loop. Mai întâi, LLM-ul analizează prompt-ul și se uită la tools-urile disponibile. Citește docstrings-urile tale și decide că trebuie să adune mai întâi. Generează un request pentru a apela tool-ul add cu argumentele doi și doi. Framework-ul rulează funcția ta Python local și returnează rezultatul, patru, înapoi agentului. Agentul nu a terminat. Se uită la rezultatul intermediar și la obiectivul său inițial. Decide că acum trebuie să înmulțească. Solicită tool-ul multiply, pasând numărul patru pe care tocmai l-a primit și numărul trei din prompt-ul tău inițial. Framework-ul execută înmulțirea și returnează doisprezece. În cele din urmă, LLM-ul recunoaște că problema este rezolvată și generează un răspuns conversațional pentru utilizator. Nu există reguli hardcoded sau logică de routing explicită aici. Agentul a dedus dependențele și ordinea operațiilor complet pe cont propriu, pe baza tools-urilor disponibile. Asta înseamnă că modul în care îți scrii definițiile Python dictează direct cât de inteligent este agentul tău. Type hints-urile și docstrings-urile tale nu mai sunt doar pentru alți developeri, ele sunt prompt-ul propriu-zis care conduce logica autonomă a agentului. Dacă obții valoare din aceste episoade și vrei să susții emisiunea, poți căuta DevStoriesEU pe Patreon. Asta e tot pentru acest episod. Mersi că m-ai ascultat și continuă să construiești!
7

Extinderea Agenților cu LlamaHub Tools

4m 08s

Îmbunătățește-ți agenții cu integrări pre-construite. Acest episod arată cum să navighezi pe LlamaHub, să instalezi specificațiile pentru tools și să oferi agentului tău capabilități din lumea reală instantaneu.

Descarcă
Salut, sunt Alex de la DEV STORIES DOT EU. LlamaIndex: Aplicații LLM augmentate cu context, episodul 7 din 14. Construiești un agent care trebuie să verifice prețurile acțiunilor, să extragă mesaje din Slack sau să facă un query într-o bază de date. Ai putea petrece zile întregi citind documentația de API, gestionând scheme de autentificare și scriind boilerplate code pentru integrare. Sau, ai putea pur și simplu să iei munca gata făcută pe care un developer din comunitate a scris-o și a verificat-o deja. Acest episod acoperă extinderea agenților cu tools din LlamaHub. Agenții se bazează pe tools pentru a interacționa cu lumea exterioară. Deși poți scrie fiecare integrare manual, LlamaHub există special pentru a elimina această muncă redundantă. Funcționează ca un vast registry open-source de tool specs pre-construite. Un tool specification, sau tool spec, este în esență o clasă Python care grupează mai multe API calls corelate într-un singur package. Aducându-le direct în proiectul tău, sari peste întregul proces de scriere a logicii din spate pentru servicii third-party. Pentru a folosi una dintre aceste integrări, îi instalezi package-ul specific. Dacă vrei ca agentul tău să răspundă la întrebări despre prețul acțiunilor unei companii, nu scrii un HTTP request custom către API-ul Yahoo. În schimb, folosești package manager-ul standard pentru a instala package-ul de tools Llama Index Yahoo Finance. Odată instalat, imporți clasa Yahoo Finance Tool Spec în scriptul tău. Aici e partea esențială. Nu pasezi clasa tool spec direct agentului. Pentru că un tool spec este un bundle de mai multe capabilități, trebuie mai întâi să îi faci unpack. Faci asta creând o instanță de Yahoo Finance Tool Spec, și apoi apelând o metodă specifică pe ea, numită to tool list. Această metodă desface bundle-ul și returnează un array plat standard de tools individuale pe care agentul le poate citi și executa. Acest design modular înseamnă că nu ești restricționat să folosești doar tools externe sau doar tools interne. Le poți combina perfect. Să presupunem că ai deja un function tool custom, local, care formatează numerele valutare special pentru dashboard-ul intern al companiei tale. Pur și simplu creezi o listă Python standard. În interiorul acestei liste, pui tool-ul tău custom de formatare a valutelor și, de asemenea, dai append la tools-urile despachetate din lista de tools Yahoo Finance. Apoi, iei acest array combinat și îl pasezi direct agentului tău în timpul inițializării, atribuindu-l parametrului tools. Când îi dai un prompt agentului cu o întrebare despre prețul curent al unei acțiuni, agentul evaluează request-ul utilizatorului în raport cu descrierile tuturor tools-urilor din acea listă combinată. Recunoaște că tool-ul Yahoo Finance este alegerea corectă pentru a face fetch la datele de piață. Extrage simbolul bursier al companiei din prompt-ul utilizatorului, execută tool-ul Yahoo Finance, recuperează prețul în timp real și apoi poate, opțional, să facă chain cu acel rezultat brut în tool-ul tău local de formatare înainte de a returna răspunsul final utilizatorului. Tocmai i-ai oferit aplicației tale capabilități complexe de căutare financiară prin instalarea unui package, instanțierea unei clase și apelarea unei metode de unpack. Acest architectural pattern se aplică la sute de integrări pe LlamaHub, de la citirea documentelor din Google Drive până la a face query-uri pe Wikipedia. Adevăratul avantaj al unui agent autonom nu se găsește doar în capacitatea de reasoning a language model-ului din spate, ci în gama uriașă de sisteme externe pe care le poate accesa instantaneu prin tool specs pre-construite. Asta e tot pentru acest episod. Mersi că m-ai ascultat și continuă să construiești!
8

Swarms Multi-Agent cu AgentWorkflow

4m 02s

Treci dincolo de configurațiile cu un singur agent. Învață cum să configurezi un swarm liniar de agenți specializați care își predau autonom sarcinile unul altuia folosind AgentWorkflow.

Descarcă
Salut, sunt Alex de la DEV STORIES DOT EU. LlamaIndex: Context-Augmented LLM Applications, episodul 8 din 14. Îi dai unui language model un singur prompt masiv, cerându-i să facă research pe un subiect, să scrie un raport și să-și revizuiască critic propria muncă. Eșuează. Context window-ul este dat peste cap, tool-urile sunt folosite greșit, iar output-ul este un compromis superficial. Soluția este să spargi acel prompt masiv într-un swarm de specialiști, folosind Multi-Agent Swarms cu AgentWorkflow. Un singur agent supraîncărcat se chinuie pentru că are prea multe tool-uri și instrucțiuni contradictorii. Trebuie să decidă când să dea search, când să facă draft-ul și când să editeze, totul în timp ce gestionează un context intern masiv. AgentWorkflow rezolvă asta permițându-ți să definești o rețea de agenți extrem de focusați. Fiecare agent operează cu un system prompt restrâns, un set limitat de tool-uri și un singur obiectiv. Gândește-te la un pipeline de generare de conținut. În loc de un mega-agent, creăm trei FunctionAgents distincți. În primul rând, Researcher-ul. Echipăm acest agent cu un tool de web search și îi dăm instrucțiuni stricte să adune date. Nu scrie proză. Apoi, definim Writer-ul. Îi scoatem complet tool-urile de search pentru a nu-l lăsa să se distragă. Singurul lui job este să ia datele brute și să scrie paragrafe curate. În cele din urmă, definim Reviewer-ul. Îi dăm guidelines despre ton și acuratețea datelor, instruindu-l să critice textul. Aici e ideea cheie. Să ai mai mulți agenți e degeaba dacă nu se pot coordona, dar să le dai mână liberă să vorbească cu oricine creează haos. Trebuie să îi conectezi explicit între ei. În AgentWorkflow, faci asta definind permisiunile de handoff. Când îți configurezi agenții, specifici o proprietate numită can handoff to. Aceasta acceptă o listă cu alți agenți. Pentru pipeline-ul nostru, îi dăm Researcher-ului permisiunea de handoff către Writer. Îi dăm Writer-ului permisiunea de handoff către Reviewer. De asemenea, îi dăm Reviewer-ului permisiunea de handoff înapoi către Writer, dacă textul are nevoie de revizuire. Asta creează un graf strict, direcționat, de agenți. Framework-ul impune aceste limite. Researcher-ul nu poate sări peste Writer ca să trimită notițele brute direct către Reviewer. Pur și simplu nu are autorizarea necesară. Ca să execuți asta, pasezi lista ta de agenți într-o instanță AgentWorkflow. Începi procesul rulând workflow-ul cu un user query inițial, direcționându-l către Researcher pentru a da startul. Framework-ul de workflow gestionează automat shared state-ul și routing-ul. Researcher-ul își rulează tool-urile de search, compilează datele și decide intern că jobul lui e gata. Apoi folosește tool-ul său de handoff pentru a pasa controlul, împreună cu datele adunate, către Writer. Writer-ul preia acel context, face draft-ul raportului și dă handoff către Reviewer. Dacă Reviewer-ul observă o problemă, declanșează un handoff înapoi către Writer, cu feedback. Acest loop continuă până când un agent decide că treaba e gata și returnează un răspuns final către user, în loc să declanșeze un alt handoff. Limitarea unui agent la un singur rol și definirea explicită a căilor lui de comunicare este cea mai sigură metodă de a forța un reasoning complex, multi-step, din language models. Asta e tot pentru acest episod. Mulțumesc că ai ascultat și continuă să construiești!
9

Orchestrator Agent Pattern

4m 07s

Preia controlul granular asupra workflow-urilor tale bazate pe agenți. Descoperă cum să construiești un master orchestrator agent care gestionează agenții subordonați ca tools apelabile.

Descarcă
Salut, sunt Alex de la DEV STORIES DOT EU. LlamaIndex: Aplicații LLM augmentate cu context, episodul 9 din 14. Dacă îi lași pe agenții autonomi să își paseze controlul peer-to-peer, ajungi ușor la bucle infinite sau pierzi contextul. Uneori nu te poți baza pe agenți să își paseze controlul de la unul la altul. Ai nevoie de un manager central care să se ocupe de toată operațiunea. Acesta este pattern-ul Orchestrator Agent. Într-un sistem multi-agent, să îi lași pe agenți să vorbească direct între ei sună bine, dar devine rapid un coșmar la debugging. Pierzi evidența a cine este la conducere, iar gestionarea state-ului global al aplicației devine incredibil de complexă. Pattern-ul Orchestrator rezolvă asta prin impunerea strictă a unui model hub-and-spoke. Există un singur agent orchestrator top-level, iar toți ceilalți agenți sunt tratați strict ca tools pe care acel orchestrator să le folosească. Hai să trecem printr-un scenariu în care sistemul tău trebuie să genereze un briefing tehnic foarte bine documentat. Setezi un agent orchestrator care să acționeze ca un manager strict. Acest manager deține state-ul global. El ține minte prompt-ul original al utilizatorului, păstrează contextul principal și urmărește ce s-a realizat până acum. Nu face el însuși munca grea. În schimb, tu îi oferi tools. Aceste tools nu sunt simple API wrappers sau calculatoare de bază. Sunt sub-agenți complet separați și complet funcționali. Ai putea construi un sub-agent dedicat pentru research, echipat cu capabilități de vector search și web scraping. Ai putea construi un al doilea sub-agent dedicat pentru scriere, echipat cu reguli de stil și logică de formatare. În LlamaIndex, iei acești sub-agenți și le expui metodele de run sub formă de tools. Făcând asta, faci wrap întregului lor loop intern de reasoning în spatele unei interfețe standard de tool, cu un nume și o descriere. Pentru orchestrator, acești sub-agenți arată exact ca niște funcții standard Python. Când utilizatorul cere briefing-ul, orchestratorul evaluează obiectivul general pe baza descrierilor de tools pe care i le-ai furnizat. Decide să apeleze mai întâi tool-ul de research și îi pasează parametrii necesari. Controlul se mută temporar la sub-agentul de research. Acest sub-agent rulează propriul său loop autonom. Ar putea face trei sau patru tool calls interne pentru a aduna date, a sintetiza faptele și a formula un răspuns. Odată ce agentul de research termină, combină toată acea muncă într-un string de text final și îl returnează. Aici este ideea cheie. Orchestratorul nu cedează de fapt niciodată controlul procesului principal. Doar așteaptă ca tool-ul să returneze o valoare. Orchestratorul primește rezumatul de research, îl adaugă la propriul context și evaluează următorul pas. Își dă seama că informațiile trebuie redactate într-un document, așa că apelează tool-ul de scriere, pasând noul research ca parametru de input. Sub-agentul de scriere preia controlul, face propria procesare internă și dă înapoi textul finalizat. Orchestratorul vede că obiectivul final a fost atins și livrează răspunsul către utilizator. Acest separation of concerns strict face ca sistemul tău să fie extrem de predictibil. Agentul de research nu trebuie să știe că agentul de scriere există. Niciun sub-agent nu trebuie să-și facă griji în legătură cu pasarea contextului, formatarea răspunsului final pentru utilizator sau decizia legată de când este gata toată treaba. Orchestratorul centralizează toată logica de decizie high-level. Forțând sub-agenții să opereze pur și simplu ca tools izolate în loop-ul unui manager central, poți construi sisteme multi-agent extrem de capabile, care rămân complet predictibile și ușor de făcut debug. Asta e tot pentru acest episod. Ne auzim data viitoare!
10

Custom Multi-Agent Planners

3m 47s

Obține flexibilitate multi-agent supremă. Învață cum să îți creezi propria buclă de orchestrare folosind custom XML prompting, Pydantic și execuție imperativă.

Descarcă
Salut, sunt Alex de la DEV STORIES DOT EU. LlamaIndex: Context-Augmented LLM Applications, episodul 10 din 14. Orchestrarea built-in a agenților este super până când logica ta de business începe să arate ca o porție de spaghete. Când hand-off-urile standard nu reușesc să capteze regulile tale de scheduling extrem de specifice, abstracțiunile devin un blocker. Exact atunci ai nevoie de Custom Multi-Agent Planners. Un custom planner este un escape hatch pentru power-users. Îți permite să-ți construiești propriul loop de orchestrare de la zero folosind un Workflow standard din LlamaIndex. În loc să te bazezi pe un supervisor pre-built care să dicteze ce agent acționează mai departe, controlezi întregul proces de scheduling în mod imperativ, în Python. Tu dictezi ordinea de execuție, rutarea datelor și state management-ul. Procesul începe de obicei în interiorul unei clase custom, adesea numită PlannerWorkflow. Prima fază este planificarea. Când un utilizator trimite un request, workflow-ul tău trimite un prompt către un Large Language Model. Acest prompt include query-ul utilizatorului și o descriere strictă a tool-urilor sau agenților pe care îi ai disponibili. Instruiești explicit modelul de limbaj să genereze un plan pas cu pas într-un format extrem de structurat. De exemplu, ai putea să-i spui modelului să pună fiecare acțiune într-un bloc XML folosind tag-uri step, sau să o formateze ca un array JSON. Când modelul răspunde, tu parsezi acel output structurat. Folosești o librărie precum Pydantic pentru a valida XML-ul sau JSON-ul și a-l converti într-o listă concretă de task-uri prin care codul tău poate itera. Acum intri în faza de execuție. Această parte depinde în întregime de logica ta custom. Workflow-ul tău iterează prin lista parsată de pași, unul câte unul. Pentru fiecare pas, verifică acțiunea cerută. Folosești logică condițională standard pentru a decide ce să faci mai departe. Dacă pasul parsat specifică un task de research, codul tău apelează explicit agentul de research. Dacă următorul pas necesită un calcul, declanșezi agentul de math. Iată ideea cheie. Pentru că scrii tu însuți loop-ul, ai ownership complet asupra state-ului. De obicei, creezi un dicționar de context shared care trăiește pe durata rulării workflow-ului. Când agentul tău de research își termină task-ul, workflow-ul ia rezultatul și îl scrie direct în acel dicționar. Când următorul pas declanșează agentul de math, logica ta custom îi poate pasa exact datele necesare din acel dicționar shared. Nu speri ca un orchestrator black-box să paseze variabilele corecte. Mapezi explicit output-urile unui agent la input-urile următorului. Odată ce loop-ul finalizează toți pașii din planul tău validat, workflow-ul efectuează orice formatare finală și returnează răspunsul. Construirea unui custom planner înseamnă că dai confortul out-of-the-box pe control total. Dacă un agent dă fail, poți scrie o logică de retry custom pentru acel pas specific. Dacă un pas necesită validare printr-un API extern, poți pune loop-ul pe pauză. Scrii cod imperativ standard care pur și simplu se întâmplă să folosească modele de limbaj ca funcții. Valoarea supremă a unui custom planner este predictibilitatea. Forțând modelul de limbaj să genereze un plan XML rigid și executându-l cu loop-uri și dicționare Python standard, elimini complet partea de ghicit a unei orchestrări black-box. Asta e tot pentru acest episod. Mersi că m-ai ascultat și spor la construit!
11

Workflow-uri Human-in-the-Loop

3m 51s

Previne dezastrele autonome păstrând un om în buclă (human in the loop). Vei învăța cum să pui pe pauză workflow-urile cu evenimente pentru a aștepta confirmarea umană înainte de a executa sarcini periculoase.

Descarcă
Salut, sunt Alex de la DEV STORIES DOT EU. LlamaIndex: Aplicații LLM augmentate cu context, episodul 11 din 14. Construiești un agent pentru a-ți gestiona infrastructura, iar acesta decide că cea mai bună modalitate de a rezolva o eroare este să șteargă o bază de date din producție. Nu lăsa niciodată un agent autonom să facă o acțiune distructivă fără să ceară mai întâi, în mod explicit, permisiunea unui om. Pentru a preveni asta, ai nevoie de workflows Human-in-the-Loop. Human-in-the-loop este un mecanism event-driven care pune pe pauză un agent, cere un input extern și reia execuția pe baza răspunsului. În loc să lași agentul să ruleze neîntrerupt prin ciclul lui de gândire și acțiune, interceptezi operațiunile cu risc ridicat. Realizezi asta în LlamaIndex Workflows folosind trei componente specifice: InputRequiredEvent, metoda wait_for_event și HumanResponseEvent. Imaginează-ți un tool periculos, conceput pentru a șterge o resursă de cloud. Agentul decide că trebuie să folosească acest tool și declanșează pasul corespunzător din workflow. Dacă tool-ul se execută imediat, resursa dispare. În schimb, pasul din workflow interceptează execuția. Înainte să șteargă ceva, pasul creează un InputRequiredEvent. Acest eveniment poartă un payload care conține detalii despre acțiune, cum ar fi numele resursei target și un prompt care îi cere utilizatorului să confirme ștergerea. Pasul emite acest eveniment către aplicația principală. Aici e partea esențială. Pasul din workflow nu poate sta pur și simplu într-un loop activ așteptând un răspuns. Trebuie să-i suspenzi state-ul. Faci asta apelând wait_for_event pe contextul workflow-ului, specificând că pasul ascultă acum după un HumanResponseEvent. Această acțiune cedează controlul înapoi către environment. Engine-ul de workflow pune pe pauză complet pasul, înghețând agentul în state-ul lui curent, fără să consume resurse de compute în timp ce așteaptă. În afara workflow-ului, layer-ul aplicației tale prinde InputRequiredEvent. Citești payload-ul și afișezi prompt-ul de confirmare utilizatorului în interfața lui de command-line. Omul citește avertismentul și tastează da sau nu. Acum trebuie să scoți agentul de pe pauză. Aplicația ta preia input-ul utilizatorului și îl împachetează într-un HumanResponseEvent. Trimiți acest nou eveniment direct înapoi în engine-ul de workflow care rulează. Engine-ul recunoaște tipul de eveniment și îl rutează către pasul exact care a fost suspendat. Metoda wait_for_event se rezolvă, returnând string-ul cu răspunsul uman înapoi către logica tool-ului. Tool-ul evaluează răspunsul. Dacă omul a tastat da, tool-ul continuă cu apelul API pentru a șterge resursa de cloud. Dacă omul a tastat nu, tool-ul anulează ștergerea. În ambele cazuri, tool-ul returnează un mesaj de status final înapoi către agent. Agentul procesează acest rezultat, înțelege dacă acțiunea a reușit sau a fost blocată de utilizator și decide care este următoarea lui mișcare. Folosind evenimente pentru a pune pe pauză și a relua execuția, agentul tău își menține întregul context de reasoning și memoria în timp ce așteaptă ore sau chiar zile ca un om să ia o decizie. Asta e tot pentru acest episod. Mulțumesc pentru audiție și continuă să construiești!
12

Observability și Tracing

3m 55s

Nu mai depana AI-ul cu instrucțiuni print. Acest episod explorează callbacks din LlamaIndex și observability cu un singur click pentru a urmări input-urile, duratele și output-urile în pipeline-uri complexe.

Descarcă
Salut, sunt Alex de la DEV STORIES DOT EU. LlamaIndex: Aplicații LLM augmentate cu context, episodul 12 din 14. Când un agent autonom face o greșeală, să sapi prin print statements standard din Python ca să găsești problema e un adevărat coșmar. Pui o întrebare simplă, primești un răspuns halucinat, iar un stack trace standard nu îți spune absolut nimic despre motivul pentru care modelul a mințit. Ca să repari asta, ai nevoie de o modalitate de a vedea în interiorul cutiei negre. Acest episod acoperă Observability și Tracing. Tool-urile tradiționale de debugging nu fac față când vine vorba de large language models. Un stack trace îți spune unde a crăpat codul, dar bug-urile de LLM sunt de obicei logice. Codul rulează perfect, dar sistemul extrage documentul greșit sau interpretează greșit un prompt. Logging-ul standard din Python este prima ta linie de apărare. Setând nivelul de logging pe debug, LlamaIndex va scoate un feed raw cu absolut tot ce face. Vei vedea exact prompturile trimise către language model și răspunsurile HTTP raw. Asta e util ca să verifici dacă a picat un network call, dar pentru un workflow de agent cu mai mulți pași, să citești un perete de text nestructurat este incredibil de obositor. Aici e ideea de bază. Nu ai nevoie doar de un log de evenimente; trebuie să vezi call graph-ul. Ai nevoie de o vedere structurată a modului în care datele circulă de la query-ul inițial, prin retrievere, în language model și înapoi. LlamaIndex gestionează asta folosind un sistem de callback-uri. Callback-urile sunt hook-uri care se declanșează în anumite puncte din ciclul de execuție. Framework-ul oferă un tool built-in numit Llama debug handler. Inițializezi acest handler și îl atașezi la setările tale globale. Din acel moment, înregistrează silențios fiecare operațiune. Să zicem că rulezi un query engine și îți returnează un fapt complet inventat. Fără tracing, nu ai nicio idee dacă modelul a halucinat sau dacă baza ta de date i-a dat informații greșite. Cu debug handler-ul atașat, îi poți cere să dea print la trace după ce se termină query-ul. Trace-ul îți arată secvența exactă de evenimente. Vezi query-ul inițial. Vezi pasul de retrieval. Partea crucială e că vezi exact acele text nodes pe care retriever-ul le-a scos din indexul tău. Inspectezi acele noduri în trace și descoperi că a fost adus un document învechit. Language model-ul nu a halucinat; doar a citit date greșite. Repari indexul și bug-ul este rezolvat. Trace-urile în terminal sunt excelente pentru local development, dar nu scalează bine când ai agenți complecși care fac zeci de pași de reasoning. Pentru producție, LlamaIndex oferă ceea ce numește one-click observability. Setând o environment variable specifică sau adăugând o singură linie de configurare, poți ruta toate acele date din callback-uri către o platformă dedicată de observability. Aceste platforme fac ingest la datele de trace și generează dashboard-uri vizuale. Poți da click printr-un visual tree al workflow-ului agentului tău, inspectând latența exactă, token usage-ul și payload-ul pentru fiecare pas în parte. Nu trebuie să instrumentezi manual fiecare funcție; callback-urile native ale framework-ului se ocupă de greul muncii. Diferența dintre un prototip fragil și o aplicație de producție fiabilă este dacă poți explica exact de ce sistemul a generat un anumit răspuns. Dacă ți s-a părut util și vrei să susții emisiunea, poți căuta DevStoriesEU pe Patreon. Asta e tot pentru acest episod. Mersi că ai ascultat și continuă să construiești!
13

Metrici de Evaluare RAG

4m 10s

Măsoară adevărata eficiență a aplicațiilor tale. Învață cum să folosești FaithfulnessEvaluator și RetrieverEvaluator pentru a puncta în mod obiectiv calitatea extragerii și a răspunsurilor.

Descarcă
Salut, sunt Alex de la DEV STORIES DOT EU. LlamaIndex: Aplicații LLM augmentate cu context, episodul 13 din 14. Schimbi acel embedding model și dintr-o dată răspunsurile par puțin ciudate, dar nu poți să-ți dai seama exact de ce. Dacă doar te uiți la output-uri cu ochiul liber pentru a verifica calitatea, pipeline-ul tău doar ghicește în întuneric. Ca să nu te mai bazezi pe intuiție și să previi regresiile în producție, ai nevoie de metrici de evaluare RAG. Să construiești o aplicație RAG e ușor, dar să o faci robustă e greu. Vei ajusta constant dimensiunile de chunk, prompt-urile și strategiile de retrieval. Dacă te bazezi pe review uman ca să testezi fiecare modificare, fie vei încetini dezvoltarea, fie vei face deploy la regresii. Ai nevoie de măsurători automate și obiective. Pentru că RAG constă în doi pași distincți, găsirea informației corecte și generarea unui răspuns pe baza ei, trebuie să evaluezi ambele etape separat. Hai să ne uităm mai întâi la generare. Asta se numește Response Evaluation. Metrica principală aici este faithfulness. Scopul este să prinzi halucinațiile. Un răspuns faithful este unul în care modelul de limbaj se bazează în întregime pe contextul obținut prin retrieval, în loc să inventeze fapte din propriile date de pre-training. În LlamaIndex, gestionezi asta cu FaithfulnessEvaluator. Acest tool folosește un model de limbaj under the hood pentru a acționa ca un judecător. Inițializezi evaluatorul, apoi îi pasezi query-ul original, acel array de noduri de context obținute prin retrieval și textul final generat. Evaluatorul returnează un obiect de evaluare care conține un boolean binar, pass sau fail, care îți spune dacă răspunsul este strict susținut de contextul furnizat. De asemenea, oferă un string de reasoning care explică de ce judecătorul a luat acea decizie. Dacă scorul tău de faithfulness scade după un update, prompt-ul sau modelul tău de limbaj s-ar putea să devină prea creative. Acum, a doua parte a problemei. Nici măcar cel mai bun model de limbaj nu poate genera un răspuns faithful dacă îi dai documentele greșite. Aici intervine Retrieval Evaluation. Iată ideea de bază. Evaluezi retrieval-ul verificând dacă sistemul a adus exact nodurile sursă pe care le așteptai pentru un anumit query, ignorând complet textul final generat. Gestionezi asta cu RetrieverEvaluator. Ia în considerare un scenariu în care vrei să testezi un nou embedding model. În loc să îi faci deploy și să ghicești dacă e mai bun, construiești un dataset de evaluare. Acest dataset conține o listă de query-uri asociate cu identificatorii specifici de documente care conțin răspunsurile corecte. Rulezi întregul batch de query-uri prin RetrieverEvaluator. Evaluatorul calculează două metrici cruciale, Hit Rate și MRR. Hit Rate este simplu de înțeles. Verifică dacă documentul așteptat a apărut undeva în topul rezultatelor de retrieval. Dacă obții cinci documente prin retrieval, iar cel corect este printre ele, acela este un hit. Măsoară recall-ul pur. Dar poziția contează. Dacă documentul corect este mereu al cincilea, modelul tău de limbaj l-ar putea ignora din cauza limitelor de context sau a attention decay-ului. Aici intervine Mean Reciprocal Rank, sau MRR. MRR se uită la poziția primului document relevant. Dacă documentul corect este chiar primul, scorul este unu. Dacă este al doilea, scorul este o jumătate. Dacă este al treilea, o treime. Evaluatorul face media acestor fracții pe întregul tău dataset. Un MRR mai mare înseamnă că retriever-ul tău împinge constant cele mai relevante informații chiar în partea de sus a context window-ului. Comparând Hit Rate-ul și MRR-ul vechiului tău embedding model cu cel nou, obții dovada matematică a modelului care are performanțe mai bune. Poți urmări aceste numere în timp și poți rula automat acest pipeline la fiecare pull request. Cel mai valoros lucru pe care îl poți face pentru pipeline-ul tău RAG este să separi evaluarea a ceea ce obții prin retrieval, de modul în care generezi răspunsul final. Îți mulțumesc că ai petrecut câteva minute cu mine. Până data viitoare, numai bine.
14

Scaffold pentru Producție

4m 07s

Transformă prototipurile în aplicații complete instantaneu. Descoperă cum să folosești create-llama și RAG CLI pentru a genera structura (scaffold) aplicațiilor web full-stack și a chat-urilor de terminal fără a scrie cod boilerplate.

Descarcă
Salut, sunt Alex de la DEV STORIES DOT EU. LlamaIndex: Aplicații LLM augmentate cu context, episodul 14 din 14. Nu mai da copy-paste la același API și boilerplate React de fiecare dată când vrei să testezi o nouă idee de Retrieval-Augmented Generation. Înțelegi deja mecanica framework-ului, dar setarea unei interfețe curate ca să-ți folosești efectiv modelele îți ia în continuare ore întregi de muncă repetitivă. Astăzi, vorbim despre tool-urile de starter care te ajută să faci scaffold pentru producție în câteva secunde. Construirea unei aplicații funcționale necesită mult mai mult decât un simplu index și un query engine. Ai nevoie de un server de backend care să gestioneze în siguranță request-urile primite. Ai nevoie de rute de API ca să transmiți mesaje înainte și înapoi. Ai nevoie de un client de frontend care să afișeze istoricul de chat, să randeze loading state-urile și să facă parse la răspunsuri. Să scrii infrastructura asta de la zero pentru fiecare dataset sau prototip nou îți mănâncă tot timpul. Ca să rezolve asta, LlamaIndex oferă un utilitar de command-line numit create-llama. Acest tool generează o aplicație web completă, full-stack, preconfigurată cu best practice-urile LlamaIndex. Deschizi terminalul și rulezi comanda create-llama. Tool-ul te trece apoi printr-o serie de opțiuni. Te întreabă dacă vrei un backend în Python folosind FastAPI, sau un backend în Node folosind Express. Te întreabă dacă vrei un frontend în Next JS ca să le oferi userilor o interfață web finisată. Apoi, îți cere sursa de date. Poți să îndrepți tool-ul direct către un folder local care conține fișierele tale PDF. După ce termini de răspuns la prompt-uri, create-llama preia controlul. Instalează toate dependințele necesare. Face scaffold la structura de directoare. Scrie scriptul de ingestion ca să facă parse la PDF-urile tale. Conectează endpoint-urile de API, astfel încât frontend-ul tău să poată comunica cu retrieval engine-ul. La final, setează variabilele de environment. Rulezi o singură comandă de start și ai imediat o interfață de chat stilizată care rulează în browser. Poți să scrii o întrebare, iar interfața va apela backend-ul generat, va face retrieve la contextul din PDF-urile tale și va face stream la răspuns înapoi pe ecran. Treci de la un folder gol la un prototip full-stack funcțional în vreo treizeci de secunde. Asta rezolvă partea de aplicații web. Dar uneori un web server și o interfață grafică sunt overkill. Dacă tocmai ai descărcat o specificație tehnică lungă și trebuie să îi faci query imediat fără să părăsești command line-ul, folosești RAG CLI. RAG CLI este un tool construit pur pentru interacțiunea cu documentele din terminal. Îl instalezi, apoi rulezi o comandă ca să-l îndrepți către directorul tău local de documente. CLI-ul rulează automat procesul de ingestion. Face chunking la text, generează embeddings și le stochează într-un vector database local, chiar acolo pe mașina ta. Când se termină procesul de ingestion, rulezi comanda de chat. Prompt-ul tău standard din terminal se transformă într-o sesiune de chat. Pui o întrebare, CLI-ul face retrieve la datele relevante, face query către language model și printează răspunsul generat direct în consolă. Nu ai componente vizuale sau rute web de configurat. Este absolut cea mai rapidă modalitate de a vorbi cu datele tale local. Iată ideea de bază. Acum înțelegi mecanica profundă a aplicațiilor augmentate cu context, de la chunking pe documente până la construirea de agent routers complecși. Aceste scaffolding tools există ca să nu te mai bați cu infrastructura de bază și să-ți petreci timpul făcând tuning la acele strategii core de retrieval. Pentru că ăsta e ultimul episod din seria noastră LlamaIndex, cel mai bun pas următor este să intri pe documentația oficială și să încerci să construiești aceste pipelines hands-on. Dacă ai o idee pentru un tech stack complet diferit pe care vrei să-l acoperim, intră pe DEV STORIES DOT EU ca să sugerezi un subiect. Asta e tot pentru acest episod. Mersi că ne-ai ascultat, și continuă să construiești!