Zaposleni u ZTE: preselio se iz Huawei-ja u ZTE, ranije nije mogao da razume, dok nije upoznao jednog nivoa 14 koji je došao na odmor, pa saznao da se AI u ZTE razvija ovako dobro (uz pitanja sa intervjua za Agent)
Kao što stoji u naslovu, ni ja ranije nisam mogao da razumem, mislio sam da je Huawei nosilac u oblasti telekomunikacija.
Dok na WAIC-u nisam video ZTE-ov prikaz prvog na svetu AI pametnog telefona sa agentom, korisnik samo kaže jednu rečenicu i AI izvršava složene zadatke između aplikacija.
Pretraživanje informacija između aplikacija, rezervacija hotela, rezervacija karata, slanje poruka, poređenje, bez otvaranja jedne po jedne aplikacije.
Nije samo ubacivanje velikog modela u govornog asistenta, već uključuje, na primer, multimodalno fuziono razumevanje namere + GUI percepcija + planiranje višekoračnih zadataka + izvršenje između aplikacija + sigurnosne granice.
Kompletan inženjering pametnog agenta.
Drugim rečima, ulazak u AI stazu ne zahteva fokusiranje samo na AI kompanije na vrhu (Zhipu, Kimi, Alibaba, Tencent), ZTE kao tradicionalna industrija velika kompanija u transformaciji u AI eri je takođe dobar izbor.

O ovome neću više da pričam, da ne pomislite da sam ZTE-ov mali hvaliser, zapravo samo želim da vam dam još jednu perspektivu za gledanje na ove tradicionalne stare velike kompanije (usput delim neka pitanja sa intervjua za AI Agent, čista javna dobrobit).
Naravno, ne morate se fokusirati samo na modele i algoritme.
Back-end servis pametnog agenta, orkestracija zadataka, poziv alatki, deploy modela, OS interakcija na klijentu, izvršenje između aplikacija, pravci sigurnosti u pogledu dozvola, privatnosti, kontrole rizika, stabilnost dugih zadataka u pravcu testiranja — sve su to pravci vredni jurnjave.
U eri AI-ja, promene su prevelike, bilo za pojedinca ili kompaniju.
Ali jedno se nije promenilo, ti i ja moramo obezbediti sebi mesto pod suncem u ovoj eri, neka drugi ne pojedu sve.
Ako si neko ko veruje u napore, veruje u proces, veruje u korak po korak, veruje da možeš da zauzmeš mesto u eri AI-ja, onda sledeća teška ispovest intervjua, nadam se da ćeš je ozbiljno pročitati.

(Ceo tekst je prilično intenzivan, garantujem da ćete naučiti mnogo, vežite sigurnosne pojaseve, idemoooo.)
content
PS: PaiCLI je terminal Agent sličan Claude Code-u, otvorenog koda. Ako želiš iskustvo sa Agent projektom, možeš referencirati.

GitHub: https://github.com/itwanger/PaiCLI-Python
01. Kako je sastavljen šablon prompt-ova?
Stari Wang uze biografiju sa stola, baci pogled, posle čitanja okrene biografiju naopačke i stavi je na sto, gleda me kroz centar debelih naočara:
„U Agent projektu koji si ranije radio, kako je sastavljen šablon prompt-ova? Odjednom spojiš ili slojevito?”
„Spojeno po fiksnom redosledu.”

„Prva četiri sloja su statična — definicija identiteta, stil ličnosti, set instrukcija režima izvršenja, strategija odobrenja, tokom cele sesije se ne menjaju. Poslednjih pet slojeva su dinamična — kontekst izvršavanja, memorija projekta, Skills indeks, strategija kompresije, instrukcije za završetak, ažuriraju se svake runde.”
„Jezgro je jedna stvar: statički sadržaj ide na samom početku. Prompt Caching pogađa po najdužem zajedničkom prefiksu, što je prefiks stabilniji to je veća stopa pogotka keša, trošak tokena se može smanjiti skoro za red veličine.”
02. Jedan Agent ili više Agent-a? Kako tačno podele pod-Agent-e?
„Podrazumevano jedan Agent.”
„ReAct petlja rešava većinu zadataka — LLM odlučuje, poziv alatke, posmatranje rezultata, ponovna odluka. Kompleksni zadaci imaju dve putanje nadogradnje.”

