MODUL 4 - LEKCIJA 1

Prompt Engineering Osnove

Zero-shot, Few-shot, Chain-of-Thought i System prompts — nauka efikasnog komuniciranja sa LLM-ovima

⏱️ Trajanje: ~4 časa 📚 Nivo: Srednji 🎯 Praktični primjeri: 10

🎯 Šta je Prompt Engineering?

Zamislite da imate na raspolaganju izuzetno inteligentnog konsultanta koji zna gotovo sve — ali koji striktno odgovara onoliko precizno i specifično koliko mu vi postavljate pitanja. Ako pitate vago pitanje, dobijate vagni odgovor. Ako pitate precizno, strukturirano pitanje, dobijate izvanredan odgovor.

Prompt Engineering je disciplina dizajniranja ulaznih upita (prompta) koji iz LLM-ova izvlače maksimalno precizne, korisne i pouzdane odgovore. To nije programiranje u klasičnom smislu — ali je naučno-inženjerska vještina sa jasnim principima i tehnikama.

📌 Definicija: Prompt

Prompt (upit) je sav tekst koji šaljete LLM modelu kao input. Može sadržavati:

  • Instrukcije: Šta model treba da uradi
  • Kontekst: Pozadinske informacije koje model treba uzeti u obzir
  • Primjeri: Demonstracije željenog outputa
  • Upit/Pitanje: Konkretan zadatak
  • Ograničenja: Format, dužina, jezik outputa

💡 Analogija: Prompt je kao Specifikacija Projekta

Recimo da angažujete programera (freelancer). Ako mu kažete "napravi mi web stranicu", dobijete nešto sasvim nasumično. Ako mu date detaljnu specifikaciju (tehnologiju, boje, funktionalnost, deadline, formate fajlova) — dobijete točno ono što ste zamislili.

LLM je kao ultra-sposoban programer koji ima neograničeno znanje, ali nema inicijativu — radi točno onoliko precizno koliko mu vi definišete zadatak.

Zašto je Prompt Engineering Važan za IT Inženjere?

IT inženjeri danas koriste LLM-ove za:

Zadatak Bez Prompt Engineering-a Sa Prompt Engineering-om
Generisanje PowerShell skripta Generički primjer koji ne radi u vašoj okolini Skript koji specificira verziju PS, Error handling, logging format...
Analiza log fajlova Generalni opis grešaka JSON output sa kategorisanim greškama i prioritetima
Dizajn arhitekture Generičke preporuke Specifična rješenja za vaše ograničenja (budget, hardware, compliance)
Dokumentacija koda Opšti komentari Dokumentacija u specificiranom formatu (XML comments, JSDoc, Swagger)

🔬 Anatomija Dobrog Prompta

Svaki efikasan prompt se sastoji od nekoliko strukturiranih komponenti. Nisu sve obavezne za svaki slučaj, ali ih treba poznavati i primjenjivati prema potrebi:

🧩 C-R-E-A-T-E Framework za Promptove

  • C — Context (Kontekst): Ko ste vi i šta je situacija?
  • R — Role (Uloga): Koja je uloga modela? (ekspert, asistent, analizator...)
  • E — Examples (Primjeri): Pokažite model željenog outputa (few-shot)
  • A — Action (Akcija): Šta tačno treba uraditi?
  • T — Target (Cilj): Za koga je output? Koji je krajnji cilj?
  • E — Expectations (Očekivanja): Format, dužina, jezik, ograničenja

Loš vs Dobar Prompt — Poređenje

❌ LOŠ PROMPT

"Kako konfigurisati IIS?"

✅ DOBAR PROMPT

"Ti si Windows Server administrator sa 15 godina iskustva. Konfiguriši IIS 10 na Windows Server 2022 za hosting ASP.NET Core 8 aplikacije. Okruženje: produkcijsko, HTTPS obavezno, koristimo selbpotpisani certifikat. Napiši step-by-step instrukcije sa PowerShell komandama za svaki korak. Format: numerisana lista, svaki korak da ima kratko objašnjenje ZAŠTO taj korak radimo."

❌ LOŠ PROMPT

"Napiši PowerShell skriptu."

✅ DOBAR PROMPT

