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.”
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ő:
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.yamlfá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.