
Deo 1 od 3 — „Memorija za AI agente” Razlažemo mit o long-term memory u LLM sistemima
3 ujutru. Treća noć debag-ovanja AI agenta. Stojim u kuhinji sa šoljom čaja, gledam u diff i tiho psujem. Agent je samouvereno prepisao auth funkciju — na osnovu chunk-a koji pripada grani obrisanoj iz repozitorijuma pre dva meseca.
Chunk živi u Qdrant-u. Cosine sličnost sa mojim upitom je visoka. Top-1 u retrieval-u. Agent ga je pošteno uzeo, pošteno ušio u prompt, pošteno generisao „ispravan” patch. Protiv koda iz druge realnosti.
Zatvaram laptop i mislim: okej, imam RAG. Imam vektore. Imam long-term memory. Imam sve što svaki AI konferencijski deck obećava poslednje dve godine. Zašto je moj agent upravo predložio fix za kod koji više ne postoji?
Zato što moj agent nema memoriju. Moj agent ima rezultate pretrage sa cosine umesto BM25. I između te dve rečenice leži cela razlika između „AI kojem možeš verovati u produkciji” i „AI iza kojeg moraš da paziš na svakoj liniji.”
Ovaj tekst je o toj razlici. I o tome zašto smo mi, inženjeri, krivi što to više ne vidimo.
Devalvacija reči „memorija”
Budimo iskreni. Šta je tipična „memorija” AI agenta u 2026?
tekst → podela na chunkove 512-1024 tokena
→ embedding (bge / text-embedding-3 / openai)
→ vector DB (Qdrant / pgvector / Chroma / Pinecone)
→ cosine similarity top-k
→ konkatenacija u prompt
Ovo nije memorija. Ovo je pretraga. To je stari Lucene iz 2003., prefarban u nervne boje. Cosine umesto TF-IDF. Embeddings umesto inverted indexa. Ista stvar.
Da to tako i zovemo — „vector search,” „semantic retrieval” — ne bih imao primedbu. Zovi Lucene Lucene, nema problema. Ali kad se to prodaje pod barjakom „moj AI ima long-term memory” — izvini. Moj AI ima istovremeno déjà vu i amneziju.
Ovo nije terminološka pritužba. Ovo je pitanje očekivanja. Kad inženjer čuje „memorija,” zamišlja sistem koji pamti: ko je šta rekao, kad, u kom kontekstu, šta je tad bilo tačno naspram šta je sad tačno. Kad inženjer dobije RAG, dobije Ctrl+F. I umesto da gradi iskrenu arhitekturu oko tog Ctrl+F — sa iskrenim ograničenjima — gradi zamak od peska i čudi se zašto agent meša prošlost sa sadašnjošću.
Tri rupe kroz koje može da prođe kamion
Tri konkretna propusta. Svaki sam ulovio u produkciji. Nije teorija.
Rupa #1: Chunk ne zna da je chunk.
Uzmi sasvim normalnu deklaraciju iz design dokumenta:
„Prešli smo na JWT jer opaque sesije nisu mogle da skaliraju za naš profil saobraćaja. Alternativa su bile stateful sesije sa Redis klasterom, ali smo ih odbacili zbog audit zahteva klijenta — ne dozvoljava state sesija van perimetra. JWT rešava oba, ali dodaje kompleksnost invalidacije, koju ublažavamo kratkim TTL-om i refresh tokenima.”
Chunker ovo deli na četiri komada od 512 tokena. Pri retrieval-u dolazi upit: „zašto smo izabrali JWT?” Top-3 vraća tri fragmenta iste odluke. Bez kauzalnosti. Bez alternative koju smo odbacili. Bez trade-off-a koji smo prihvatili.
Odluka koja je bila celovita pretvara se u tri paralelne „činjenice”. Model ih pošteno spaja u uverljiv tekst — i izmišlja veze koje nedostaju. Jer mu je posao da generiše uverljiv tekst. I to će uraditi, bez treptanja.
Ovo nije bug u chunker-u. Ovo je arhitektonska osobina celog pristupa. Svaka deklaracija odluke biva mlevena u prah i ponovo sklapana sa strukturnim gubicima. Svaki put.
Rupa #2: U memoriji nema strukture. Samo cosine.
Kad ti čovek objašnjava projekat, on kaže:
- evo cilja
- evo opcija koje smo razmatrali
- evo šta smo izabrali i zašto
- evo šta se polomilo dva meseca kasnije
- evo šta smo promenili, i ta odluka sada zamenjuje staru
U RAG-u ništa od ovoga ne postoji. Nula. RAG ne razlikuje „hipotezu,” „potvrđenu činjenicu,” „odbačenu alternativu,” „deprecated odluku premeštenu u arhivu.” Za RAG, sve su to ekvivalentne tačke u 384-dimenzionalnom prostoru.
Zamisli da pokušavaš da snimiš trideset godina života u jednu ravnu tabelu entries(text, vector) i onda je pretražuješ po cosine. Iznenađen što ti se sećanja zamagljuju? To nije tvoja memorija što popušta. To je struktura u koju si je nabio — struktura koja ne dozvoljava razlikovanje između „razmišljao sam o tome” i „uradio sam to,” između „probao sam i radilo je” i „probao sam i bolelo je.”
U RAG-u ne postoje polja za ove razlike. Ne zato što developeri nisu mislili na to. Zato što sama paradigma vektor-plus-distanca ne smešta kauzalnost i vreme. To je matematičko ograničenje. Ne popravlja se product features-ima.
Rupa #3: Vreme ne postoji kao first-class koncept.
Pre tri nedelje sam u memoriju agenta zapisao: „koristimo Postgres.” Danas sam zapisao: „prešli smo na ClickHouse za analitiku, Postgres je sada samo OLTP.” U RAG-u obe činjenice tu sede. Obe imaju visok cosine prema upitu o bazi. Top-k vraća obe. Model bira onu koja „zvuči” bolje u svom pretrain-u — obično Postgres, jer se češće pojavljuje u trening podacima.
Ovo nije memorija. Ovo je rulet prerušen u sigurnost.
Kad si poslednji put video polja valid_from, valid_until, deprecated_by, replaced_by, superseded_by u produkcijskom RAG sistemu? Ja nikad. Jer u standardnom RAG-u, nisu u shemi. I opet — ne zato što su devovi lenji. Zato što shema „text plus embedding” nema mesto za lifecycle znanja. Bez pojma „ovo je tačno sada” naspram „ovo je bilo tačno tad.” Sve se kolapsira u jedan vremenski presek — sadašnjost koja nekako sadrži juče, prošlu godinu i deprecated-pre-tri-kvartala u isto vreme.
Ctrl+F sa embeddings-ima ne pamti. On nalazi. Različiti glagoli.
„Ali memory framework-ovi to popravljaju, zar ne?”
Okej, kaže verujući. Postoji mem0, Letta, Zep, Cognee, MemGPT, ceo zoološki vrt long-term memory. Dodali su sloj smisla iznad RAG-a. Memory-aware su.
Budimo iskreni. Koristio sam ih. Jednog za drugim. Dugo. Gledao ispod haube, ne samo landing stranice.
Svaki od njih uzima jedan komad prave memorije — kod nekih je to LLM-ekstrakcija pre upisa, kod nekih buffer hijerarhija kao kod OS-a, kod nekih post-hoc graph ekstrakcija iz dijaloga, kod nekih per-fact temporal validity — i implementira tu jednu stvar, bez upletanja u ostalo.
To je toplije od vanilla Qdrant-a. To nije rešenje.
Jer prava memorija zahteva sedam osobina koje rade zajedno. Svaka od njih, izolovano, već postoji u literaturi ili u open source-u. Koliko mogu da kažem, niko nije sklopio svih sedam u jedan sistem. Kojih sedam tačno — to je deo 2 ove serije. Ovde, samo ograničenje koje ujedinjuje sva flat-fact rešenja, kako god se obavijala:
Nijedno od njih nema pravo da kaže „ne znam.”
Pokaži mi bilo koji od ovih sistema sa formalnim abstain mehanizmom: vratima kroz koja činjenica neće proći u prompt kontekst ako nema izvor, nema confidence, nema temporal validity, ili nerešenu kontradikciju. Sačekaću.
U standardnom flow-u svih ovih framework-a, odgovor sistema na „u memoriji je kontradikcija ili nema dovoljno podataka” je „pa, model će već da se snađe.” Što se prevodi sa marketinškog na inženjerski kao „model će halucinirati, i to postaje tvoj problem u produkciji.”
Dobra memorija nije „pamtiti puno.” To je znati granicu onoga što ne pamtiš. Deo 2 ove serije izgrađen je oko te teze.
„Zašto jednostavno ne push-ovati kontekst do 1M tokena?”
Ovo je druga moda poslednje dve godine, i zaslužuje svoje razlaganje, jer vodi industriju u istu slepu ulicu pod drugačijim barjakom. „Zašto nam treba memorija ako Gemini ima 2M kontekst, Claude ima 1M?”
Četiri problema, bez preambule.
Jedan — ekonomija. Jedan projektni razgovor od 800K tokena sa isključenim prompt cache-om košta desetine dolara po zahtevu. Bez agresivnog cache-ovanja, bankrotirao si za nedelju. Sa agresivnim cache-ovanjem, gradiš tačno istu hijerarhiju kao Letta — samo skuplje i zaključano za jednog vendora.
Dva — recall. Svaki long-context benchmark (NIH, Ruler, LongMemEval) pokazuje istu stvar: modeli utapaju se u sopstvenom kontekstu posle 200-300K tokena. Pažnja je nejednako raspoređena. Ovo je lost-in-the-middle, i ne popravlja se veličinom prozora — delom se ublažava arhitektonskim trikovima unutar modela, ali ne nestaje. Što više ubaciš, manje od toga se zaista uzima u obzir.
Tri — persistencija. Kontekst se ne čuva. Zatvori sesiju, nema ga. Sutra se isti agent pojavi sa praznim kontekstom. Znači moraš ponovo da mu nahraniš 800K tokena „istorije”. Problem nije rešen — sakriven je u tvom novčaniku i u tvojoj latency.
Četiri — učenje. Ako je agent juče pogrešio i ti si ga ispravio, to iskustvo nije strukturirano za budućnost. Sutra će ponoviti grešku. Kontekst je RAM, ne disk. I kad neko kaže „samo povećaj kontekst umesto da gradiš memoriju” — to je isto kao da kaže „zašto mi treba baza, imam terabajt RAM-a.” Tehnički se reči rimuju. U praksi su to neuporedivi koncepti.
Veliki kontekst ne zamenjuje memoriju. Dozvoljava ti da nabiješ više u jednu sesiju — i to je sve.
Šta da radiš sutra ujutru
Ako si pročitao do ovde i misliš „okej, slažem se, RAG je pretraga, ne memorija. Šta sad?” — imam dve vesti.
Loša: sistemski ispravno rešenje zahteva prepisivanje memory sloja od sheme do lifecycle-a, i to su meseci rada. Ne vikend.
Dobra: postoji nekoliko stvari koje možeš da uradiš sutra ujutru i već skineš pola bola. Nije magija — samo inženjerska higijena.
- Izbaci reč „memorija” iz svog stack-a ako imaš RAG. Zovi to retrieval ili search — odmah iskrenije. Samo to skida 80% naduvanih očekivanja korisnika i tima.
- Uvedi
valid_fromivalid_untilza svaku činjenicu. Bilo koja činjenica bez temporal validity je hipoteza, ne činjenica. Stare činjenice treba automatski da ispadnu iz retrieval-a, ne da se takmiče sa novima na cosine. - Razlikuj
staging,working,consolidated,archived. Ne gomilaj sve u jednu kolekciju. Tek pristigla činjenica i znanje potvrđeno testovima — različiti su entiteti sa različitom težinom u retrieval-u. - Učini abstain first-class ishodom. Ako u retrieve-u nijedna činjenica nije prošla confidence prag, sistem mora da ima pravo da kaže „ne znam, treba mi podatak.” I to „ne znam” treba da postane zadatak u backlog-u, ne ćorsokak za korisnika.
Ovo nije kompletna lista — to je minimum da pokreneš tranziciju iz „imam RAG, zovem ga memorija” u „imam memoriju, i ona zna svoje granice.” Puna lista od sedam principa je u delu 2.
Odakle ovo dolazi
Sedim duboko u ovoj kuhinji — Claude Code, Cursor, Codex, Windsurf, MCP serveri, mem0, Zep, lokalni RAG stack-ovi na Postgres + pgvector, Qdrant, Chroma. Poslednjih nekoliko meseci sam isprobao, mislim, sve što postoji na tržištu. Imam svoj MCP memory server sa oko hiljadu petsto unosa, koji sam tri puta prepisao iz nule, jer sam svaki put udario u jednu od tri rupe iznad.
U jednom trenutku, umorio sam se. Ne od AI-ja — od onoga što zovemo memorija kod AI-ja. Seo sam i počeo da pišem svoj kognitivni runtime koji ne pretvara se da zna, koji zna šta ne zna, i koji sam sebi postavlja zadatke da zatvori praznine. Nazvao sam ga braincore. Jedan Go binary, lokalni, MCP-stdio, Apache-2.0. Ne pitch jer je open source — samo primer da kažem „ovo se može” ne teorijski.
Sedam arhitektonskih principa na kojima je izgrađen — to je deo 2 ove serije. Izlazi za nedelju dana. Pokriću atomic knowledge units, lifecycle, strict mode, kauzalne decision chains, AST identitet za kod, internal git kao memory versioning, memory scoring i negative memory.
I zašto sve to zajedno daje kvalitativno drugačiji rezultat od bilo kog od tih komada izolovano.
Deo 3 je filozofski — o pravu AI agenta da ćuti, i zašto prava metrika za produkcijski AI nije accuracy već zero confidently-wrong actions at an acceptable abstain rate. O self-tasking-u. O tome zašto kognitivni runtime bitniji od veličine modela.
Ako si pročitao do ovde i prepoznao se u uvodnom paragrafu — u istom smo brodu. Ako imaš RAG koji zoveš memorijom i radi — reci mi kako, ozbiljno, želim da znam, možda sam pogrešio.
Jedna stvar koju ne možeš da uradiš je da ćutiš.
Deo 1 od 3. Sledeće — „Sedam principa prave memorije za AI agente” — izlazi sledećeg utorka.