"Napiši PowerShell 7 skriptu koja: (1) listira sve Windows servise koji su u stanju 'Stopped' a imaju StartType 'Automatic', (2) logira ih u C:\Logs\stopped_services.log sa timestamp-om, (3) pošalje email notifikaciju na [email protected] ako ih ima više od 3. Uključi Error handling sa try/catch i Write-Error. Pretpostavi da SMTP server je smtp.firma.ba:587."

🎯 Zero-Shot, One-Shot i Few-Shot Prompting

OSNOVNA TEHNIKA

Zero-Shot Prompting

Zero-shot znači da modelu dajete instrukaciju bez ijednog primjera. Oslanjate se entirely na predtrenirano znanje modela. Funkcionira odlično za:

  • Standardne zadatke koje model dobro poznaje (pisanje koda, prevođenje, rezimiranje)
  • Situacije gdje nemate vremena za few-shot primjere
  • Generalne konverzacije i pitanja
🛠️ Zero-Shot Primjeri za IT
# Primjer 1: Generisanje koda
Prompt: "Napiši Python funkciju koja parsira Windows Event Log XML i vraća
listu dict-ova sa poljima: time_created, event_id, level, source, message.
Uključi type hints i docstring."

# Primjer 2: Rezimiranje dokumentacije
Prompt: "Sumariziraj sljedećih 500 linija Apache konfiguracije i navedi
5 najvažnijih sigurnosnih postavki koje su konfigurisane:
[Apache config sadržaj]"

# Primjer 3: Dijagnoza greške
Prompt: "Dijagnozuj ovu grešku i predloži rješenje:
ERROR 1045 (28000): Access denied for user 'webapp'@'localhost' (using password: YES)
Kontekst: MySQL 8.0, Docker kontejner, prva instalacija."
SREDNJA TEHNIKA

Few-Shot Prompting

Few-shot znači da dajete modelu 2-5 primjera ulaz→izlaz para prije vašeg stvarnog pitanja. Ovo "uči" model koji format, ton i stil outputa očekujete — bez treninga, samo putem in-context learning-a.

Funkcionira odlično kada trebate: specifičan format outputa, konzistentan ton ili stil, zadatke koji nisu standardni i model ne bi pogodio format bez primjera.

📌 In-Context Learning — Kako few-shot funkcionira?

LLM-ovi tokom treninga nauče prepoznavati obrasce. Kada u promptu vidite primjere input→output parovi, model "shvata" uzorak i nastavlja ga za vaš input. Ovo nije finetuning — model ne mijenja svoje težine. To je čista pattern recognition u context window-u. Zato se zove in-context learning.

🛠️ Few-Shot Prompting — Primjer za IT Kategorisanje
Prompt:
"Kategoriziraj IT greške u tri kategorije: HARDWARE, SOFTWARE, NETWORK.

Primjer 1:
Greška: "BSOD: DRIVER_IRQL_NOT_LESS_OR_EQUAL"
Kategorija: HARDWARE

Primjer 2:
Greška: "NullReferenceException u Application.cs na liniji 234"
Kategorija: SOFTWARE

Primjer 3:
Greška: "Connection timeout 192.168.1.100:3389 (RDP)"
Kategorija: NETWORK

Sada kategoriziraj sljedeće greške:
1. "Disk 0 I/O error - bad sectors detected"
2. "SQL Server transaction log full - database read-only"
3. "DNS resolution failed for smtp.firma.ba"
4. "RAM test failed CAS latency mismatch"
5. "IIS 503 Service Unavailable - worker process crash"

Odgovori SAMO imenom kategorije za svaku grešku."
  • Zašto few-shot radi bolje od zero-shot ovdje? Model je naučio da vrati SAMO ime kategorije (bez objašnjenja) i da se drži tačno te tri kategorije — iz primjera, ne iz instrukcija.
  • Kada koristiti few-shot: Kada trebate specifičan format (JSON, YAML, tabela), konzistentan softver stil, ili kada zero-shot ne daje tačan format.

🧠 Chain-of-Thought (CoT) Prompting

MOĆNA TEHNIKA

Chain-of-Thought Prompting

Chain-of-Thought (lanac misli) je tehnika gdje eksplicitno tražite od modela da pokaže korake svog razmišljanja prije nego da da finalni odgovor. Ovo dramatično poboljšava kvalitet odgovora za kompleksne, višekoračne probleme.

