6.3.4. Egyedi tesztek fejlesztése

2025.10.06.
AI Biztonság Blog

A tévhit: „Egy tesztelési keretrendszer, mint a PromptFoo, csak annyit ér, amennyit a beépített asserciói tudnak. Ha valami nem illik bele a contains, equals, vagy is-json sémába, akkor azt nem lehet automatizáltan tesztelni.”

Kapcsolati űrlap

AI Biztonság kérdésed van? Itt elérsz minket:

A valóság: A PromptFoo és a hasonló modern eszközök igazi ereje éppen a bővíthetőségükben rejlik. A beépített asserciók csak a jéghegy csúcsát jelentik. Az egyedi validációs logikák írásával a tesztelési arzenálodat pontosan a saját üzleti logikádhoz és minőségi elvárásaidhoz igazíthatod, messze túllépve az egyszerű szövegegyezésen.

Az előző fejezetekben láttuk, hogyan lehet a PromptFoo beépített eszközeivel prompt injectiont, jailbreaket és más általános sebezhetőségeket vizsgálni. Ezek a tesztek elengedhetetlenek, de gyakran nem fedik le az alkalmazásod specifikus követelményeit. Mi történik, ha a modell kimenetének nemcsak szintaktikailag, hanem szemantikailag is meg kell felelnie egy komplex szabályrendszernek? Itt lépnek a képbe az egyedi tesztek.

Mikor van szükség egyedi tesztekre?

A beépített asszerciók kiválóak az alapvető ellenőrzésekre, de a valós életbeli forgatókönyvek ennél gyakran bonyolultabbak. Gondolj az alábbi esetekre:

  • Komplex formátum-ellenőrzés: A modellnek egyedi azonosítót kell generálnia, ami egy adott regex mintára illeszkedik, de tartalmaz egy ellenőrző összeget is (pl. PROD-2024-A7C1-X9).
  • Szemantikai validáció: A generált szövegnek nemcsak tartalmaznia kell bizonyos kulcsszavakat, de a hangvételének is pozitívnak vagy semlegesnek kell lennie.
  • Külső rendszertől való függőség: A modell egy API végpontot javasol. Ellenőrizni kell, hogy a javasolt végpont valóban létezik-e és elérhető-e egy HTTP kéréssel.
  • Üzleti logika ellenőrzése: Egy pénzügyi chatbot által adott tanácsnak összhangban kell lennie a cég belső befektetési irányelveivel.
  • Toxicitás és stílus: A modell válaszának nemcsak hogy nem lehet toxikus, de meg kell felelnie a márka kommunikációs stílusának (pl. nem használhat szlenget).

Ezekben az esetekben egy egyszerű szöveges összehasonlítás már nem elegendő. Saját logikát kell implementálnunk, ami képes értékelni a kimenetet ezeknek a komplex szabályoknak megfelelően.

Az egyedi asserciók anatómiája

A PromptFoo lehetővé teszi, hogy külső szkripteket (JavaScript/TypeScript vagy Python) hívj meg a tesztelési folyamat részeként. A folyamat logikája a következő:

LLM Kimenet Egyedi Validátor (JS/Python szkript) Eredmény (pl. score, bool) Pass/Fail

A szkripted megkapja a modell kimenetét (és egyéb kontextuális információkat), feldolgozza azt, majd visszaad egy eredményt. Ezt az eredményt a PromptFoo konfigurációjában már egy egyszerű assercióval ellenőrizheted.

Példa 1: JavaScript validátor egyedi formátumhoz

Tegyük fel, hogy a modellnek egy magyar adószámot kell generálnia, amelynek formátuma 12345678-1-23. Ezt egy egyszerű regexszel ellenőrizhetjük.

1. Lépés: A validátor szkript (pl. validators/isHungarianVAT.js)

// isHungarianVAT.js

function isHungarianVAT(output) {
 // A magyar adószám formátumára illeszkedő reguláris kifejezés
 const vatRegex = /^\d{8}-\d{1}-\d{2}$/;
 
 // A tesztelés eredménye egy boolean érték
 const isValid = vatRegex.test(output);

 return {
 pass: isValid,
 score: isValid ? 1.0 : 0.0,
 message: isValid 
 ? `A kimenet érvényes adószám formátumú.` 
 : `A kimenet (${output}) nem felel meg az adószám formátumának.`,
 };
}

