LLM API válaszok validálása programkódban.

LLM API válaszok validálása: miért nem elég csak bízni a modellben?

Ha már dolgoztál nyelvi modellekkel – legyen az ChatGPT API, Gemini vagy bármelyik más LLM szolgáltatás –, akkor biztosan megtapasztaltad: a válaszok kreatívak, hasznosak, de sokszor kiszámíthatatlan formátumban érkeznek. Amikor az API válaszát szeretnéd strukturáltan, alkalmazáskódban felhasználni, a „remélem, hogy ezúttal jól sikerül” módszer nem lesz elég. A validálás itt nem csak ajánlás, hanem alapvető követelmény.

Miért is probléma ez?

Képzeld el a tipikus scenariót: PHP backendben elküldesz egy promptot az OpenAI API-nak, hogy egy felhasználói értékelést elemezzen, és adjon vissza egy JSON-t a terméknévvel, az értékelés pontszámával és egy rövid összefoglalóval. A válasz valóban JSON lehet… de mi van, ha a modell néha magyarázatot is ír elé? Vagy ha a score helyett rating kulccsal tér vissza? Vagy ha a pontszám nem 1 és 5 között van, hanem „tízből kilenc”? Alkalmazásod ezeket a variációkat nem fogja tudni kezeleni, és vagy hibás adatok kerülnek az adatbázisba, vagy a frontend összeomlik.

// PHP példa: nyers API válasz feldolgozása validálás nélkül
$response = file_get_contents('https://api.openai.com/v1/chat/completions', false, $context);
$data = json_decode($response, true);

// Kockázatos feltételezések
$productName = $data['choices'][0]['message']['content']['product_name'];
$score = $data['choices'][0]['message']['content']['score'];
// Ha a struktúra nem stimmel, itt null értékekkel vagy hibákkal találkozunk

Hogyan építsünk be validációt?

A kulcs a rétegekben való gondolkodás. Az első réteg a prompt mérnöki munka: a lehető legkonkrétabb utasításokkal kéred a modellt strukturált formátum (pl. JSON) használatára. De ez önmagában nem megbízható. A második, létfontosságú réteg az alkalmazáskódban történő validáció.

A PHP világában a legjobb barátod lehet a filter_var vagy egy könyvtár, mint a Respect\Validation, de akár egy egyszerű egyéni validációs réteg is. A lényeg, hogy a kódod ne feltételezze, hanem ellenőrizze.

// PHP: egyszerű validációs réteg LLM API válaszhoz
function validateLlmResponse(array $response): array {
    $validated = [];
    
    // 1. Létezik-e a vált struktúra?
    if (!isset($response['choices'][0]['message']['content'])) {
        throw new InvalidArgumentException('Invalid LLM response structure');
    }
    
    $content = json_decode($response['choices'][0]['message']['content'], true);
    if (json_last_error() !== JSON_ERROR_NONE) {
        throw new InvalidArgumentException('LLM did not return valid JSON');
    }
    
    // 2. Kötelező mezők és formátumok
    if (empty($content['product_name']) || !is_string($content['product_name'])) {
        throw new InvalidArgumentException('Missing or invalid product_name');
    }
    
    $score = filter_var($content['score'], FILTER_VALIDATE_INT, [
        'options' => ['min_range' => 1, 'max_range' => 5]
    ]);
    if ($score === false) {
        throw new InvalidArgumentException('Score must be integer between 1-5');
    }
    $validated['score'] = $score;
    
    // 3. Opcionális mezők alapértelmezett értékkel
    $validated['summary'] = $content['summary'] ?? 'Nincs összefoglaló.';
    
    return $validated;
}

Frontend oldalon se hagyományos

Amikor a validált adatokat megjeleníted, a frontendben is érdemes egy extra ellenőrző réteget betartani. Ne hagyd, hogy a UI összeomoljon, ha valami váratlan adat érkezik. jQuery és Bootstrap kombinációjával például egyszerűen építhetsz rugalmas komponenseket.

// jQuery példa: validált adatok biztonságos megjelenítése
function displayProductReview(validatedData) {
    // Alapvető típusellenőrzés frontend oldalon is
    if (typeof validatedData !== 'object' || validatedData === null) {
        $('#review-container').html('<div class="alert alert-warning">Érvénytelen adatok</div>');
        return;
    }
    
    const productName = validatedData.product_name || 'Ismeretlen termék';
    const score = parseInt(validatedData.score) || 0;
    const summary = validatedData.summary || '';
    
    // Bootstrap komponens dinamikus építése
    const stars = '★'.repeat(score) + '☆'.repeat(5 - score);
    const html = `
        <div class="card mt-3">
            <div class="card-body">
                <h5 class="card-title">${escapeHtml(productName)}</h5>
                <div class="text-warning h4">${stars}</div>
                <p class="card-text">${escapeHtml(summary)}</p>
            </div>
        </div>
    `;
    
    $('#review-container').html(html);
}

// Egyszerű XSS védelem
function escapeHtml(text) {
    const div = document.createElement('div');
    div.textContent = text;
    return div.innerHTML;
}
// SCSS: a megjelenítés stílusozása
.review-card {
    @extend .shadow-sm;
    border-left: 4px solid theme-color("primary");
    
    .star-rating {
        font-size: 1.5rem;
        letter-spacing: 2px;
    }
    
    // Reszponzív kezelés
    @include media-breakpoint-down(sm) {
        .card-title {
            font-size: 1.1rem;
        }
    }
}

Gyakori buktatók

1. Túl nagy bizalom a promptban: Hiába írod oda, hogy „adj vissza JSON-t”, a modell néha mégis magyarázatot fűz hozzá. Mindig készülj fel a nem várt szövegre a JSON mellett.

2. Hiányzó hibakezelés: Az API hívás szintjén (pl. curl timeout, quota limit) és a validációs szinten is kezeld az esetleges hibákat.

3. Túl laza validáció: Ne elégedj meg azzal, hogy „van valami érték”. Specifikus típus-, tartomány- és formátumellenőrzéseket alkalmazz.

4. Frontend és backend validáció összekeverése: A backend validáció kötelező az adatok integritásáért. A frontend validáció csak felhasználói élmény – soha ne bízz csak benne.

Összegzés

A nyelvi modellek API-i rendkívül hatékony eszközök, de kiszámíthatatlan kimenetelűek. A validáció ezeknél nem egy „jó lenne, ha lenne” funkcionalitás, hanem az alkalmazás stabil működésének alapja. Építs több rétegű ellenőrzést: a prompt mérnökségtől kezdve a backend szigorú validációján át a frontend védelmi mechanizmusaiig. Így nemcsak hogy megbízhatóbb alkalmazásod lesz, de a fejlesztés során sok éjszakai debugging session-t megspórolsz. A kulcs a védekező programozás: reméld a legjobbat, de készülj fel a legrosszabbra.

A weboldalon megjelenő szöveges és vizuális tartalmak előállításához mesterséges intelligenciát (AI) használunk.