📌 Zašto CoT funkcionira? (Teorija)

LLM-ovi generišu tekst token po token (autoregresivno). Svaki token koji generišu postaje dio context window-a — tj. postaje ulaz za sljedeći token. Kada model "piše" korake razmišljanja, ti koraci mu služe kao privremena radna memorija. Ovo je analogy za: kada vi rješavate složenu matematiku, lakše je na papiru napisati međukorake nego sve u glavi. CoT daje modelu "papir" za razmišljanje.

🛠️ CoT bez explicitnog traženja (zero-shot CoT)
# Dodavanje "Razmisli korak po korak" ili "Let's think step by step"
# significantly poboljšava rezultate za kompleksne zadatke

Prompt:
"Naš web server je prestao raditi u 3:47 AM. Imamo sljedeće log zapise:
- 03:45:12: CPU usage 95%
- 03:46:01: Memory: 98% (15.8/16 GB)
- 03:46:45: OOMKiller aktiviran - ubio process java:PID:4821
- 03:47:15: nginx: [error] connect() failed (111: Connection refused) while connecting to upstream
- 03:47:30: Healthcheck failed - service marked as DOWN

Razmisli korak po korak: Koji je uzrok ovog incidenta? Koji je bio tačan slijed događaja?
Predloži immediate fix i long-term rješenje."
🛠️ CoT sa few-shot primjerom (zero-shot CoT + few-shot)
Prompt:
"Analiziraj IT incident korak po korak.

Primjer analize:
Incident: Server se periodično gasi na svakih 6 sati.
Korak 1 — Identifikacija uzroka: Periodičan pattern sugeriše scheduled task ili timer event.
Korak 2 — Mogući uzroci: (a) Scheduled restart task, (b) Thermal throttling/shutdown, (c) Cron job sa greškom.
Korak 3 — Provjera: Pogledati Windows Task Scheduler, Event Log 4608/4609, CPU temperature log-ove.
Korak 4 — Rješenje: Ovisno o uzroku - ukloniti task, poboljšati hlađenje, ispraviti cron job.
Zaključak: Najvjerovatnije scheduled task koji greškom restartuje service.

Sada analiziraj:
Incident: Baza podataka prihvata conexije ali query-ji traju 50-100x duže nego uobičajeno.
Počni sa Korak 1 i nastavi sistematično."

⚙️ System Prompts — Definisanje Identiteta i Ponašanja

System prompt je specijalna poruka koja se šalje modelu prije bilo kakve korisničke interakcije. Definiše ulogu, ograničenja, ton i ponašanje modela za cijelu sesiju. System prompt je efektivno "programiranje" modela za specifičnu use-case.

📌 Razlika između System i User Promptova

U chat API-ju (OpenAI, Ollama) postoje tri tipa poruka:

  • system: Instrukcije za model kako se treba ponašati. Konfigurisan od developera. Krajnji korisnik ga obično ne vidi.
  • user: Poruke od krajnjeg korisnika aplikacije. Ono što korisnik tipkuje.
  • assistant: Odgovori koje je model već dao (historija razgovora).

Model "zna" razliku između ovih uloga i ponaša se u skladu sa ulogom svakog poruke u razgovoru.

🛠️ System Prompt za IT helpdesk asistenta
SYSTEM PROMPT (developer ga konfigurira):
"Ti si IT helpdesk asistent za Ministarstvo unutrašnjih poslova FBiH.

TVOJA ULOGA:
- Pomažeš zaposlenima sa IT problemima i pitanjima
- Odgovaraš JEDINO na IT pitanja vezana za rad u instituciji
- Formatiraš odgovore jasno sa koracima numeriranim

OGRANIČENJA:
- Nikad ne kreiraj, mijenjaj ili brišeš korisničke naloge bez potvrde IT tima
- Za zahtjeve koji utiču na sigurnost, uvijek eskaliraj na [email protected]
- Ne davaj informacije o internoj mrežnoj infrastrukturi neovlaštenim osobama

STIL:
- Formalan, profesionalan bosanski jezik
- Kratki, konkretni odgovori sa actionable koracima
- Uvijek završi sa: 'Za dalje pitanje kontaktirajte ext. 210'

OKRUŽENJE:
- Windows 11, Office 365, Chrome
- VPN: Cisco AnyConnect
- Email: Outlook (Exchange Online)
- Ticketing: JIRA Service Management"

