Umjetna inteligencija je odavno prestala biti samo chatbot koji odgovara na pitanja. Danas govorimo o AI agentima — sustavima koji mogu samostalno planirati korake, pozivati alate, pretraživati vanjske izvore podataka i donositi odluke bez ljudske intervencije u svakom koraku. U ovom tutorijalu prolazimo kroz osnovnu arhitekturu takvog agenta, temeljenu na kombinaciji LLM-a (Large Language Model) i RAG-a (Retrieval-Augmented Generation).

Što zapravo radi AI agent

Klasičan LLM poziv izgleda ovako: pošaljete prompt, dobijete odgovor. Agent je nešto drugačije — on radi u petlji: promišlja što treba napraviti, poziva alat (funkciju, API, bazu podataka), analizira rezultat i ponavlja postupak dok zadatak nije završen. Ta petlja se često naziva ReAct obrazac (Reasoning + Acting).

Korisnik → Agent razmišlja → Agent poziva alat → Rezultat alata → Agent razmišlja dalje → ... → Konačan odgovor

Zašto dodati RAG

LLM sam po sebi zna samo ono što je naučio tijekom treniranja — a to znanje ima datum isteka i ne uključuje vaše interne dokumente, bazu proizvoda ili svježe podatke. RAG rješava taj problem tako da prije generiranja odgovora dohvati relevantne dijelove teksta iz vaše baze znanja i ubaci ih u kontekst modela. Rezultat: agent odgovara na temelju stvarnih, aktualnih podataka umjesto da "izmišlja" (halucinira).

Osnovni koraci izrade

1. Pripremite bazu znanja

Dokumente (PDF-ove, wiki stranice, tickete) podijelite na manje dijelove (chunkove) od otprilike 300-800 tokena, uz malo preklapanja između njih kako se rečenice ne bi prekidale na pola.

2. Generirajte embeddinge i spremite ih u vektorsku bazu

from openai import OpenAI
client = OpenAI()

embedding = client.embeddings.create(
    model="text-embedding-3-small",
    input=chunk_text
).data[0].embedding

vector_db.upsert(id=chunk_id, vector=embedding, metadata={"text": chunk_text})

Popularni izbori za vektorsku bazu: Pinecone, Weaviate, Qdrant ili čak PostgreSQL s pgvector ekstenzijom ako želite ostati na poznatoj infrastrukturi.

3. Definirajte alate koje agent smije koristiti

Svaki alat opišite jasnim imenom, opisom i shemom parametara — model bira alat na temelju tog opisa, pa što je opis precizniji, to je manje pogrešnih poziva.

{
  "name": "search_knowledge_base",
  "description": "Pretražuje internu bazu znanja i vraća relevantne odlomke teksta.",
  "parameters": {
    "type": "object",
    "properties": {
      "query": { "type": "string", "description": "Pretraživački upit" }
    },
    "required": ["query"]
  }
}

4. Postavite agentnu petlju

U svakom koraku model dobiva povijest razgovora i popis dostupnih alata. Ako model odluči pozvati alat, vi izvršite taj poziv u svom kodu i vratite rezultat modelu kao novu poruku. Petlja se ponavlja dok model ne vrati konačan tekstualni odgovor bez novog poziva alata.

5. Ograničite broj koraka i dodajte zaštitne mehanizme

Bez limita agent može upasti u beskonačnu petlju pozivanja istog alata. Postavite maksimalan broj iteracija (npr. 10-15) i logirajte svaki poziv radi debugiranja.

Česte greške početnika

  • Preveliki chunkovi — ako su dijelovi teksta preveliki, dohvat postaje netočan jer se relevantna informacija "utapa" u nebitnom tekstu.
  • Nema re-rankinga — sirovi rezultati vektorske pretrage nisu uvijek najbolji; dodatni sloj re-rankinga (npr. cross-encoder model) često značajno poboljša kvalitetu.
  • Previše alata odjednom — agent s 30 alata teže bira ispravan nego agent s 5 dobro opisanih alata. Grupirajte funkcionalnosti.
  • Nema memorije grešaka — ako alat vrati grešku, ta informacija mora otići natrag modelu da može prilagoditi sljedeći korak, a ne samo prekinuti izvršavanje.

Zaključak

Kombinacija LLM-a i RAG-a nije samo trend nego praktičan način da AI sustav bude koristan izvan onoga što je model "zapamtio" tijekom treniranja. Krenite od jednostavne petlje s jednim ili dva alata, izmjerite gdje agent najčešće griješi, i tek onda dodajte složenost. Najbolji agenti u produkciji rijetko su najsloženiji — najčešće su najpouzdaniji.