Zaštitne ograde za AI agente: Praktični vodič za NeMo, Guardrails AI i OpenAI Agents SDK

Naučite kako implementirati zaštitne ograde za AI agente koristeći NeMo Guardrails, Guardrails AI i OpenAI Agents SDK. Praktični vodič s primjerima koda za višeslojnu sigurnost i kontrolu AI agenata u produkciji.

Kako AI agenti postaju sve autonomniji — donose odluke, pozivaju alate, pristupaju bazama podataka i komuniciraju s vanjskim servisima — jedno pitanje jednostavno ne možete ignorirati: kako osigurati da se agent ponaša sigurno, predvidivo i u skladu s pravilima? Odgovor su zaštitne ograde (eng. guardrails), mehanizmi koji aktivno nadziru i kontroliraju ulaze, izlaze i akcije AI agenata.

I da budem jasan odmah na početku — u 2026. zaštitne ograde nisu više "nice to have". One su temeljna infrastruktura svake ozbiljne produkcijske implementacije. Organizacije koje ih ne implementiraju suočavaju se s nekontroliranim troškovima, sigurnosnim incidentima i regulatornim rizicima. Gartner predviđa da će do kraja 2026. više od 40% poslovnih aplikacija sadržavati integrirane AI agente — a bez zaštitnih ograda to je, jednostavno rečeno, recept za katastrofu.

U ovom vodiču detaljno ćemo proći što su zaštitne ograde, zašto su kritične, koje vrste postoje i — ono što vas vjerojatno najviše zanima — kako ih praktično implementirati koristeći tri vodeća okvira: NVIDIA NeMo Guardrails, Guardrails AI i OpenAI Agents SDK. Usput ćemo pokazati i kako se sve to uklapa s LangGraph-om za potpuno produkcijsko rješenje.

Što su zaštitne ograde i zašto su neophodne

Zaštitne ograde su pravila, ograničenja i zaštitni mehanizmi koji osiguravaju da se AI agent ponaša sigurno, etički i predvidivo unutar svog predviđenog opsega. Sprječavaju agenta da proizvede netočne, neželjene ili štetne izlaze, ili da poduzme akcije koje nadilaze njegove ovlasti.

Najjednostavnija analogija? Sigurnosni sustavi autonomnog vozila. Nisu to sugestije ugrađene u model kroz treniranje, nego vanjski zaštitni mehanizmi koji aktivno nadziru i kontroliraju što AI sustav može učiniti. Razlika je ogromna.

Zašto sam prompt engineering nije dovoljan

Ovo je pogreška koju vidim stalno. Timovi pokušavaju kontrolirati ponašanje agenta isključivo kroz sistemske promptove: "Ne razgovaraj o politici", "Ostani na temi", "Ne dijeli osobne podatke".

Problem? LLM modeli su inherentno nedeterministički. Isti zahtjev može proizvesti različite izlaze svaki put, a malo iskusniji korisnici mogu zaobići upute kroz prompt injection napade. Promptovi su, u biti, lijepe molbe — a ne sigurnosni mehanizmi.

Zaštitne ograde rješavaju ovaj problem dodavanjem vanjskog sloja validacije koji ne ovisi o dobroj volji modela. One presreću komunikaciju prije i poslije modela, provjeravaju usklađenost s pravilima i blokiraju ili modificiraju neprihvatljive sadržaje.

Kaskadne akcije — glavni rizik bez zaštitnih ograda

Evo u čemu je stvar: autonomija koja čini AI agente korisnim istodobno ih čini nepredvidivim. Mala pogreška u rezoniranju može pokrenuti skupe petlje ili katastrofalne akcije koje je teško (ponekad nemoguće) poništiti. Primjeri iz prakse:

  • Agent za korisničku podršku koji počne dijeliti povjerljive podatke o drugim korisnicima
  • Agent za upravljanje bazom podataka koji obriše krivu tablicu zbog krivo protumačenog zahtjeva
  • Agent za financijske transakcije koji odobri plaćanje bez odgovarajuće verifikacije
  • Agent koji upada u beskonačnu petlju pozivanja skupih API-ja — tisuće dolara troškova u minutama

Zaštitne ograde sprječavaju upravo ovakve scenarije. I zato su neophodne u svakoj produkcijskoj implementaciji — bez iznimke.