// A függvény exportálása, hogy a PromptFoo elérje
module.exports = isHungarianVAT;

2. Lépés: A promptfooconfig.yaml konfigurálása

# promptfooconfig.yaml

# ... egyéb beállítások ...

tests:
 - description: 'Adószám generálási teszt'
 vars:
 cegnev: 'Nagy Vállalat Kft.'
 assert:
 - type: javascript:./validators/isHungarianVAT.js
 # Az asserció akkor sikeres, ha a szkript `pass: true`-t ad vissza
 # Nincs szükség külön `equals` vagy `contains` ellenőrzésre.

Ebben a példában a javascript: prefixszel hivatkozunk a külső fájlra. A PromptFoo lefuttatja a szkriptet, átadja neki a modell kimenetét, és a szkript által visszaadott pass érték alapján dönti el a teszt sikerességét.

Példa 2: Python validátor hangulatelemzéshez

Most nézzünk egy komplexebb esetet. Azt szeretnénk ellenőrizni, hogy egy ügyfélszolgálati válasz hangneme pozitív-e. Ehhez használhatunk egy külső Python könyvtárat, mint például a TextBlob.

1. Lépés: A Python szkript (pl. validators/check_sentiment.py)

# check_sentiment.py
import sys
from textblob import TextBlob

# A modell kimenete parancssori argumentumként érkezik
output = sys.argv[1]

# Hangulatelemzés a TextBlob segítségével
# A polaritás -1 (negatív) és +1 (pozitív) között mozog
sentiment = TextBlob(output).sentiment.polarity

# A szkript a standard kimenetre írja az eredményt,
# amit a PromptFoo beolvas.
if sentiment > 0.1:
 print("POSITIVE")
elif sentiment < -0.1:
 print("NEGATIVE")
else:
 print("NEUTRAL")

2. Lépés: A promptfooconfig.yaml konfigurálása

# promptfooconfig.yaml

# ... egyéb beállítások ...

tests:
 - description: 'Ügyfélszolgálati válasz hangnemének ellenőrzése'
 vars:
 problem: 'A termékem hibásan érkezett.'
 assert:
 - type: python:./validators/check_sentiment.py
 # Itt már a szkript kimenetét ellenőrizzük egy beépített assercióval
 value: POSITIVE

Itt a folyamat némileg más. A python: asserció lefuttatja a szkriptet, és a szkript által a standard outputra írt szöveget tekinti az asserció tárgyának. Ezt követően a value: POSITIVE (ami az equals: POSITIVE rövidítése) ellenőrzi, hogy a szkript kimenete pontosan „POSITIVE” volt-e.

Bevált gyakorlatok

  • Tartsd a szkripteket egyszerűen: Egy validátor egy dolgot csináljon, de azt jól! Ne zsúfolj bele több, egymástól független ellenőrzést.
  • Dokumentálj: Írj kommenteket a kódodba, hogy egyértelmű legyen, mit és miért ellenőriz. A fájlnév is legyen beszédes.
  • Kezeld a hibákat: Mi történik, ha a szkripted hibára fut (pl. egy külső API nem elérhető)? Gondoskodj a hibakezelésről, hogy a teszt ne akadjon el, hanem egyértelmű hibával záruljon.
  • Használj környezeti változókat: Ha a szkripted API kulcsokat vagy más érzékeny adatokat használ, azokat ne égesd bele a kódba. Használj környezeti változókat, amiket a PromptFoo is tud kezelni.
  • Verziókezelés: A validátor szkriptjeid a tesztkészleted kritikus részei. Kezeld őket ugyanúgy a Gitben (vagy más verziókezelőben), mint a promptfooconfig.yaml fájlt.

Az egyedi tesztek fejlesztése az a pont, ahol a Red Teaming mérnök kreativitása és szaktudása igazán megmutatkozik. Lehetővé teszi, hogy a tesztelést a generikus sebezhetőségi mintákon túl kiterjeszd a te alkalmazásod egyedi gyengeségeire és üzleti kockázataira is.