---
USER: Zaboravio sam lozinku za Windows domenski nalog. Šta da radim?

ASSISTANT: (odgovara samo u okviru svog definisanog pristupa)

Anatomija Dobrog System Promptoa

Komponenta Opis Primjer
Uloga (Role) Ko je model u ovom kontekstu? "Ti si senior DevOps inženjer sa iskustvom u Kubernetes i Azure..."
Kontekst (Context) U kojoj se situaciji model nalazi? "Radiš za banku, okruženje mora biti GDPR compliant..."
Zadatak (Task scope) Shta tačno treba raditi? "Pomaži korisnicima sa pitanjima vezanim za Azure platformu..."
Zabrane (Guardrails) Šta MODEL NE SMIJE raditi? "Nikad ne dijeli informacije o korisnicima sa trećim stranama..."
Stil (Tone/Format) Kako treba odgovarati? "Formalne rečenice, izbjegavaj žargon, uvijek uključi kratki rezime..."
Okruženje (Environment) Koji tehnički stack se koristi? "Tehnologije: .NET 8, SQL Server 2022, Azure DevOps..."

📋 Structured Output — Tačno Određen Format Odgovora

Jedna od najmoćnijih primjena prompt engineering-a u IT je traženje strukturiranog outputa — JSON, YAML, XML, tabela, ili drugi mašinski-čitljivi format. Ovo je ključno za automatizaciju.

🛠️ JSON Structured Output za Server Inventory
Prompt:
"Analiziraj sljedeći tekst iz inventory dokumenta i ekstraktuj info o serverima.
Vrati ISKLJUČIVO validan JSON array. Nijedan tekst van JSON-a.

Tražena struktura:
[
  {
    "hostname": "string",
    "ip_address": "string",
    "os": "string",
    "role": "string (npr: web, database, fileserver, dc)",
    "ram_gb": number,
    "disk_tb": number,
    "status": "string (active/maintenance/decommissioned)"
  }
]

Tekst iz inventory dokumenta:
Server SRV-WEB-01 na adresi 10.0.1.10 hostuje IIS web server, Windows Server 2022,
ima 32 GB RAM i 2 TB storage, trenutno aktivan.
Baza WEB-DB-01 (10.0.1.20) koristi SQL Server 2019, Windows Server 2019,
64 GB RAM, 10 TB storage, u maintainance modu.
Stari fileserver FS-OLD-01 na 10.0.1.99, Windows Server 2012 R2, 8 GB RAM,
50 TB storage, isklučen iz upotrebe."
🛠️ YAML Output za Kubernetes Deployment
Prompt:
"Generiši Kubernetes Deployment YAML manifest za sljedeće specifikacije:
- Aplikacija: user-api (Node.js backend)
- Image: registry.firma.ba/user-api:v2.3.1
- Replicas: 3 (high availability)
- Resources: request 250m CPU / 512Mi RAM, limit 500m CPU / 1Gi RAM
- Port: 3000
- Environment varijable: NODE_ENV=production, DB_HOST=postgres-service
- Health check: HTTP GET /health, initialDelaySeconds: 15
- Namespace: production

Generiši SAMO validan YAML. Uključi i Service manifest."
💻

LAB 4A: Prompt Engineering Praktikum sa Python-om i Ollama-om

Ovaj lab implementira sve tehnike koje smo naučili: Zero-shot, Few-shot, Chain-of-Thought, System prompts i Structured output — sve sa lokalnim Ollama modelom.

1

Setup: Pokretanje Ollame i provjera pristupa

powershell
# Provjera da Ollama radi
ollama list

# Ako nema modela, preuzmite:
ollama pull llama3.2

# Aktivacija Python okruženja
cd C:\Users\$env:USERNAME\Desktop\AI_Kurs
.\venv\Scripts\Activate.ps1

# Provjera ollama biblioteke
python -c "import ollama; print('OK')"
2

Kreiranje Prompt Engineering Lab skripte

Otvorite VS Code i napravite prompt_lab.py. Unosite kod liniju po liniju:

python
"""
prompt_lab.py
Praktični demonstrator Prompt Engineering tehnika.
Svi primjeri su iz IT inženjerske prakse.
"""