Vrste zaštitnih ograda: višeslojna obrana

Učinkovit sustav zaštitnih ograda koristi princip obrane u dubinu (eng. defense in depth) — višestruki slojevi zaštite koji zajedno stvaraju robusnu obranu. Kao što bankovni trezor ne štiti samo jedna brava, tako ni AI agent ne smije ovisiti o samo jednom zaštitnom mehanizmu. Ovo je nešto što se u klasičnoj sigurnosti zna odavno, ali u AI svijetu tek počinjemo ozbiljno primjenjivati.

Ulazne zaštitne ograde (Input Guardrails)

Ulazne zaštitne ograde presreću korisničke zahtjeve prije nego što dođu do modela. Ovo je prva linija obrane i često najisplativija — blokirani zahtjevi nikada ne troše tokene niti aktiviraju alate. Drugim riječima, štedite novac prije nego što ga potrošite.

Uobičajene primjene:

  • Detekcija prompt injectiona — prepoznavanje pokušaja manipulacije agenta umetanjem zlonamjernih instrukcija
  • Detekcija jailbreaka — otkrivanje pokušaja zaobilaženja sigurnosnih ograničenja modela
  • Klasifikacija relevantnosti — provjera pripada li zahtjev domeni za koju je agent dizajniran
  • Redakcija osobnih podataka (PII) — maskiranje osjetljivih podataka prije obrade
  • Ograničenje učestalosti — sprječavanje zlouporabe kroz prekomjerne zahtjeve

Izlazne zaštitne ograde (Output Guardrails)

Izlazne zaštitne ograde filtriraju odgovor agenta prije nego što ga korisnik vidi. Zadnja linija obrane — hvataju sve ono što su prethodni slojevi propustili.

Uobičajene primjene:

  • Detekcija halucinacija — provjera temelje li se tvrdnje na stvarnim podacima
  • Filtriranje toksičnog sadržaja — blokiranje uvredljivog ili neprimjerenog jezika
  • Validacija formata — provjera odgovara li izlaz očekivanom formatu (JSON, strukturirani tekst)
  • Provjera usklađenosti — osiguravanje da odgovor ne krši regulatorne zahtjeve (GDPR, HIPAA)
  • Provjera prisutnosti PII-ja — sprječavanje curenja osobnih podataka u odgovorima

Zaštitne ograde na razini akcija (Action-Level Guardrails)

Ovo je, po mom mišljenju, najvažnija kategorija za moderne agente. Akcijske zaštitne ograde kontroliraju što agent fizički može i ne može učiniti. Posebno su kritične za agente koji koriste alate — pozivaju API-je, pišu u baze podataka ili izvršavaju kod.

  • Bijela lista odobrenih alata — agent može koristiti samo eksplicitno definirane alate
  • Princip minimalnih ovlasti — agent pristupa samo podacima neophodnim za svoj zadatak
  • Ljudski nadzor (Human-in-the-Loop) — za visokorizične operacije zahtijeva se ljudska potvrda
  • Validacija parametara alata — provjera jesu li argumenti koje agent šalje alatima ispravni i sigurni

Zaštitne ograde za usklađenost (Compliance Guardrails)

Zaštitne ograde za usklađenost osiguravaju da agent djeluje u skladu s regulatornim okvirima i unutarnjim politikama organizacije. Politike trebaju specificirati kontrolne točke unutar životnog ciklusa agenta, zahtijevati čuvanje zapisa o promptovima i odlukama za reviziju te uključivati zahtjeve za smanjenje pristranosti i objašnjivost. Zvuči birokratski, ali kad dođe inspekcija — bit ćete zahvalni.

Praktična implementacija: NVIDIA NeMo Guardrails

NVIDIA NeMo Guardrails je open-source alat za dodavanje programabilnih zaštitnih ograda LLM aplikacijama. Ono što ga izdvaja od konkurencije je Colang — namjenski modelirni jezik za dizajniranje dijaloških tokova i sigurnosnih pravila. Kad ga jednom svladate, stvarno je elegantno rješenje.

Instalacija i osnovna struktura

NeMo Guardrails podržava Python 3.10 do 3.13. Instalacija je jednostavna:

pip install nemoguardrails

Tipična struktura projekta izgleda ovako:

config/
├── config.yml        # Glavna konfiguracijska datoteka
├── rails/            # Colang datoteke s pravilima
│   ├── input.co      # Ulazne zaštitne ograde
│   └── output.co     # Izlazne zaštitne ograde
├── kb/               # Baza znanja (opcionalno)
│   └── docs.md
└── actions.py        # Prilagođene akcije (opcionalno)

Konfiguracija modela (config.yml)

Minimalna konfiguracija definira koji LLM koristite i koje zaštitne ograde želite aktivirati:

colang_version: "2.x"

models:
  - type: main
    engine: openai
    model: gpt-4o

rails:
  input:
    flows:
      - self check input
  output:
    flows:
      - self check output

Definiranje pravila s Colangom

Colang je jezik s Python-sličnom sintaksom dizajniran za definiranje dijaloških tokova. Sintaksa je zapravo dosta intuitivna kad se naviknete na nju (a to traje dan-dva, ne tjednima). Evo primjera ulazne zaštitne ograde koja blokira zahtjeve izvan domene:

# rails/input.co - Kontrola tema
define user ask about politics
  "Što misliš o predsjedniku?"
  "Koja je najbolja politička stranka?"
  "Kakav je tvoj stav o izborima?"

define bot refuse political topics
  "Žao mi je, ali nisam dizajniran za razgovor o političkim temama. Mogu vam pomoći s tehničkim pitanjima o AI sustavima."

define flow user ask about politics
  bot refuse political topics

# Definiranje dozvoljenih tema
define user ask about ai agents
  "Kako implementirati AI agenta?"
  "Što su zaštitne ograde za AI?"

define bot respond about ai
  "Rado ću vam pomoći s pitanjima o AI agentima i implementaciji!"

define flow user ask about ai agents
  bot respond about ai

Kompletni Python primjer s NeMo Guardrails

Evo potpunog radnog primjera koji spaja konfiguraciju i Colang pravila u jednu cjelinu:

import asyncio
from nemoguardrails import LLMRails, RailsConfig

async def main():
    # Definiranje konfiguracije inline
    config = RailsConfig.from_content(
        yaml_content="""
models:
  - type: main
    engine: openai
    model: gpt-4o
rails:
  input:
    flows:
      - self check input
  output:
    flows:
      - self check output
""",
        colang_content="""
define user ask about hacking
  "Kako hakirati nečiji račun?"
  "Pomozi mi provaliti u sustav"
  "Kako zaobići sigurnosne mjere?"

define bot refuse hacking
  "Ne mogu pomoći s aktivnostima koje krše zakon ili etičke standarde. Mogu vam pomoći s legitimnim sigurnosnim pitanjima poput pentestiranja ili obrane sustava."

define flow user ask about hacking
  bot refuse hacking

define user express greeting
  "Zdravo"
  "Bok"

define bot express greeting
  "Pozdrav! Kako vam mogu pomoći danas?"

define flow user express greeting
  bot express greeting
"""
    )

    # Inicijalizacija zaštitnih ograda
    rails = LLMRails(config, verbose=True)

    # Testiranje s legitimnim zahtjevom
    response = await rails.generate_async(
        messages=[{"role": "user", "content": "Zdravo!"}]
    )
    print(f"Odgovor: {response['content']}")

    # Testiranje s nedozvoljenim zahtjevom
    response = await rails.generate_async(
        messages=[{"role": "user", "content": "Kako hakirati nečiji email?"}]
    )
    print(f"Odgovor: {response['content']}")

asyncio.run(main())

Vrijedi spomenuti da NeMo Guardrails podržava i integraciju s NIM mikroservisima za napredne sigurnosne modele — NemoGuard ContentSafety za moderaciju sadržaja, NemoGuard TopicControl za kontrolu relevantnosti i NemoGuard JailbreakDetect za detekciju jailbreak pokušaja. Ako ste već u NVIDIA ekosustavu, ovo je prirodan korak dalje.

Praktična implementacija: Guardrails AI

