Niet classificeren, maar hallucineren!

Het gebruik van Large Language Models (LLM's) om producten, zoekopdrachten en andere data te classificeren is inmiddels bekend terrein. Toch blijft het een uitdaging om de output van een LLM te beperken tot de toegestane woordenschat van merken, kleuren en categorieën die door jouw systeem worden ondersteund.

In de Wayfair WANDS e-commerce dataset wil je bijvoorbeeld een zoekopdracht zoals "houten salontafel" classificeren in de meest passende categorie. Er zijn honderden mogelijkheden, zoals:

  • Furniture / Office Furniture / Desks
  • Furniture / Living Room Furniture / Coffee Tables & End Tables / Coffee Tables
  • Furniture / Living Room Furniture / Coffee Tables & End Tables / End & Side Tables
  • Décor & Pillows / Decorative Pillows & Blankets / Throw Pillows
  • Furniture / Bedroom Furniture / Dressers & Chests

De traditionele aanpak: Gestructureerde output

De klassieke manier om dit te implementeren is via gestructureerde output. Je instrueert de provider dat de output beperkt moet blijven tot een lijst met geldige waarden. In Pydantic maak je hiervoor een grote Literal van alle toegestane outputwaarden:

from typing import Literal
from pydantic import BaseModel, Field

FullyQualifiedClassifications = Literal[
    'Furniture / Bedroom Furniture / Beds & Headboards / Beds',
    'Furniture / Living Room Furniture / Chairs & Seating / Accent Chairs',
    'Rugs / Area Rugs',
    # ... (herhaal dit 500 keer)
]

class QueryClassification(BaseModel):
    """
    Gestructureerde representatie van een zoekopdracht voor meubel-e-commerce.
    Erft trefwoorden over van het basis Query-model en voegt categorie en subcategorie toe.
    """
    classifications: list[FullyQualifiedClassifications] = Field(
        description="Een mogelijke classificatie voor het product."
    )

response = client.responses.parse(
    model="gpt-5.4-mini",
    input="Classificeer de zoekopdracht: bruine salontafel",
    text_format=QueryClassification,
)

print(response.output_parsed.message)
# Output: Furniture / Living Room Furniture / Coffee Tables & End Tables / Coffee Tables

Deze methode werkt, maar bij grote hoeveelheden data is er een manier om dit veel goedkoper te doen met kleinere, minder krachtige modellen. Bovendien is er een limiet aan de hoeveelheid informatie die je in één keer kunt versturen.

Een alternatieve methode: Hallucineren

Er bestaat een eenvoudig patroon dat LLM-classificatie vrijwel naadloos maakt: vraag een eenvoudige LLM om plausibele, fictieve classificaties voor je zoekopdracht te verzinnen.

De prompt voor deze 'hallucinatie' ziet er als volgt uit:

Jouw taak is om een nieuwe, nooit eerder geziene classificatie voor meubels, woonaccessoires of hardware te bedenken die het beste past bij een zoekopdracht.

Productclassificaties kunnen er zo uitzien:
Furniture / Living Room Furniture / Coffee Tables & End Tables / Coffee Tables
Décor & Pillows / Decorative Pillows & Blankets / Throw Pillows
Furniture / Bedroom Furniture / Dressers & Chests
Kitchen & Tabletop / Kitchen Organization / Food Storage & Canisters
School Furniture and Supplies / School Furniture / School Chairs & Seating / Stackable Chairs
Baby & Kids / Toddler & Kids Bedroom Furniture / Kids Beds

Hier is de zoekopdracht waarvoor je classificaties moet genereren:
bruine salontafel

In plaats van de lijst met geldige classificaties te sturen, vragen we de LLM dus om dingen te verzinnen. Dit kan als volgt worden geïmplementeerd:

response = client.responses.parse(
    model="gpt-5.4-mini",
    input=hallucination_prompt,
    text_format=list[str],
)

De LLM zal vervolgens onzin genereren die niet daadwerkelijk bestaat in jouw echte taxonomie, zoals: Furniture / Living Room / Tables / Coffee

Resolutie via embeddings

Hoewel deze output op het eerste gezicht niet nuttig lijkt, is dat juist wel zo. Je kunt deze fictieve waarde namelijk resolveren naar de werkelijke woordenschat.

Het is zeer kostenefficiënt om een set embeddings van de ÉCHTE classificaties in het geheugen (in-memory) op te slaan. Door voor elke echte Wayfair-classificatie een MiniLM-embedding te berekenen, kun je de embedding van de fictieve suggestie van de LLM hiermee vergelijken.

Via een dot product tussen de fictieve embedding en de echte embeddings wordt de meest vergelijkbare waarde gezocht. Dit resulteert in: Furniture / Living Room Furniture / Coffee Tables & End Tables / Coffee Tables

Het voordeel hiervan is dat je deze hallucinatie-taken kunt delegeren aan goedkope, eenvoudige LLM's en dat je niet bij elke aanroep het volledige schema naar de LLM hoeft te sturen.