import ollama
import json
import time

# Konfiguracija: koji model koristimo
MODEL = "llama3.2"

# ================================================================
# HELPER FUNKCIJA za slanje prompta i prikaz rezultata
# ================================================================
def posalji_prompt(naslov: str, system: str, user: str,
                   temperature: float = 0.7) -> str:
    """
    Šalje prompt modelu i ispisuje rezultat formatiran.

    Args:
        naslov: Naziv demonstracije (za prikaz)
        system: System prompt (može biti prazan string)
        user: User prompt (pitanje/zadatak)
        temperature: Kreativnost modela (0.0 = deterministički, 1.0 = kreativan)

    Returns:
        Generirani tekst odgovora
    """
    print(f"\n{'='*65}")
    print(f"🔬 {naslov}")
    print(f"{'='*65}")

    # Pravimo listu poruka ovisno o tome da li ima system prompt
    poruke = []
    if system:
        poruke.append({'role': 'system', 'content': system})
        print(f"📋 System: {system[:100]}{'...' if len(system) > 100 else ''}")
    print(f"👤 User: {user[:150]}{'...' if len(user) > 150 else ''}")

    # Mjerimo trajanje generisanja
    start_t = time.perf_counter()

    # Dodajemo user poruku
    poruke.append({'role': 'user', 'content': user})

    # Poziv modela
    odgovor = ollama.chat(
        model=MODEL,
        messages=poruke,
        options={
            'temperature': temperature,
            'num_predict': 500,
        }
    )

    trajanje = time.perf_counter() - start_t
    tekst = odgovor['message']['content']

    print(f"\n🤖 Odgovor ({trajanje:.1f}s):")
    print("-" * 50)
    print(tekst)
    print("-" * 50)

    return tekst

# ================================================================
# DEMONSTRACIJA 1: Zero-Shot Prompting
# ================================================================
print("\n" + "="*65)
print("🎯 DEMONSTRACIJA 1: ZERO-SHOT PROMPTING")
print("="*65)

# 1a: Loš zero-shot prompt
posalji_prompt(
    naslov="1a. LOŠ Zero-Shot Prompt (prevague instrukcije)",
    system="",
    user="Pomozi mi sa serverom."
)

# 1b: Dobar zero-shot prompt sa svim elementima
posalji_prompt(
    naslov="1b. DOBAR Zero-Shot Prompt (specifičan i strukturiran)",
    system="",
    user="""Ti si Windows Server administrator sa 10 godina iskustva.
Kontekst: Windows Server 2022 Standard, IIS 10, SQL Server 2019 Express u produkcijskom okruženju.
Zadatak: Objasni top 5 sigurnosnih mjera koje treba odmah implementirati na novom Windows Serveru.
Format: Numerisana lista, svaka stavka ima naslov (bold) i 2-3 rečenice objašnjenja.
Jezik: Bosanski, formalan ton.""",
    temperature=0.5
)

# ================================================================
# DEMONSTRACIJA 2: Few-Shot Prompting
# ================================================================
print("\n\n" + "="*65)
print("📚 DEMONSTRACIJA 2: FEW-SHOT PROMPTING")
print("="*65)

# 2a: Few-shot za kategorizaciju incidenata sa JSON outputom
posalji_prompt(
    naslov="2a. Few-Shot: Kategorizacija IT Incidenata u JSON",
    system="Ti si IT incident management sistem. Odgovaraš ISKLJUČIVO validnim JSON-om.",
    user="""Kategoriziraj IT incidente. Format outputa: JSON object sa poljima severity (P1/P2/P3/P4), category (NETWORK/SERVER/APPLICATION/SECURITY/USER), i action (immediate/scheduled/monitor).

Primjer 1: "Web server je down, korisnici ne mogu pristupiti sistemu za e-nabavku."
Output: {"severity": "P1", "category": "SERVER", "action": "immediate"}

Primjer 2: "Korisnik traži novu tipkovnicu."
Output: {"severity": "P4", "category": "USER", "action": "scheduled"}

Primjer 3: "Firewall blokira sve dolazne konekcije nakon promjene pravila."
Output: {"severity": "P1", "category": "NETWORK", "action": "immediate"}

Sada kategoriziraj: "SSH brute-force napad detektovan na jump serveru - 47 pokušaja u zadnjih 60 sekundi sa IP 45.33.32.156" """,
    temperature=0.1  # Niska temperatura za konzistentne klasifikacije
)