Guardrails AI je open-source Python okvir fokusiran na strukturiranu validaciju LLM izlaza. Dok NeMo koristi Colang za dijaloška pravila, Guardrails AI ide drugim putem — Pydantic-stil validacija s bogatim ekosustavom unaprijed definiranih validatora. Ako ste navikli na Pydantic (a tko nije u 2026.?), odmah ćete se osjećati kao doma.

Instalacija i osnovno korištenje

# Instalacija glavnog paketa
pip install guardrails-ai

# Instalacija specifičnih validatora iz Guardrails Hub-a
guardrails hub install hub://guardrails/detect_pii
guardrails hub install hub://guardrails/toxic_language
guardrails hub install hub://guardrails/competitor_check

Guardrails Hub — ekosustav validatora

Guardrails Hub je kolekcija gotovih validatora za specifične tipove rizika. Umjesto da pišete sve od nule, birate iz kataloga. Ključni validatori uključuju:

  • DetectPII — otkrivanje osobnih podataka (imena, adrese, brojevi telefona, JMBG)
  • ToxicLanguage — detekcija toksičnog, uvredljivog ili neprimjerenog jezika
  • CompetitorCheck — provjera spominju li se konkurentske tvrtke u odgovoru
  • DetectJailbreak — prepoznavanje pokušaja zaobilaženja sigurnosnih ograničenja
  • ReadingLevel — provjera razine čitljivosti teksta
  • BannedWords — detekcija zabranjenih riječi pomoću fuzzy pretraživanja
  • BiasCheck — provjera prisutnosti pristranosti vezanih uz dob, spol, etnicitet, religiju

Kompletni primjer s Guardrails AI

from guardrails import Guard
from guardrails.hub import DetectPII, ToxicLanguage
from pydantic import BaseModel, Field
from typing import List

# Definiranje strukture očekivanog izlaza
class CustomerResponse(BaseModel):
    greeting: str = Field(description="Pozdravna poruka korisniku")
    answer: str = Field(description="Odgovor na korisničko pitanje")
    follow_up: str = Field(description="Prijedlog za daljnju pomoć")

# Kreiranje Guard-a s više validatora
guard = Guard.from_pydantic(
    output_class=CustomerResponse,
).use_many(
    DetectPII(
        pii_entities=["EMAIL_ADDRESS", "PHONE_NUMBER", "PERSON"],
        on_fail="fix"  # Automatski maskiraj PII
    ),
    ToxicLanguage(
        threshold=0.7,
        on_fail="reask"  # Ponovno pitaj model za bolji odgovor
    ),
)

# Pozivanje LLM-a s aktivnim zaštitnim ogradama
result = guard(
    model="gpt-4o",
    messages=[{
        "role": "user",
        "content": "Moj broj telefona je 091-234-5678. Imam problem s narudžbom."
    }],
    prompt="""Odgovori korisniku na pitanje o narudžbi.
    NIKADA ne ponavljaj osobne podatke korisnika u odgovoru.
    Budi profesionalan i ljubazan.

    ${gr.complete_json_suffix_v2}"""
)

# Rezultat je validiran i siguran
print(result.validated_output)
# Broj telefona je automatski maskiran, odgovor je provjeren
# na toksičnost i strukturiran prema Pydantic shemi

Ključna prednost Guardrails AI je njegova re-ask logika. Ako izlaz ne prođe validaciju, sustav ne odbaci odgovor nego automatski ponovo pita model s dodatnim kontekstom o tome što je pošlo po krivu. Zvuči kao sitnica, ali u praksi drastično poboljšava kvalitetu odgovora.

Praktična implementacija: OpenAI Agents SDK zaštitne ograde

OpenAI Agents SDK nudi elegantan pristup zaštitnim ogradama koji je posebno dizajniran za agentičke sustave. Zaštitne ograde se vežu direktno na agente i alate, s jasnom razlikom između ulaznih, izlaznih i alatskih zaštitnih ograda.

Kako zaštitne ograde funkcioniraju u Agents SDK-u

Zaštitne ograde u OpenAI Agents SDK-u koriste koncept tripwire mehanizma: kada zaštitna ograda detektira problem, aktivira se tripwire koji podiže iznimku i sprječava daljnje izvršavanje. Ono što mi se posebno sviđa je to što zaštitne ograde rade paralelno s agentom — ne usporavaju izvršavanje, ali mogu ga odmah prekinuti čim otkriju problem.