„Plan-and-Execute je prvo planiranje pa izvršenje. Planer izbacuje grafikon zadataka sa zavisnostima, radi po topološkom sortiranju u grupama, pri neuspehu tokom rada okida preplaniranje.”
„Tim režim je trostruka ulogna kolaboracija. Planer samo izbacuje plan i ne dira alatke, Worker radi sa kompletnim setom alatki, pregledač proverava isporuku, ako nije na nivou vraća na prepravku, najviše dva puta.”
„Ključno je razdvajanje uloga — planer i pregledač ne diraju alatke, pravo na izvršenje alatki je koncentrisano u Worker-u. Pregledač sam ne menja kod, sam ne pregleda.”
03. Koji je princip statistike pokrivenosti grana?
Pošto sam završio arhitekturu, stari Wang pogleda sat — ne izgleda kao da gleda vreme, više kao da pokazuje svoj blještavi Rolex.
„Promenimo pravac. Koji je princip statistike pokrivenosti grana?”
„Princip je instrumentacija koda. Na svakom čvoru grane — if/else, switch/case, try/catch, trojni izraz — ubaci se brojač. Nakon testa se statistikom utvrdi koje grane su izvršene, koje nisu. Pokrivenost je broj izvršenih grana podeljen sa ukupnim brojem grana.”

Kako je implementirana instrumentacija koda?
„Dve putanje.”
„Instrumentacija na nivou izvornog koda je AST prepisivanje — pre kompilacije se ubaci kod sonde u izvorni kod. Istanbul ide tim putem, alati za pokrivenost za JavaScript i TypeScript su uglavnom zasnovani na njemu.”
„Instrumentacija na nivou bajtkoda radi nakon kompilacije sa bajtkodom. JaCoCo koristi Java Agent da dinamički utka sondu pri učitavanju klase, ne dira izvorni kod, za programere potpuno transparentno.”

„Nivo izvornog koda je univerzalan za različite jezike, nivo bajtkoda ne dira izvorni kod.”
04. Da li si radio analizu koda prethodno? Kako procenjuješ validnost koda?
„Radio sam. Pre nego što se kod da modelu, prvo se radi analiza.”
„Prvi korak AST analiza, potvrda celovitosti sintakse — datoteke čija analiza pada se preskaču, da se ne troše tokeni. Drugi korak analiza zavisnosti, iz AST-a se izvlače svi eksterni pozivi — operacije nad bazom, HTTP zahtevi, čitanje i pisanje datoteka — koje će kasnije trebati za generisanje Mock-a. Treći korak ekstrakcija potpisa interfejsa — ime metode, tipovi parametara, tip povratne vrednosti, deklaracija izuzetaka, to je osnovni ulaz za model pri generisanju koda za testiranje.”

„Procena validnosti ima tri uslova: sintakta se može analizirati, ključne zavisnosti su dostupne, potpis metode je kompletan. Tek kada sva tri prođu ide u red za generisanje.”
Kako dizajnirati indikatore optimizacije?
„Slojevito.”
- Prvi sloj stopa prolaska kompilacije — da li generisani kod za testiranje može da se kompilira
- Drugi sloj stopa prolaska pri radu — ako kompilacija prođe, da li pri radu javlja greške
- Treći sloj inkrement pokrivenosti — za koliko se povećala pokrivenost grana nakon testa
- Četvrti sloj kvalitet tvrdnji — tvrdnje zaista proveravaju poslovnu logiku, a ne assertNotNull radi broja

05. Kakav kod smanjuje tačnost generisanja jediničnih testova?
„Nekoliko tipova je posebno teško.”
„Visoka sprega — jedna metoda poziva pet-šest eksternih servisa, Mock lanac je predug, generisani kod za test verovatno ne može ni da se kompilira.”
„Zavisnost od globalnog stanja. static promenljive, singleton obrazac, ThreadLocal, stanje se međusobno kontaminira između testova.”

„Refleksija i dinamički proxy. AST vidi samo statičke odnose poziva, metode pozvane preko refleksije pri izvršenju, analiza zavisnosti ih uopšte ne otkriva.”
„Asinhroni callback-i su takođe teška zona.”
Kako filtrirati ono što AST i LSP ne mogu da reše?
„Bodovanje. Za svaku metodu se izračuna ocena testabilnosti.”
„Ulazne dimenzije: broj eksternih zavisnosti, dubina ugnježđenosti, da li koristi refleksiju, da li ima asinhroni poziv, ciklomatska složenost metode. Sumirano sa ponderima, metode ispod praga se označavaju kao 'ne preporučuje se automatsko generisanje', preskaču se.”