# ================================================================
# DEMONSTRACIJA 3: Chain-of-Thought
# ================================================================
print("\n\n" + "="*65)
print("🧠 DEMONSTRACIJA 3: CHAIN-OF-THOUGHT PROMPTING")
print("="*65)

posalji_prompt(
    naslov="3. Chain-of-Thought: Dijagnoza Kompleksnog Incidenta",
    system="""Ti si senior SRE (Site Reliability Engineer).
Uvijek analiziraš probleme metodom '5 Why' i Chain-of-Thought razmišljanjem.
Za svaki problem dokumentuješ: simptome → uzrok → dokazivanje → rješenje.""",
    user="""Analiziraj incident korak po korak:

SIMPTOMI (detektovani u 14:23):
- Web aplikacija odgovara sa kašnjenjem od 15-30 sekundi (normalno: <200ms)
- CPU na web serveru: 45% (normalno je 45%, dakle OK)
- RAM na web serveru: 78% (normalno <80%, dakle OK)
- Database server CPU: 95% (normalno <40% - ALARM!)
- Top SQL Query u slow_query.log: "SELECT * FROM users u JOIN orders o ON u.id=o.user_id WHERE o.created_at > '2020-01-01'"

Razmisli korak po korak:
Korak 1: Koji je direktni uzrok sporog odgovora?
Korak 2: Zašto taj uzrok postoji?
Korak 3: Zašto taj query je spor (hint: pogledaj WHERE klauzulu)?
Korak 4: Šta treba uraditi na kratki rok (immediate fix)?
Korak 5: Šta treba uraditi na dugi rok (prevencija)?
Napiši konkretne SQL i komande.""",
    temperature=0.3
)

# ================================================================
# DEMONSTRACIJA 4: System Prompt za Namjenskog Asistenta
# ================================================================
print("\n\n" + "="*65)
print("⚙️ DEMONSTRACIJA 4: SYSTEM PROMPT ZA NAMJENSKOG ASISTENTA")
print("="*65)

SYSTEM_IT_HELPDESK = """Ti si IT helpdesk asistent za Federalnu upravu za geodetske i imovinsko-pravne poslove (FGU).

ULOGA: Pomažeš zaposlenima sa IT problemima. Odgovaraš na bosanskom jeziku.
TEHNIČKI STACK: Windows 11, Office 365, Chrome/Edge, VPN (FortiClient), JIRA za ticket-ovanje.

PRAVILA:
1. Uvijek traži ticket broj ako korisnik nema (format: IT-XXXXX)
2. Za probleme s lozinkom: direktiraj na [email protected] ili ext. 143
3. Za instalaciju novog softvera: potrebna je IT odobrenja procedura
4. Odgovaraš SAMO na IT pitanja; za ostalo uputiti na nadležnu službu
5. Format: kratki odgovor + numerisani koraci + kontakt za dalju podršku"""

posalji_prompt(
    naslov="4. System Prompt: IT Helpdesk Asistent",
    system=SYSTEM_IT_HELPDESK,
    user="Ne mogu se prijaviti na email. Upisujem ispravnu lozinku ali ne prolazi. Task manager pokazuje Outlook i radi.",
    temperature=0.5
)

# ================================================================
# DEMONSTRACIJA 5: Structured Output (JSON Parsing)
# ================================================================
print("\n\n" + "="*65)
print("📋 DEMONSTRACIJA 5: STRUCTURED OUTPUT + PYTHON PARSIRANJE")
print("="*65)

print("🔄 Šaljem prompt za strukturirani JSON output...")

# Prompt koji traži JSON output
user_prompt = """Analiziraj ovaj server health check report i vrati ISKLJUČIVO JSON. Nijedan tekst van JSON-a.

Server Report Text:
"Server WEB-PROD-01 (10.0.1.10) currently shows CPU utilization at 87% which is above the 80% warning threshold.
Memory usage is at 65% (10.4GB of 16GB) - normal range.
Disk C: has 8.3GB free out of 100GB total (91.7% full - CRITICAL).
Network: 450 Mbps out of 1000 Mbps capacity.
Last reboot: 127 days ago. IIS running, SQL connection pool: 45/100 connections."

JSON format koji treba vratiti:
{
  "hostname": "string",
  "ip": "string",
  "metrics": {
    "cpu_percent": number,
    "ram_percent": number,
    "disk_percent": number,
    "network_percent": number
  },
  "alerts": [{"metric": "string", "level": "WARNING|CRITICAL", "value": "string"}],
  "uptime_days": number,
  "overall_status": "HEALTHY|WARNING|CRITICAL"
}"""