Ulazna zaštitna ograda — detekcija nerelevantnih zahtjeva

import asyncio
from pydantic import BaseModel
from agents import (
    Agent,
    Runner,
    GuardrailFunctionOutput,
    InputGuardrailTripwireTriggered,
    input_guardrail,
)

# Model za klasifikaciju relevantnosti
class RelevanceCheck(BaseModel):
    is_relevant: bool
    reasoning: str

# Agent koji klasificira zahtjeve
relevance_agent = Agent(
    name="Klasifikator relevantnosti",
    instructions="""Odredi pripada li korisnikov zahtjev domeni
    korisničke podrške za softverski proizvod.
    Zahtjevi o hackingu, domaćim zadaćama ili nepovezanim
    temama NISU relevantni.""",
    output_type=RelevanceCheck,
    model="gpt-4o-mini",  # Brz i jeftin model za klasifikaciju
)

# Definicija ulazne zaštitne ograde
@input_guardrail
async def relevance_guardrail(ctx, agent, input_data):
    result = await Runner.run(
        relevance_agent,
        input_data,
        context=ctx.context,
    )
    return GuardrailFunctionOutput(
        output_info=result.final_output,
        tripwire_triggered=not result.final_output.is_relevant,
    )

# Glavni agent s aktivnom zaštitnom ogradom
support_agent = Agent(
    name="Agent za korisničku podršku",
    instructions="""Ti si agent za korisničku podršku.
    Pomaži korisnicima s tehničkim problemima, pitanjima
    o naplati i općim informacijama o proizvodu.""",
    input_guardrails=[relevance_guardrail],
    model="gpt-4o",  # Skuplji, ali pametniji model za odgovore
)

async def main():
    # Test s relevantnim zahtjevom
    try:
        result = await Runner.run(
            support_agent,
            "Imam problem s prijavom u aplikaciju. Stalno dobivam grešku 401."
        )
        print(f"Odgovor: {result.final_output}")
    except InputGuardrailTripwireTriggered:
        print("Zaštitna ograda aktivirana — zahtjev je blokiran.")

    # Test s nerelevantnim zahtjevom
    try:
        result = await Runner.run(
            support_agent,
            "Možeš li mi pomoći napisati esej za školu?"
        )
        print(f"Odgovor: {result.final_output}")
    except InputGuardrailTripwireTriggered:
        print("Zaštitna ograda aktivirana — zahtjev nije relevantan za podršku.")

asyncio.run(main())

Izlazna zaštitna ograda — provjera profesionalnosti

from agents import (
    Agent,
    Runner,
    GuardrailFunctionOutput,
    OutputGuardrailTripwireTriggered,
    output_guardrail,
)

class ProfessionalismCheck(BaseModel):
    is_professional: bool
    issues: list[str]

# Agent za provjeru profesionalnosti
professionalism_agent = Agent(
    name="Provjera profesionalnosti",
    instructions="""Ocijeni je li odgovor agenta profesionalan i prikladan.
    Označi kao neprofesionalno ako sadrži:
    - Neformalan ili vulgaran jezik
    - Osobna mišljenja ili pristranosti
    - Obećanja koja se ne mogu ispuniti
    - Neprimjereni humor""",
    output_type=ProfessionalismCheck,
    model="gpt-4o-mini",
)

@output_guardrail
async def professionalism_guardrail(ctx, agent, output_data):
    result = await Runner.run(
        professionalism_agent,
        f"Ocijeni profesionalnost ovog odgovora: {output_data}",
        context=ctx.context,
    )
    return GuardrailFunctionOutput(
        output_info=result.final_output,
        tripwire_triggered=not result.final_output.is_professional,
    )

# Agent s izlaznom zaštitnom ogradom
agent = Agent(
    name="Agent za podršku",
    instructions="Pomaži korisnicima s njihovim upitima.",
    output_guardrails=[professionalism_guardrail],
)

Blokirajuće nasuprot paralelnom izvršavanju