„Prag nije proizvoljno postavljen. Posle nekog vremena se kalibrira stvarnim rezultatima — visoka ocena ali generisanje pada, analiziraj uzrok, podesi pondere.”
06. Ako je model zbog prekomerne kompresije na lošijem nivou, kako to otkriti i obraditi?
Stari Wang ponovo okrene biografiju, baci pogled na iskustvo projekta u njoj, kao da proverava da li se moje ranije reči poklapaju sa biografijom.
„Kako da otkriješ. Nakon svake grupe zadataka generisanja automatski se upoređuje kvalitet izlaza te grupe. Najneposredniji indikator je stopa prolaska kompilacije — ako je niža od istorijskog proseka za više od 15%, velika je verovatnoća da je ulazna kompresija preterana, modelu ponuđeno nedovoljno informacija o kodu.”

„Obrada se deli u dva koraka. Prvi korak označavanje nekompresivnih zona — potpis metode, jezgro poslovne logike, ključne deklaracije zavisnosti, kompresija tu znači propast. Ono što se može kompresovati su import liste, komentari, getter/setter takav šablonski kod.”
„Drugi korak dinamičko podešavanje odnosa kompresije. Ciljni broj tokena se postavlja kao opseg, ne fiksna vrednost. Ako je ova grupa pala u kvalitetu, sledeća grupa automatski proširuje budžet tokena, žrtvuje se malo troška za povratak kvaliteta.”
07. Kako je implementiran Mock mehanizam?
„Kako je implementiran Mock mehanizam?” Stari Wang podiže šoljicu čaja i otpuhne toplotu, pita veoma opušteno.
„U tri koraka.”
„Prvi korak identifikacija zavisnosti. AST analiza izvlači sve eksterne pozive iz tela metode — operacije nad bazom se gledaju u anotacijama JPA Repository ili MyBatis Mapper, HTTP zahtevi u RestTemplate ili WebClient, operacije sa datotekama u reference java.io i java.nio.”

„Drugi korak izbor strategije. Pozive baze koristi @MockBean uz when/thenReturn, HTTP pozive koriste WireMock za podizanje lokalnog servisa, operacije sa datotekama koriste @TempDir. Za svaki tip zavisnosti jedan šablon.”
„Treći korak ubrizgavanje. Mock deklaracije i setup kod se nalepe u @BeforeEach, model samo piše logiku tvrdnji.”
„Najlakše je naleteti na problem granule. Mock previše grubo, test ne pokriva stvarnu poslovnu logiku; Mock previše fino, troškovi održavanja eksplodiraju. Princip je Mock-ovati samo pozive između procesa — bazu, mrežu, fajl sistem. Zavisnosti unutar procesa koriste što je moguće više stvarne objekte.”
08. Kako su Skills implementirani na dnu?
„Progresivno otkrivanje, učitavanje u tri sloja.”
„Sloj indeksa sadrži samo ime Skill-a i jedan opis, drži se ispod 4KB. Model vidi indeks, procenjuje koji Skill trenutni zadatak zahteva, poziva load_skill alatku da učita kompletno uputstvo.”

„Nakon učitavanja gura se u LRU bafer, istovremeno drži najviše 3 Skill-a, višak se izbacuje po najduže nekorišćenom. Bafer se pre sledećeg LLM poziva ubacuje odjednom u korisničku poruku, nakon ubacivanja se briše.”
Zašto ne odjednom sveopterećeno učitavanje?
Što je system prompt duži, to je stopa pogotka Prompt Caching niža. Većina razgovora koristi samo jedan ili dva Skill-a, sveopterećeno učitavanje znači da korisnik plaća troškove tokena za Skill-ove koje ne koristi.
09. Šta je zapravo ulaz koji se daje modelu?
Stari Wang iznenada skide naočare, drži ih za temple, nastavlja da pita. „Koliko poznaješ osnovu LLM-a? Šta je zapravo ulaz koji se daje modelu, možeš li to jasno reći?”
„Tekst prvo prolazi kroz Tokenizer. Tokenizer ne seče po znaku ili po reči, već po podreči (Subword) — BPE algoritam na osnovu statistike učestalosti u korpusu za obuku, visokoučestale reči se zadržavaju cele, niskoučestale se razbijaju na manje delove. Nakon sečenja, svaki deo odgovara jednom Token ID-u.”