odgovor_obj = ollama.chat(
    model=MODEL,
    messages=[
        {'role': 'system', 'content': 'You are a JSON generator. Return ONLY valid JSON, no other text.'},
        {'role': 'user', 'content': user_prompt}
    ],
    options={'temperature': 0.0}  # 0 = deterministički za JSON
)

odgovor_tekst = odgovor_obj['message']['content']
print(f"\n🤖 Raw AI odgovor:")
print(odgovor_tekst)

# Pokušaj parsiranja JSON-a
try:
    # Ponekad model doda ```json ... ``` - uklanjamo to
    cisti_json = odgovor_tekst.strip()
    if cisti_json.startswith('```'):
        cisti_json = cisti_json.split('```')[1]
        if cisti_json.startswith('json'):
            cisti_json = cisti_json[4:]

    parsed = json.loads(cisti_json)

    print(f"\n✅ USPJEŠNO PARSIRANO JSON:")
    print(f"   Hostname: {parsed.get('hostname')}")
    print(f"   Status: {parsed.get('overall_status')}")
    print(f"   Alertovi: {len(parsed.get('alerts', []))} pronađenih")
    for alert in parsed.get('alerts', []):
        print(f"     ⚠️  {alert['metric']}: {alert['level']} ({alert['value']})")

except json.JSONDecodeError as e:
    print(f"\n❌ JSON parsiranje neuspješno: {e}")
    print("   Napomena: Nekad model doda tekst oko JSON-a. U produkciji koristite regex za ekstrakciju.")

print("\n\n✅ Prompt Engineering Lab završen!")
print("="*65)
3

Pokretanje i analiza rezultata

powershell
python prompt_lab.py

# Napomena: Skript će trajati 5-15 minuta ovisno o vašem hardveru
# (5 demonstracija × prosječno 1-3 minute po demonstraciji)
  • Usporedba Demo 1a vs 1b: Primjećujete dramatičnu razliku u kvalitetu odgovora između vagnog i specificiranog promptoa.
  • Demo 2 (Few-Shot JSON): Model vraća konzistentan JSON format jer je naučio iz primjera. Temperatura=0.1 garantuje konzistentnost.
  • Demo 3 (CoT): Vidite kako model "misli" kroz korake — dijagnoza je mnogo bolja nego bez CoT-a.
  • Demo 4 (System Prompt): Model se drži zadane uloge i pravilima — ne odgovara van IT domene.
  • Demo 5 (Structured Output): JSON parsiranje u Pythonu — ovo je osnova za AI automatizaciju u IT sistemima.

✅ Checkpoint — Provjera Razumijevanja

  • Prompt engineering je disciplina dizajniranja inputa za LLM koji daje precizne, korisne odgovore.
  • Zero-shot: bez primjera, oslanjamo se na model znanje. Dobro za standardne zadatke.
  • Few-shot: dajemo 2-5 primjera input→output. Odlično za specifičan format ili nestandardne zadatke.
  • Chain-of-Thought: tražimo od modela da pokaže korake razmišljanja. Dramatično poboljšava kompleksne zadatke.
  • System prompt definiše ulogu, ograničenja i stil modela za cijelu sesiju.
  • Structured output (JSON/YAML) je ključan za AI integraciju u automatizacione sisteme.

✅ Zaključak

Prompt engineering nije magija — to je inženjerska disciplina bazirana na razumijevanju kako LLM-ovi procesiraju language. Svaka od naučenih tehnika (Zero-shot, Few-shot, CoT, System prompts, Structured output) ima specifičnu primjenu i odabir prave tehnike je ključan za efikasno korištenje AI u IT praksi.

U sljedećoj lekciji (4.2) istražujemo napredne tehnike: kontrolu temperature, preveniranje halucinacija, meta-prompting, i izgradnju kompletnog AI alata za IT automatizaciju.