Het artikel behandelt de uitdaging om Large Language Models (LLM's) output te laten genereren die strikt voldoet aan een specifieke, vaak omvangrijke taxonomie van categorieën. Er worden twee benaderingen vergeleken:
- Gestructureerde output: Hierbij wordt de LLM via tools zoals Pydantic gedwongen om alleen waarden uit een vaste lijst (
Literal) te kiezen. Dit is echter kostbaar en beperkt door de context-window bij grote datasets.
- De hallucinatie-methode: De LLM wordt gevraagd om plausibele, fictieve categorieën te verzinnen op basis van voorbeelden. Deze 'hallucinaties' worden vervolgens via embeddings (bijv. MiniLM) en een dot product vergeleken met de werkelijke taxonomie om de meest nabije correcte waarde te vinden.
Het grote voordeel van de tweede methode is dat het proces kostenefficiënter is, omdat het gebruik van kleinere modellen mogelijk maakt en de prompt-lengte aanzienlijk wordt verkort.
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.
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.