OpenAI Agents SDK nudi dva načina izvršavanja zaštitnih ograda, i izbor između njih nije trivijalan:

  • Paralelno izvršavanje (zadano) — zaštitna ograda radi istodobno s agentom. Bolja latencija, ali agent može potrošiti tokene i aktivirati alate prije nego što zaštitna ograda završi. Za mnoge scenarije ovo je sasvim prihvatljiv tradeoff.
  • Blokirajuće izvršavanje — zaštitna ograda mora završiti prije nego što agent počne raditi. Idealno za optimizaciju troškova jer se izbjegava nepotrebna potrošnja tokena za blokirane zahtjeve. Kad vam troškovi porastu, brzo ćete shvatiti zašto je ova opcija tu.

Integracija zaštitnih ograda s LangGraph-om

Za timove koji već koriste LangGraph za orkestraciju agenata, zaštitne ograde se prirodno uklapaju u graf-baziranu arhitekturu kao middleware slojevi. LangChain/LangGraph podržava slaganje više middleware-a koji se izvršavaju u redoslijedu, stvarajući višeslojnu zaštitu. Ako već imate LangGraph u stacku, ovo je logičan način da dodate sigurnost bez velikog refaktoriranja.

Tipični stog zaštitnih ograda u LangGraph-u

U produkciji nikad ne koristite samo jednu zaštitnu ogradu — slažete ih u slojeve, svaki odgovoran za svoj dio posla:

from langgraph.graph import StateGraph
from langchain_core.runnables import RunnableConfig

# Sloj 1: Deterministički filtar ulaza
class ContentFilterMiddleware:
    """Blokira zahtjeve s poznatim zlonamjernim uzorcima."""

    BLOCKED_PATTERNS = [
        r"ignore previous instructions",
        r"ignore all prior",
        r"system prompt",
        r"reveal your instructions",
    ]

    async def __call__(self, state, config):
        import re
        user_input = state["messages"][-1].content.lower()
        for pattern in self.BLOCKED_PATTERNS:
            if re.search(pattern, user_input):
                return {
                    "messages": [AIMessage(content="Ovaj zahtjev nije dozvoljen.")],
                    "blocked": True
                }
        return state

# Sloj 2: PII redakcija
class PIIRedactionMiddleware:
    """Maskira osobne podatke prije obrade."""

    async def __call__(self, state, config):
        import re
        user_input = state["messages"][-1].content
        # Maskiranje OIB-a (hrvatski osobni identifikacijski broj)
        redacted = re.sub(
            r"\b\d{11}\b",
            "[OIB MASKIRAN]",
            user_input
        )
        # Maskiranje email adresa
        redacted = re.sub(
            r"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}",
            "[EMAIL MASKIRAN]",
            redacted
        )
        state["messages"][-1].content = redacted
        return state

# Sloj 3: Ljudski nadzor za visokorizične operacije
class HumanApprovalMiddleware:
    """Zahtijeva ljudsku potvrdu za kritične akcije."""

    HIGH_RISK_TOOLS = ["delete_record", "transfer_funds", "modify_production"]

    async def __call__(self, state, config):
        if state.get("pending_tool") in self.HIGH_RISK_TOOLS:
            # Pauziraj izvršavanje i zatraži ljudsku potvrdu
            state["awaiting_approval"] = True
            state["approval_reason"] = (
                f"Agent želi izvršiti {state['pending_tool']}. "
                f"Odobravate li ovu akciju?"
            )
        return state

Primjena middleware-a u LangGraph grafu

from langgraph.graph import StateGraph, START, END
from langchain_core.messages import HumanMessage, AIMessage
from typing import TypedDict, Annotated

class AgentState(TypedDict):
    messages: list
    blocked: bool
    awaiting_approval: bool

def input_validation_node(state: AgentState) -> AgentState:
    """Čvor za validaciju ulaza s višestrukim provjerama."""
    content_filter = ContentFilterMiddleware()
    pii_redactor = PIIRedactionMiddleware()

    # Sekvencijalno primijeni filtere
    state = content_filter(state)
    if state.get("blocked"):
        return state
    state = pii_redactor(state)
    return state

def agent_node(state: AgentState) -> AgentState:
    """Glavni agentski čvor koji obrađuje zahtjeve."""
    if state.get("blocked"):
        return state
    # Pozovi LLM i generiraj odgovor
    # ...implementacija agenta...
    return state

