Intervjuer namršten: "Sa samo jednim Agent projektom se usudiš na intervju?" Naljutio sam se: "U donjoj polovini biografije još jedan imate, pa pogledajte." Intervjuer: "Prilično otporan na pritisak ti."
Intervjuer Lao Wang lista biografiju, sve više se namršteno: "Samo jedan Agent projekat, i usuđuješ se na intervju za AI aplikacioni razvoj?"
Naljutio sam se: "U donjoj polovini biografije još jedan imate, pa pogledajte dole."
Lao Wang-ova ruka stade na sredini biografije, nije listao dalje, ugao usta se trgne: "Prilično otporan na pritisak ti. Važi, krećemo od gornje polovine, ako izdržiš, onda gledam donju."
Ovaj niz ispitivanja ukupno 11 pitanja, od arhitekture memorije pa do kvantifikovane evaluacije. Odgovori nisu bubanje — pre nego što sam napisao ovaj tekst, prelistao sam izvorni kod oba projekta od početka do kraja, i svako pitanje pada na konkretnu implementaciju. Serijal AI intervju uzastopnih pitanja dobija još jedan komad, zapratite Autor-a, nijedan ne propustite.
(Ceo tekst je intenzivan, garantujem da ćete naučiti mnogo, mnogo toga, vežite sigurnosne pojaseve, idemooo~)
content
01. Koje AI alate za programiranje obično koristite
Lao Wang-ovo prvo pitanje je svakodnevno: "Koje AI alate za programiranje obično koristite?"
"Glavni su Codex i Claude Code, za čitanje koda IntelliJ IDEA, za pisanje teksta i frontend VSCode. Što se alata tiče, mislim da je dovoljno da budu upotrebljivi, nemoj se petljati oko onog što ne treba."
"Posle dosta korišćenja, želim da razumem kako Claude Code radi iznutra, pa sam po njegovoj ideji napisao Agent command line alat u Javi, to je taj PaiCLI u gornjoj polovini biografije."
Lao Wang klima glavom: "Onda krećemo od njega."
[Screenshot: moj set alata; stil: skill-card; cilj screenshot-a: pokaži podelu između Codex, Claude Code, IDEA, VSCode; ključne reči: Codex, Claude Code, IntelliJ IDEA, VSCode]
02. Zašto trojna arhitektura memorije ovako dizajnirana
"U biografiji piše trojna arhitektura memorije, zašto tri sloja?"
"Ova tri sloja se probijaju prema CLAUDE.md rešenju Claude Code-a, u mom projektu se zove PAI.md, redom učitavanja:"
- Korisnički nivo
~/.paicli/PAI.md: čuva preference između projekata, u kom god repu radi - Projektni nivo
PAI.md: čuva komande za build ovog repozitorijuma, standarde koda, ide sa Git-om, tim deli - Lokalni override
PAI.local.md: čuva konfiguraciju samo za moju mašinu, ne ide u verzioni kontrolu
"Pri izgradnji system prompt-a u svakom krugu razgovora svi se ponovo učitavaju, pa kada izmenite fajl, sledeći krug je na snazi, nema keširane nekonzistentnosti. Priroda tri sloja je scope — globalni, deljeni, privatni, ko koga prekriva je sasvim jasno."
[Screenshot: redosled učitavanja trojne memorije; stil: three-layer; cilj screenshot-a: pokaži poziciju i odnos preklapanja korisničkog, projektnog i lokalnog nivoa; ključne reči: PAI.md, korisnički nivo, projektni nivo, lokalni override]
Lao Wang dalje pita: "Da li je dovoljna samo memorija fajlova?"
"Nije dovoljno, to je samo dimenzija fajla. Dimenzija razgovora još ima kratkoročnu i dugoročnu liniju: kratkoročna memorija je istorija poruka u sesiji, budžet je 45% kontekstnog prozora, ako prekorači okida kompresiju; dugoročna memorija su činjenice između sesija, čuvaju se kao JSON fajl, u projects i globalna dva scope-a. Projektni scope koristi apsolutnu putanju projekta kao ključ izolacije, pri pretrazi se vraćaju samo unosi vidljivi za trenutni projekat, sprečavajući da preference projekta A kontaminiraju projekat B."
03. Zašto memorija u fajlovima, a ne u vektorskoj bazi
Lao Wang se zavalio: "Zašto memorija u fajlovima? Zar ne bi bilo bolje sa vektorskom bazom?"
"Znam da mnogi žele da kažu, Mem0 je moćan, vektorska memorija je moćna, instaliraš plugin i Agent ima memoriju. Ali memorija i pretraga su dva problema. Memorija je malog obima, nekoliko desetina preferenci, nekoliko hiljada znakova standarda, model ih jednom pročita, ne treba vektorska pretraga; i memorija zahteva da bude čitljiva i izmenljiva, korisnik otvori Markdown fajl i može da vidi šta je Agent zapamtio, promeni jedan red i ispravi ga. Vektorska baza pretvara sadržaj u crnu kutiju, obe ove prednosti nestaju."
"Vektorsku pretragu koristim, ali za pretragu koda: seckam kod u blokove i čuvam u SQLite, vektor (embedding) kao JSON polje, za pokrivanje semantičke pretrage. U opisu alata jasno piše, precizno lociranje prvo ide preko grep-a, semantička pretraga je samo pomoćna."
[Screenshot: podela između memorije i pretrage; stil: whiteboard; cilj screenshot-a: pokaži da su memorija fajlova i vektorska pretraga koda dva nezavisna sistema, svaki za svoj scenario; ključne reči: PAI.md, JSON fajl, SQLite, embedding, grep prioritet]
Lao Wang dalje pita: "Ako je fajl izvor istine, kako se osigurava ažurnost i konzistentnost?"
"Sa dve stvari. Konzistentnost se oslanja na jedan izvor istine: ista činjenica postoji samo u jednom fajlu, standardi projekta u projektnom fajlu, lične preference u korisničkom fajlu, izmena se radi samo na jednom mestu, nema dve kopije koje se međusobno sukobe. Ažurnost se oslanja na ponovno čitanje: fajl se ne drži kao stalni keš, pri svakoj izgradnji prompt-a se ponovo čita, šta je na disku, to model vidi. Cena je nekoliko dodatnih čitanja fajlova po krugu, tu malu potrošnju menjamo za determinizam, isplati se."
Lao Wang nastavlja: "A kako sprečiti da memorija postane sve haotičnija?"
"Tri kapije:"
- Ulazak se steže: u opisu alata koji čuva memoriju piše, poziva se samo kada korisnik izričito kaže "zapamti", "zabeleži", jednokratni zahtevi se ne čuvaju
- Filtriranje sadržaja: privremeni zahtevi koji počinju glagolima kao "pomozi", "kreiraj", rečenice sa "možda", "pretpostavljam" se direktno odbacuju
- Potpuno deduplikovanje: novi unos koji je potpuno isti sa postojećim se preskače
"Takođe, rezultati izvršenja alata se pre ulaska u memoriju skraćuju na 500 znakova, sprečavaju da jedan predugi izlaz razbije budžet."
04. Šta kada je memorija fajla prevelika
"Fajl sve veći kako se akumulira, čitanje celog svaki put ne može proći, šta onda?"
Rekao sam: "Ograničavam na dva nivoa. Na nivou fajla, tri sloja PAI.md nakon spajanja imaju ukupni limit od 24000 znakova, podržavaju referenciranje drugih dokumenata putem @putanja sintakse, referenciranje rekurzivno najviše 3 nivoa, i validira putanju da spreči izlaženje i kružne reference."
"Na nivou čitanja, alat koji čita fajlove podrazumevano čita 200 linija, limit 2000 linija, pri odsecanju na kraju rezultata vraća 'može offset=N nastaviti čitanje', neka model sam odluči da li želi da čita dalje. Veliki fajl nikada neće biti ubačen u kontekst u celosti."
[Screenshot: dvoslojno ograničenje velikih fajlova; stil: checklist-card; cilj screenshot-a: pokaži tri numerička ograničenja: ukupni limit 24000 znakova, 3 nivoa referenci, 200 linija podrazumevanog čitanja; ključne reči: 24000 znakova, rekurzivno 3 nivoa, 200 linija, offset nastavak]
05. Kako Agent poziva alate
Lao Wang menja pravac: "Kako Agent poziva alate? Kako procenjuje da li da pozove?"
"Standardni Function Calling proces, četiri koraka:"
- Registracija: svaki alat se definiše kao JSON Schema, sadrži ime, opis, tipove parametara i obavezna polja
- Odluka: pri pozivu modela schema lista se šalje zajedno sa porukama, model na osnovu opisa alata i poklapanja sa trenutnim zadatkom, sam odlučuje da li da pozove, koji, sa kojim parametrima, okvir ne odlučuje
- Izvršenje: model vraća toolCalls strukturu, okvir rutira na odgovarajući alat za izvršenje
- Povratni prenos: rezultat se dodaje kao tool poruka u istoriju razgovora, ulazi u sledeći krug petlje, dok model prestane da poziva alate i da konačan odgovor
"Kada jedan krug vrati više toolCalls, izvršavaju se sa 4 niti konkurentno, cela serija ima timeout 90 sekundi, niko nikoga ne blokira."
[Screenshot: jedan round-trip poziva alata; stil: swimlane; cilj screenshot-a: pokaži vremensku sekvencu tri strane: modela, okvira, alata; ključne reči: JSON Schema, toolCalls, tool poruka, konkurentno izvršenje]
Lao Wang dalje pita: "Pored Function Calling, ima li drugih načina poziva?"
"Ima dva. Jedan je MCP, alat se kači na eksterni servis, o tome kasnije. Drugi je ReAct JSON dogovor: ne oslanja se na izvorni toolCalls modela, u system prompt-u se dogovara da model može vratiti samo dve vrste JSON-a, ili tool_call ili final_answer, okvir parsira JSON i odlučuje da li da pozove alat ili završi. Za modele koji ne podržavaju izvorne pozive alata, ovaj put i dalje radi."
06. Kada poziv alata ne uspe, kako sprečiti beskonačnu petlju
"Šta kada poziv alata ne uspe? Da li će Agent tamo-tamo u krug?"
"Neuspeh se ne radi automatski retry, već se izuzetak pretvara u string koji model može da pročita, odbijena strategija, neuspeh izvršenja, timeout svaki ima svoju poruku, i vraća se kao rezultat alata. Model kada vidi informaciju o neuspehu, sam odlučuje da li da promeni parametre i pokuša ponovo ili da promeni alat."
"Za sprečavanje beskonačne petlje postoje tri sigurnosne mreže, ko prvi okine:"
- Detekcija stagnacije: 3 kruga zaredom potpuno isto ime alata i parametri, ocenjuje se kao beskonačna petlja, direktno izlazi
- Hard limit: 50 krugova ukupno prinudno prekida, sprečava hronično trošenje
- Token budžet: podrazumevano nije omogućen, za scenarije dugog konteksta se može eksplicitno konfigurisati
"U praksi najviše koristi prva. Ime alata i parametri se spoje u potpis radi poređenja, cena je skoro nula, a zaustavlja veliku većinu tamo-taro kruženja — tipičan simptom kada se model zaglavi je da stalno šalje istu poziv."
[Screenshot: uslovi okidanja triju sigurnosnih mreža; stil: checklist-card; cilj screenshot-a: pokaži detekciju stagnacije 3 kruga, hard limit 50 krugova, opcioni token budžet; ključne reči: detekcija stagnacije, 3 kruga istog potpisa, 50 krugova limit, token budžet]
07. Koji problem rešava MCP
Lao Wang klima glavom: "Malopre pomenut MCP, koji problem zapravo rešava?"
"Problem kombinacione eksplozije M aplikacija koje povezuju N alata. Bez MCP-a, svaka Agent aplikacija mora pojedinačno da piše kod integracije za svaki eksterni alat, količina posla je M puta N; MCP objedinjuje stranu alata kao server, stranu aplikacije kao client, količina posla pada na M plus N."
"U implementaciji to su tri stvari:"
- Transportni sloj: lokalni alati preko stdio podprocesa, remote preko Streamable HTTP, u konfiguraciji command je prvi, url je drugi
- Protokolni sloj: JSON-RPC 2.0, klijent koristi auto-inkrementalni id da označi zahtev, drži ConcurrentHashMap za nedovršene zahteve, vrednost je CompletableFuture, odgovor se po id uparuju i dovršava
- Rukovanje: prvo se šalje initialize zahtev za razmenu verzije protokola i liste sposobnosti, zatim initialized notifikacija, i tek onda se može povući lista alata
"MCP alati koji se povuku se dodaju prefix servisa radi izolacije imenovanog prostora, sprečavajući preklapanje sa ugrađenim alatima, a zatim se spajaju u jednu listu i predaju modelu. Server promena alata šalje list_changed notifikaciju, klijent automatski ponovo gradi listu alata, ne zahteva restart."
[Screenshot: slojevita implementacija MCP-a; stil: whiteboard; cilj screenshot-a: pokaži transportni, protokolni, handshake sloj i putanju integracije alata u glavnu listu; ključne reči: stdio, Streamable HTTP, JSON-RPC 2.0, imenovani prostor]
08. Kada se kontekstni prozor napuni, kako kompresovati
"Šta kada se kontekstni prozor napuni?"
"Prvo o vremenu okidanja. Prag kompresije nije određen napamet, izveden je iz veličine prozora modela: prozor minus 20000 tokena rezervisano za sažeti izlaz, minus 13000 tokena bafera, dobija se linija okidanja, i pritom se osigurava da prag ne pada ispod polovine prozora. Promena modela ne zahteva promenu konfiguracije, prag prati prozor automatski."
"Postoje dva načina kompresije. Jedan je Map-Reduce sažimanje: zadržava poslednja 3 kruga razgovora, starije poruke se grupišu u parčad od 5, svako se kompresuje na ispod 200 znakova, pa se spajaju u jedan opšti sažetak i ubacuju u kontekst. Drugi je kompresija pre slanja: pre svakog poziva modela proverava lista poruka koje će biti poslate, ako prelazi liniju kompresuje se u system poruku, jedan sažetak istorije, plus kompletne poruke poslednja 3 korisnička kruga."
Lao Wang dalje pita: "Zašto dva seta?"
"Jer u ranoj fazi postojao je samo prvi, on kompresuje meru interne memorije, lista poruka koja se zaista šalje modelu nije postajala kraća, prozor je i dalje pukao. Drugi set je zakrpa za taj problem, objekat kompresije je direktno lista poruka koja se šalje, tek tada se zaista štedi token."
"Ovde postoji još jedna zamka u koju se lako upadne: tačka preseka mora pasti na granicu korisničke poruke. tool_call i tool_result su upareni protokol, ako se preseče iz sredine, ostavi polovinu, sledeći zahtev API direktno odbija."
Lao Wang se približio: "Ova zamka ovako konkretno, zaista si je iskusio."
[Screenshot: izvođenje linije okidanja kompresije; stil: data-board; cilj screenshot-a: pokaži prozor minus 20000 minus 13000 dobija prag, donja granica polovina prozora; ključne reči: prag okidanja, 20000 rezerva, 13000 bafer, polovina prozora]
[Screenshot: kartica projekta iz biografije; stil: skill-card; cilj screenshot-a: pokaži strukturu pakovanja PaiCLI projekta u biografiji, ime, sažetak, tech stack, ključne odgovornosti; ključne reči: PaiCLI, tech stack, ključne odgovornosti, kvantifikovani podaci]
Do ovde, lanac pitanja iz gornje polovine se završava. Ovaj projekat u biografiji se može ovako zapakovati:
Naziv projekta: PaiCLI Kratak opis: Java Agent command line alat napravljen prema Claude Code-u Tech stack: Java, OpenAI kompatibilni API, MCP, JSON-RPC 2.0 Ključne odgovornosti:
- Na osnovu Function Calling-a implementirao ReAct glavnu petlju, podržava 4-nitno konkurentno izvršenje više alata u jednom krugu, batch timeout 90 sekundi
- Dizajnirao trojnu memoriju fajlova i kratkoročnu/dugoročnu dvosturu memoriju razgovora, dugoročna memorija izolovana po scope-u projekta, pre upisa filtracija deduplikacije
- Implementirao detekciju stagnacije i 50-krugog hard limita duplog mehanizma protiv beskonačne petlje, 3 kruga istog potpisa poziva se topi
- Integrisao MCP protokol, podržava stdio i Streamable HTTP dupli transport, lista alata se dinamički vruće ažurira sa notifikacijama
- Implementirao adaptivnu dvostepenu kompresiju konteksta prema veličini prozora, tačka preseka čuva granicu korisničke poruke, osigurava da poruke poziva alata budu uparene i kompletne
Kompletna implementacija je na GitHub-u, zainteresovani prijatelji mogu da prelistaju izvorni kod, ovde neću zauzeti prostor.
[Screenshot: Agent intervju lista pitanja; stil: checklist-card; cilj screenshot-a: sažetak lanca 11 pitanja, kao spremnu checklistu za samo-proveru; ključne reči: arhitektura memorije, poziv alata, MCP, kompresija konteksta, Multi-Agent]
09. Kako saradjuju Multi-Agent sistemi
Lao Wang konačno lista do donje polovine: "Oh, zaista i drugi. Platforma za orkestraciju radnog toka? Kako sarađuju Multi-Agenti?"
"Prvo da priznam granice: PaiAgent nije arhitektura u kojoj više Agenata sedi i pregovara, to je orkestracija radnog toka zasnovana na čvorovima, po ideji slično Dify i n8n. Mogao bih da lažem da je to autonomni pregovor više agenata, ali nakon dva pitanja bih morao da priznam da te arhitekture ne znam ništa, bolje od početka da kažem istinu. Platforma ima preko dvadeset vrsta čvorova, model čvor, uslovna grana, pretraga baze znanja, web pretraga, multimodalna generacija, od kojih je jedan ReAct Agent čvor, interno sa sopstvenom petljom alata, podrazumevano maksimalno 5 koraka, konfigurabilni limit 20 koraka."
"Ono što se zove saradnja je povezivanje ovih čvorova u usmereni aciklični graf (DAG): nakon topološkog sortiranja se izvršavaju po redosledu, uslovni čvor bira granu prema pravilu polja, grana koja nije izabrana se cela preskače nizvodno. Konstrukcija grafa koristi LangGraph4j StateGraph, dodaj čvorove, dodaj ivice, kompajliraj, izvrši; uslovne grane i nastavak od prekida tačke su u drugom samostalnom DAG engine-u, dva engine-a se preklapaju prema konfiguraciji radnog toka."
[Screenshot: orkestracija čvorova radnog toka; stil: whiteboard; cilj screenshot-a: pokaži čvorove povezane u DAG, uslovne grane, logiku preskakanja neizabranih grana; ključne reči: DAG, topološko sortiranje, uslovna grana, ReAct čvor]
10. Kako se prenosi kontekst i status zadatka između Agenata
"Kako se upravlja kontekstom između čvorova? Kako se prenosi status zadatka?"
"Deljenje stanja je u suštini Map, sa nekoliko fiksnih ključeva. Jedan ključ čuva trenutni ulaz, svaki čvor nakon izvršenja prepisuje svoj izlaz u njega i prosleđuje nizvodno; drugi ključ je tabela izlaza čvorova, po id čvora čuva istoriju izlaza, nizvodni čvorovi mogu referencirati rezultat bilo kog prethodnika. Nema izolaciju na nivou polja, to je niska kompleksnost kupljena pojednostavljenjem dizajna."
"Perzistencija ide preko snapshot-a: pre i posle svakog čvora se piše jedan snapshot u bazu, beleži ulaz, izlaz, stanje, trajanje, broj pokušaja, serijalizacija je JSON. Nastavak od tačke prekida se gradi na snapshotu, pri oporavku se pronalazi čvor sa statusom FAILED kao početna tačka, izlazi uspešnih čvorova se direktno deserijalizuju iz snapshota, ne moraju ponovo da se izvršavaju."
Lao Wang pita dalje: "Kako je urađen RAG u čvoru za pretragu baze znanja?"
"Dokument se seče na blokove od 800 znakova, između blokova preklapanje 100 znakova, embedding i original se zajedno ubacuju. Pri upitu se računaju dva rezultata, kosinusna sličnost vektora i match ključnih reči, uzima se veća vrednost za hibridno ocenjivanje, podrazumevano vraća top 5, prag sličnosti 0.2. Takođe da iskreno kažem, ovo je implementacija u memoriji, pri pretrazi se računa sličnost preko cele tabele, kad podaci porastu treba preći na profesionalno rešenje, kao pgvector ili Elasticsearch."
[Screenshot: prenos stanja čvora i snapshot; stil: swimlane; cilj screenshot-a: pokaži prepisujući prenos trenutnog ulaza, tabela izlaza čvorova potpuno vidljiva, odnos snimanja i nastavka od prekida; ključne reči: trenutni ulaz, tabela izlaza čvorova, snapshot izvršenja, nastavak od prekida]
11. Kako kvantifikovano oceniti efekat Multi-Agenta
Lao Wang baca poslednje pitanje: "Kako kvantifikovano oceniti da li radni tok radi dobro?"
"Na ovo pitanje pola odgovaram. Već sprovedeno su metrike izvršnog sloja: trajanje svakog čvora, ulazni i izlazni token svakog poziva modela, sve ide u bazu sa snapshot-om, trošak jednog izvršenja je jasan."
"Ono što još nije urađeno je evaluacija kvalitativnog sloja, agregacija stope uspeha i ocena modela su u planu. Ideja je da se snapshot podaci iskoriste za poređenje izvršenja: isti radni tok pre i posle izmene se pokrene jednom, uporedi razliku u broju uspešnih čvorova, neuspešnih čvorova, ukupnog trajanja, prvo kontrolisati regresione probleme; zatim jedan nivo više, uzorak ulaza i izlaza čvora se da jednom jakom modelu da oceni prema standardu, radi automatizovanu kvalitativnu kontrolu."
Lao Wang zatvara biografiju, smeši se: "Važi, oba projekta mogu da se razgovara do nivoa implementacije. Onu početnu rečenicu povlačim, donja polovina zaista vredi pogledati."
[Screenshot: data board metrika izvršenja; stil: data-board; cilj screenshot-a: pokaži da su trajanje čvora i potrošnja tokena sprovedeni, stopa uspeha i ocena modela još uvek u izgradnji; ključne reči: statistika trajanja, potrošnja tokena, stopa uspeha, ocena modela]
ending
Ranije se na intervjuu takmičilo ko bolje bubao teorijska pitanja, sada moramo da razumemo memoriju, pozive alata, protokole, inženjerstvo.
[Trebalo bi naučiti sve više i više stvari, ali dokle god se projekat zaista produbi, svako pitanje se može iskopati jednom lopatom do implementacionog sloja, lanac pitanja više nije pritisak, već prilika da pokažemo samopouzdanje.]
Imamo priliku da stojimo na talasu razvoja AI-a, sopstvenim rukama pretvorimo Agenta iz igračke u proizvod, učestvujemo u najuzbudljivijoj tehničkoj promeni ovog doba. Iako izazova nije malo, puna je i neograničenih mogućnosti.
Držite se, braćo i sestre.
Vidimo se u sledećem.