„Token ID ide da potraži Embedding tabelu, svaki ID se mapira u visokodimenzionalni vektor.”
„Zatim se dodaje poziciono kodiranje. Embedding sam po sebi ne nosi informaciju o poziciji, model ne zna da li se reč pojavljuje na početku ili na kraju rečenice. RoPE ugrađuje pozicionu informaciju u vektor.”
„Konačno ovaj niz visokodimenzionalnih vektora ulazi u Transformer višeslojni Self-Attention i FFN. Model ne vidi dva znaka 'zdravo', već dva visokodimenzionalna vektora.”
10. Zašto QKV mora ovako da se podeli? Kako se računa?
„Embedding vektor svakog token-a se posebno pomnoži sa tri matrice težina W_Q, W_K, W_V, generišući tri vektora Query, Key, Value.”

„Q i K na svim pozicijama daju skalarni proizvod, dobija se attention skor. Deli se sa √d_k radi skaliranja — da se spreči prevelika vrednost skalarnog proizvoda koja dovela do toga da softmax izlaz bude blizu one-hot, nestanak gradijenta. Nakon softmax normalizacije, tom distribucijom verovatnoće se sve V ponderisano sumiraju, dobija se izlaz trenutnog token-a.”
„Q je 'šta tražim informaciju', K je 'šta upit mogu da podudarim', V je 'šta se zaista prenosi kada se podudari'. Jedan vektor istovremeno radi tri stvari, može da računa samo samosličnost, ograničene izražajne moći. Tri nezavisne matrice težina, 3 puta više parametara koji se mogu naučiti.”
Da li je vektor istog token-a na različitim pozicijama isti?
„Nije isti. RoPE na osnovu pozicije token-a radi rotacionu transformaciju Q i K, ugao rotacije je proporcionalan poziciji. Isti znak 'de' koji se pojavi na petoj poziciji i na pedesetoj, ima različit smer vektora.”

Scenarijska pitanja
11. Zašto paralelizovati prepoznavanje namere? Kako je konkretno implementirano?
Stari Wang ponovo stavi naočare. Mislio sam da je skoro kraj, počeo sam u glavi da pregrtavam kako sam odgovorio. On podiže šoljicu čaja i otpije gutljaj, ne žuri.
„Još dva scenarijska pitanja.” Vraća šoljicu na ugao stola, „paralelizovano prepoznavanje namere poznaješ? Zašto paralelizovati?”
„Tradicionalno prepoznavanje namere je serijsko — prvo klasifikuj nameru, zatim izdvoji entitet, zatim proceni domen, zatim oceni hitnost. Sledeći korak čeka prethodni.”

„Ali ako između nekoliko dimenzija nema odnosa zavisnosti. Klasifikacija namere ne mora da čeka rezultat ekstrakcije entiteta, procena domena ne zavisi od hitnosti. Postanu paralelni zadaci pa je gotovo.”
„U implementaciji, svaka dimenzija se definiše kao nezavisan klasifikator, izvršava se konkurentno sa CompletableFuture, nakon što se svi vrate na sloju rutiranja spajaju rezultati.”
12. Da li si radio To-Do List mehanizam?
„Radio sam. To-Do List daje modelu strukturirano praćenje zadataka.”
„LLM u dugom razgovoru lako pada u dva problema: zaboravi šta je ranije uradio, ponavlja operacije; preskoči neki korak, ode pravo na kraj. To-Do List eksplicitno izlista 'završeno' i 'za uraditi' korake, ubaci se u kontekst svake runde, model vidi trenutni napredak, prirodno zna šta dalje.”

Zašto čini model fokusiranijim?
„Mehanizam pažnje modela vrši ponderisanje nad celim kontekstom. Što je razgovor duži, rane informacije se više razblažuju. To-Do List se u svakoj rundi pojavljuje na najnovijoj poziciji konteksta, prirodno zauzima visok položaj u težini pažnje.”

„Način sprovođenja je da se To-Do List tretira kao posebna sistemska poruka, ažurira pre svakog LLM poziva. Nakon što model završi korak, poziva update_todo da ga označi kao završen, novi koraci se takođe mogu dinamički dodavati.”
ending
Ranije su intervjui bili borba oko konceptualnog nabacivanja, pamćenje konkurentnosti, midlver-a, obrazaca dizajna. Sada intervjuista pita kako se slaže prompt, kako se statistikom pokriva grana, kako se automatski generiše Mock, zašto QKV ide u tri.
[Tehnički stek se menja, ali osnovna sposobnost nije se promenila — napraviti stvar, stabilno je, dovesti do produkcijski upotrebljivog, takva sposobnost je uvek retka.]
AI upravo prekraja mapu sposobnosti inženjera, taj proces je tek počeo.
Držite se, braćo i sestre.
Vidimo se u sledećem.