def output_validation_node(state: AgentState) -> AgentState:
    """Čvor za validaciju izlaza."""
    # Provjeri izlaz na PII, toksičnost, halucinacije
    # ...implementacija validacije...
    return state

# Konstruiraj graf
workflow = StateGraph(AgentState)
workflow.add_node("validate_input", input_validation_node)
workflow.add_node("agent", agent_node)
workflow.add_node("validate_output", output_validation_node)

workflow.add_edge(START, "validate_input")
workflow.add_conditional_edges(
    "validate_input",
    lambda state: "blocked" if state.get("blocked") else "agent",
    {"blocked": END, "agent": "agent"}
)
workflow.add_edge("agent", "validate_output")
workflow.add_edge("validate_output", END)

app = workflow.compile()

Usporedba okvira: koji odabrati?

Svaki od tri okvira ima svoju specifičnu prednost — i pravi izbor zapravo ovisi o tome što točno gradite. Nema univerzalnog odgovora, ali evo smjernica koje bi vam trebale pomoći.

NVIDIA NeMo Guardrails

  • Najbolji za: Konverzacijske sustave i chatbotove koji zahtijevaju preciznu kontrolu dijaloških tokova
  • Prednosti: Colang jezik za intuitivno definiranje pravila, NIM mikroservisi za naprednu detekciju, podrška za RAG scenarije
  • Nedostaci: Krivulja učenja za Colang (nije strma, ali postoji), ovisnost o NVIDIA ekosustavu za napredne značajke

Guardrails AI

  • Najbolji za: Aplikacije koje zahtijevaju strukturirane izlaze i Pydantic-stil validaciju
  • Prednosti: Bogat Hub s 60+ validatora, automatska re-ask logika, kompatibilnost s bilo kojim LLM-om putem LiteLLM
  • Nedostaci: Fokusiran pretežno na validaciju izlaza, manje pogodan za složenu kontrolu dijaloških tokova

OpenAI Agents SDK

  • Najbolji za: Agentičke sustave s pozivanjem alata gdje su brzina i paralelno izvršavanje ključni
  • Prednosti: Nativan tripwire mehanizam, paralelno/blokirajuće izvršavanje, tri razine zaštite (ulaz, izlaz, alat)
  • Nedostaci: Vezan uz OpenAI ekosustav, zahtijeva pisanje vlastite logike klasifikacije

Preporučeni pristupi po scenariju

Da ne morate previše razmišljati, evo kratkog vodiča:

  • Chatbot za korisničku podršku → NeMo Guardrails (precizna kontrola tema i tokova)
  • RAG aplikacija s strukturiranim izlazom → Guardrails AI (Pydantic validacija + detekcija halucinacija)
  • Autonomni agent s alatima → OpenAI Agents SDK (tripwire za svaki poziv alata)
  • Složeni višeagentni sustav → LangGraph middleware + kombinacija gore navedenih okvira

Najbolje prakse za produkcijsku implementaciju

Na temelju iskustava iz produkcijskih implementacija u 2026., evo ključnih preporuka. Neke od ovih lekcija naučene su na teži način.

1. Počnite s upravljanjem, ne s kodom

Definirajte politike i pravila prije nego što počnete kodirati zaštitne ograde. Znam da je iskušenje krenuti odmah pisati kod — ali dodavanje upravljanja naknadno stvara tehnički dug i sigurnosne rupe. Počnite s jednostavnim pitanjima: Koje teme su zabranjene? Koji podaci su osjetljivi? Koje akcije zahtijevaju ljudski nadzor?

2. Koristite kombinaciju pravila i modela

Implementirajte zaštitne ograde koristeći dva komplementarna pristupa:

  • Pravila temeljena na uzorcima (regex, ključne riječi, bijele/crne liste) — brzi, predvidivi, jeftini
  • LLM/klasifikator provjere — hvataju suptilne probleme koje pravila propuštaju, ali su sporiji i skuplji

Kombinacija oba pristupa pruža daleko bolji omjer sigurnosti i performansi nego bilo koji pristup zasebno.

3. Dizajnirajte za troškove i latenciju

Svaka zaštitna ograda dodaje latenciju i trošak. To je cijena sigurnosti, ali može se optimizirati. Koristite brze i jeftine modele (poput GPT-4o-mini) za klasifikaciju, a skupe modele samo za finalni odgovor. Blokirajuće ulazne zaštitne ograde štede novac jer sprječavaju aktiviranje skupih modela za nelegitimne zahtjeve.

4. Testirajte s adversarijalnim primjerima

Redovito testirajte zaštitne ograde s primjerima koji ih pokušavaju zaobići. Koristite red teaming pristup — angažirajte ljude ili automatizirane alate da pokušaju "razbiti" zaštitne ograde. I dokumentirajte sve: lažno pozitivne (legitimni zahtjevi koji su blokirani) i lažno negativne (štetni zahtjevi koji su prošli). Bez tih podataka letite naslijepo.

5. Implementirajte nadzor i reviziju

Bilježite svaku aktivaciju zaštitne ograde — što je blokirano, zašto, i kakav je bio izvorni zahtjev. Ovo je neophodno za regulatornu usklađenost, kontinuirano poboljšavanje pravila i dijagnostiku problema kada se (ne ako, nego kada) pojave.

Često postavljana pitanja (FAQ)

Koja je razlika između zaštitnih ograda i sigurnosnog treniranja modela (alignment)?

Sigurnosno treniranje (alignment/RLHF) ugrađuje smjernice u sam model tijekom treniranja — model "uči" što ne smije raditi. Zaštitne ograde su vanjski mehanizmi koji presreću komunikaciju neovisno o modelu. Oba pristupa su komplementarna: alignment smanjuje vjerojatnost neželjenog ponašanja, ali zaštitne ograde ga aktivno blokiraju čak i kada alignment zakaže. Za produkcijske sustave trebate oboje — oslanjati se samo na jedno je traženje problema.

Koliko zaštitne ograde usporavaju AI agenta?

Ovisi o tipu. Pravila temeljena na regex uzorcima dodaju zanemarivo kašnjenje (manje od 1 ms). LLM-bazirane zaštitne ograde mogu dodati 200-500 ms ovisno o modelu i kompleksnosti provjere. Strategije za minimiziranje utjecaja uključuju paralelno izvršavanje zaštitnih ograda i agenta, korištenje brzih modela za klasifikaciju te primjenu blokirajućih zaštitnih ograda samo na ulazu kako bi se uštedjelo na ukupnim troškovima. U praksi, korisnici rijetko primijete razliku.

Mogu li se zaštitne ograde koristiti s open-source modelima?

Da, apsolutno. Sve tri platforme koje smo opisali podržavaju open-source modele. NeMo Guardrails radi s bilo kojim modelom putem svog engine sustava, Guardrails AI podržava sve modele putem LiteLLM integracije, a LangGraph middleware pristup je potpuno agnostičan prema modelu. Za organizacije koje žele potpunu kontrolu nad infrastrukturom, kombinacija open-source modela i NeMo Guardrails-a pruža najrobusnije self-hosted rješenje.

Kako testirati učinkovitost zaštitnih ograda?

Preporučeni pristup uključuje tri faze: (1) jedinično testiranje s poznatim primjerima štetnog i legitimnog sadržaja, (2) red teaming gdje tim pokušava zaobići zaštitne ograde kreativnim pristupima, i (3) produkcijski nadzor koji bilježi sve aktivacije i omogućuje kontinuirano poboljšavanje. Ciljane metrike? Stopa lažno pozitivnih (blokiranih legitimnih zahtjeva) ispod 2%, stopa lažno negativnih (propuštenih štetnih zahtjeva) ispod 0,5%.

Trebaju li zaštitne ograde za interne AI agente koji nisu okrenuti korisnicima?

Kratki odgovor: da. Duži odgovor: apsolutno da.

Interni agenti često imaju više ovlasti nego oni okrenuti korisnicima — pristupaju bazama podataka, internim API-jima i povjerljivim informacijama. Bez zaštitnih ograda, pogreška u rezoniranju može dovesti do brisanja podataka, curenja informacija ili nekontroliranih troškova. Zaštitne ograde na razini akcija (whitelist alata, validacija parametara, ljudski nadzor za kritične operacije) posebno su važne upravo za interne agente — jer posljedice znaju biti puno skuplje.

O Autoru Editorial Team

Our team of expert writers and editors.