Hoe we de nieuwe advertentiestack van ChatGPT bouwden voor vertrouwen en relevantie
Door Ritendra Datta en Karthik Gopalratnam, leden van de technische staf
Traditionele advertentiesystemen zijn gebouwd om te reageren op afzonderlijke uitingen van gebruikersintentie. Een gebruiker zoekt of bekijkt iets online. Het advertentiesysteem ontvangt die zoekopdrachten en paginaweergaven als gebeurtenissen en zoekt op basis daarvan naar passende advertenties. Een advertentiestack bouwen voor ChatGPT was anders: de intentie van de gebruiker ontwikkelt zich gedurende gesprekken en verschuift over meerdere gespreksbeurten, soms zonder dat er een geschikt advertentiemoment ontstaat. Om deze nieuwe aanpak te ondersteunen, hebben we een systeem op maat gebouwd voor advertentielevering. Dit nieuwe type advertentiestack is gebaseerd op een grensverleggend LLM dat speciaal is aangepast en aanvullend getraind. Het roept tools aan voor ophalen (de beste opties vinden), rangschikken (gebruikersbetrokkenheid voorspellen), relevantie (het nut van de advertentie beoordelen) en het uitvoeren van veilingen voor de definitieve advertentieselectie en prijsbepaling.
Ons advertentiesysteem houdt rekening met de nuances van veranderende gebruikersdoelen dankzij drie belangrijke ontwerpkeuzes: 1) advertentiesessies met toestandbehoud, waarbij informatie wordt onthouden over meerdere gespreksbeurten en gesprekken heen, 2) een speciaal aangepast, aanvullend getraind LLM dat via een architectuur met toolaanroepen de context en onderliggende intentie van een gesprek interpreteert en vervolgens effectief advertenties selecteert, rangschikt en levert, en 3) een advertentieselectieproces dat in een eigen dienst draait, los van de antwoordgeneratie van ChatGPT, zodat advertenties de antwoorden niet beïnvloeden en ChatGPT zijn neutrale toon behoudt. We gebruiken ons aanvullend getrainde LLM om het volledige advertentieproces te orkestreren. Het bepaalt welke advertentie op welk moment het beste kan worden getoond, op basis van zowel de huidige gespreksbeurt als de gespreksgeschiedenis van de gebruiker. Waar het opbouwen van zo'n zelfverbeterend advertentiesysteem vroeger jaren kostte, bereikte de omzet uit ChatGPT‑advertenties minder dan 200 dagen na de lancering omgerekend naar jaarbasis 1 miljard dollar. Inmiddels hebben sinds de lancering meer dan 100.000 adverteerders op ChatGPT geadverteerd.
Een traditioneel advertentieverzoek begint meestal met een duidelijk afgebakende gebeurtenis. Een gebruiker voert een zoekopdracht in of opent een webpagina, waarna het advertentiesysteem een verzoek ontvangt. Dit type systeem is vrij eenvoudig: het haalt advertentiekandidaten op, rangschikt ze, voert een veiling uit om een passende prijs voor de plaatsingsmogelijkheid te bepalen en toont de resulterende advertentie aan de gebruiker. Bij ChatGPT ontstaat zo'n concreet moment niet vanzelf.
Mensen beginnen een ChatGPT‑gesprek met een doel, niet met een zoekopdracht die één antwoord vereist. Ze plannen bijvoorbeeld een reis, kiezen software voor hun bedrijf, richten een huis in of leren een nieuwe hobby. Dat gebeurt niet allemaal in één gespreksbeurt. ChatGPT helpt de gebruiker vaak gaandeweg duidelijk te krijgen wat belangrijk is.
Ons engineeringteam vroeg ChatGPT bijvoorbeeld hoe je traint voor een hardloopwedstrijd. Zo'n gesprek begint met een algemene vraag over hardlopen. Enkele gespreksbeurten later vragen ze naar schoenen voor de training. De commerciële betekenis van het gesprek verandert met elke nieuwe randvoorwaarde, en deze persoonlijke context ontwikkelt zich over meerdere sessies. Een systeem dat op het eerste bericht reageert, kan de intentie volledig verkeerd inschatten en daarmee de gebruikerservaring verslechteren en de gebruiker in de weg zitten.
Voor ons advertentiesysteem moesten we de traditionele request-response-architectuur achter ons laten en een advertentiestack vanaf nul bouwen. Zo konden we potentiële economische kansen vinden met het vertrouwen van gebruikers en de waarde voor hen als uitgangspunt.
Elk bericht omzetten in een losstaand verzoek, zoals een traditioneel advertentiesysteem doet, zou in onze chatomgeving enkele risico's opleveren: 1) het doel van de gebruiker verkeerd begrijpen door het te sterk te vereenvoudigen, 2) het advertentieproces te vroeg starten, voordat de werkelijke behoefte duidelijk is, 3) advertenties tonen die de gebruiker hinderen in plaats van ondersteunen, en 4) het advertentieproces inefficiënt opnieuw uitvoeren bij elke wijziging van het verzoek, met ruis en onnodige kosten tot gevolg. In plaats van afzonderlijke gebeurtenissen als uitgangspunt te nemen, houdt het advertentiesysteem (dat bestaat uit ophalen, rangschikken en leveren) een sessie met toestandbehoud bij. De advertentiesessie loopt gedurende een gespreksbeurt die voor advertenties in aanmerking komt en onthoudt en actualiseert informatie naarmate die verandert. ChatGPT stuurt de oorspronkelijke verzoekcontext naar de advertentieserver. Het advertentiesysteem volgt het verloop van het gesprek en past zich daaraan aan, in plaats van uit te gaan van één vereenvoudigde zoekopdracht.
Het advertentieselectieproces loopt parallel aan de normale antwoordgeneratie van ChatGPT, zodat het advertentieproces de antwoorden van ChatGPT niet beïnvloedt. Advertenties worden gefilterd en geselecteerd door een apart systeem dat het gesprek verwerkt volgens eigen voorwaarden voor geschiktheid, kwaliteit en levering. Dankzij deze belangrijke scheiding in de architectuur — afzonderlijke diensten met eigen modellen en code — kunnen de kernservers van ChatGPT het niet-gesponsorde antwoord genereren. Ondertussen beoordeelt het advertentiesysteem onafhankelijk of er een passende advertentiemogelijkheid is. Zo ja, dan bereidt het via een apart weergaveproces een gesponsorde plaatsing voor.
Het advertentieproces loopt parallel aan het antwoordtraject van ChatGPT.
Deze scheiding beschermt niet alleen de gebruikerservaring, maar heeft ook praktische gevolgen. ChatGPT is niet afhankelijk van het advertentiesysteem: de diensten zijn op geen enkele manier verweven en delen geen model voor het genereren van content. Als het systeem voor advertentieweergave dus niet beschikbaar of traag is, heeft dat geen invloed op het niet-gesponsorde antwoord van ChatGPT. Het advertentiesysteem kan ChatGPT dus niet laten uitvallen of vertragen. Een ander voordeel van deze scheiding is dat de lat voor waardevolle advertenties heel hoog blijft liggen. Geen advertentie teruggeven is een normale, geslaagde uitkomst. Het systeem levert alleen een advertentie als die duidelijk meerwaarde heeft voor gebruikers en adverteerders.
De andere belangrijke architectuurcomponent in onze advertentiestack is het aanvullend getrainde LLM dat gesprekken interpreteert en het volledige advertentieproces in een agentische lus uitvoert. Het roept daarbij tools aan voor de kernfuncties van het advertentiesysteem, van het ophalen en rangschikken tot de veiling en uiteindelijk de levering. We noemen dit LLM de orchestrator.
Een advertentieproces begint met het begrijpen van de gebruikersintentie om het ophaalproces te starten: een snelle, bewust brede zoektocht naar mogelijke advertenties die later worden gefilterd. Doordat het gesprek stapsgewijs binnenkomt, beschikt het ophaalproces over rijkere informatie, maar ontstaat er ook meer ambiguïteit. Het advertentiesysteem moet immers onderscheid maken tussen de huidige intentie en achterhaalde context. De orchestrator moet verwijzingen naar eerdere berichten interpreteren, herkennen wanneer een gebruiker hypothetisch spreekt en voorkomen dat elke vermelding van een product of dienst wordt opgevat als een koopverzoek.
De advertentie-orchestrator gebruikt de beschikbare gespreks- en gebruikerscontext om stapsgewijs goede advertenties te vinden. Daarbij kiest hij steeds welke tool hij wanneer aanroept, met als doel de meest passende advertentie voor dat gesprek en die context te vinden: een advertentie die veel waarde biedt aan zowel de gebruiker als de adverteerder. Als de gebruiker kiest voor gepersonaliseerde advertenties, houdt de orchestrator ook rekening met beschikbare, niet-gevoelige informatie over eerdere gesprekken van de gebruiker om de best passende advertenties te vinden.
De advertentie-orchestrator roept herhaaldelijk tools voor advertentielevering aan om waardevolle advertenties te vinden.
Naarmate het gesprek vordert en de advertentie-orchestrator actuelere informatie ontvangt, kan hij met de bijgewerkte context een nieuwe reeks toolaanroepen uitvoeren om betere advertenties te vinden. Die stuurt hij terug naar de client, die deze nieuwe advertenties kan gebruiken als ze op tijd aankomen.
De orchestrator is ontworpen om de waarde voor gebruikers en adverteerders in balans te brengen, waarbij gebruikers altijd vooropstaan.
Het advertentiesysteem bestaat uit afzonderlijke tools, die de orchestrator herhaaldelijk aanroept om de beste advertenties voor een gesprek te vinden. In grote lijnen zet de orchestrator gesprekken om in korte tekstsamenvattingen. Die worden vervolgens omgezet in semantische embeddings: opgeslagen betekenissen die een advertentiesysteem makkelijker kan doorzoeken. Met die embeddings haalt hij advertentiekandidaten op, filtert hij ze op geschiktheid (op basis van budget, gebruikersinstellingen en andere voorafgaande controles), beoordeelt hij hun kwaliteit en relevantie en maakt hij een definitieve rangschikking om waardevolle plaatsingsmogelijkheden onderaan een chatantwoord te vinden. Elke advertentie moet dus aan hoge eisen voor geschiktheid en relevantie voldoen om voor plaatsing in aanmerking te komen.
Het orchestrator-LLM bereidt eerst een of meer zoekopdrachten voor die de relevante commerciële intentie weergeven. Daarbij kan het de gesprekscontext herschrijven om commerciële mogelijkheden te verkennen die verder gaan dan één-op-één-zoekopdrachten, en vervolgens semantische representaties maken. De orchestrator vat dan een gesprek met meerdere beurten samen voor het ophaalsysteem, zodat het gericht advertenties uit onze database kan ophalen.
Advertentieplaatsingen zijn beter voor zowel gebruikers als adverteerders als ze alleen verschijnen wanneer de intentie van de gebruiker grondig wordt begrepen. Met meerdere zoekopdrachten kunnen verschillende aspecten van de intentie behouden blijven. Een gesprek over het plannen van een reis kan bijvoorbeeld verschillende behoeften bevatten rond vervoer, verblijf of activiteiten. Het ophaalsysteem kan deze verschillen behouden in plaats van het hele gesprek samen te persen tot één letterlijke tekststring.
Laten we als voorbeeld kijken naar een mogelijk gespreksverloop over wandelschoenen:
What should I cover on a two-day trip to Yosemite?
Will it be cold next week?
New [insert brand] product lines?
Hoewel de gebruiker de vraag over het schoenenmerk niet aan de reis naar Yosemite heeft gekoppeld, kan dit gesprek in ons advertentiesysteem worden weergegeven met twee zoekopdrachten, zoals [shoes appropriate for hiking trip] en [new [brand] product lines good for travel]. Dit kan slechts de eerste poging zijn. De orchestrator is ontworpen om deze representaties steeds bij te stellen totdat hij in ons aanbod advertenties vindt die veel waarde bieden aan de gebruiker.
Tijdens het ophalen wordt bewust een brede groep mogelijke advertenties samengesteld. Kandidaten kunnen via verschillende ophaalstrategieën worden gevonden en later onder dezelfde voorwaarden voor weergave met elkaar concurreren. We bouwen meerdere indexen die zijn geoptimaliseerd voor verschillende systeem- en productvoorwaarden. Zo houdt de index voor productfeedadvertenties bij het ophalen van de best mogelijke advertenties rekening met positieve of negatieve productbeoordelingen. Dat is niet relevant voor andere advertenties waaraan mogelijk geen beoordelingen zijn gekoppeld. Elke index is geoptimaliseerd voor een variant van approximate-nearest-neighbor-zoeken (ANN), met embeddings die de intentie van de gebruiker weergeven. Deze ANN-zoekmethode is een benaderingsalgoritme voor het ophalen uit grote semantische indexen. Advertenties worden daardoor heel snel opgehaald: het algoritme benadert een goede oplossing in plaats van naar "de juiste" oplossing te zoeken, terwijl de meeste relevante kandidaten behouden blijven.
Het advertentiesysteem gebruikt herschreven zoekopdrachten om tijdens het ophalen van advertenties semantische embeddings te maken en een brede groep advertentiekandidaten samen te stellen.
Het doel van filteren is om alle advertentiekandidaten uit te sluiten die niet voldoen aan de plaatsingseisen voor relevantie, biedingen en budget. Afhankelijk van de kandidaat en de configuratie kunnen de controles betrekking hebben op de beschikbaarheid van advertentiemateriaal en campagnes (zijn de campagne of de advertenties actief?), campagnetargeting (bijvoorbeeld in welke taalregio's een campagne mag draaien), beleidsbeperkingen (regels voor wat mag worden geadverteerd), beschikbaar budget (heeft een campagne nog budget over?), budgetspreiding (moet een campagne nu budget uitgeven of op een ander moment van de dag?), plaatsingsgeschiktheid (voor welke soorten gesprekken komt deze advertentie in aanmerking?) en deduplicatie op adverteerders- en campagneniveau (een passend aantal advertenties per adverteerder kiezen om bedrijven eerlijk te laten deelnemen).
Kandidaten die de geschiktheidscontroles doorstaan, gaan door naar een scorefase. Daarin roept de orchestrator tools van verschillende scoresystemen aan voor afwegingen rond de weergave, zoals semantische relevantie (past de advertentie bij het doel van de gebruiker?), voorspelde betrokkenheid (wordt de advertentie waarschijnlijk bekeken en aangeklikt, en leidt dat tot het gewenste resultaat voor de adverteerder?) en eerdere prestaties (heeft de advertentie tot nu toe goed gepresteerd bij gebruikers?). De orchestrator filtert advertenties vóór de veiling ook op relevantie en veiligheid. Deze systemen brengen het aanbod terug tot een kleinere groep kandidaten die klaar is voor de veiling, maar bepalen nog niet welke advertentie uiteindelijk wordt geleverd.
De orchestrator beoordeelt de voorbereide kandidaten in de context van het gesprek en kiest welke advertentiekandidaten kansrijk genoeg zijn om aan de definitieve veiling deel te nemen. De orchestrator bepaalt niet rechtstreeks welke advertentie wordt weergegeven en stelt ook geen prijs vast. Hij draagt kandidaten voor die bij de context passen, waarna de veilingtool ze beoordeelt.
De veiling past de uiteindelijke weergavemechanismen toe: toelating tot de veiling (voldoen aan een minimumdrempel voor relevantie en waarde), budgetspreiding (advertentiebudget gelijkmatiger uitgeven), berekening van biedingen en veilingkenmerken, rangschikking met kwaliteitscorrectie, prijsbepaling en definitieve selectie.
Na de veiling kan de levering van een advertentie nog om twee redenen mislukken. Beide zijn specifiek voor ChatGPT als gespreksmedium.
De advertentie kan ongepast overkomen in de chat: ook als integriteitsmodellen (de modellen die bepalen wanneer een advertentie gepast is) het gesprek zelf veilig hebben bevonden voor advertentieplaatsing en de advertentie aan het beleid voldoet, kan deze in de context van bepaalde gesprekken toch ongepast overkomen. De orchestrator voorkomt dat deze advertenties worden getoond.
Het advertentieverzoek kan te laat worden afgehandeld: als het ChatGPT‑model klaar is om te antwoorden, maar de advertentie nog niet klaar is voor plaatsing, verloopt het advertentieverzoek en wordt de advertentie niet geleverd. Een van de doelen van het advertentiesysteem is daarom om zo snel mogelijk te werken. De responstijd van het ChatGPT‑model varieert, en we vertragen chatantwoorden niet om te wachten tot advertenties zijn geladen.
Als alle bovenstaande controles zijn doorstaan, sturen we de advertentie naar de frontend om deze te laten weergeven. We beschouwen dit als een levering van de advertentie aan de serverkant, maar het kan nog steeds zijn dat we de advertentie niet aan de gebruiker tonen. Dat is een bewuste ontwerpkeuze.
In een gespreksproduct als ChatGPT garandeert de levering van advertentiemateriaal aan de serverkant niet dat een advertentie wordt getoond. De advertentie moet ook op tijd aankomen om in de huidige gespreksbeurt te worden opgenomen. Het advertentiemateriaal omvat de titel, beschrijving, bestemmingslink en eventuele oproep tot actie. Daarnaast stuurt het advertentiesysteem een door een model gegenereerde inleiding mee: een korte, neutrale toelichting op het verband tussen de advertentie en het gesprek. Door de inleiding gescheiden te houden van het advertentiemateriaal blijft de boodschap van de adverteerder intact en behoudt ChatGPT zijn neutrale toon.
De frontend van ChatGPT ontvangt de inleiding en het advertentiemateriaal als één pakket. Als dit pakket aankomt voordat het antwoord van ChatGPT volledig is gegenereerd, toont de frontend de advertentie onder dat antwoord, duidelijk gemarkeerd als gesponsord. Komt het te laat aan, dan wordt de advertentie in die gespreksbeurt niet getoond. Dat is het verschil tussen een advertentielevering aan de serverkant en een advertentievertoning aan de gebruiker.
Het selecteren van een winnaar en het leveren van een advertentie zijn afzonderlijke gebeurtenissen. Een geselecteerde advertentie geldt pas als geleverd nadat ChatGPT de plaatsing heeft goedgekeurd en weergegeven en de levering is bevestigd.
Onze advertentiestack gebruikt traditionele logging- en datapijplijnen. Dat heeft drie belangrijke voordelen: adverteerders kunnen hun bestaande systemen makkelijker met onze stack integreren, ze kunnen hun strategieën verbeteren met de rapportagegegevens en ons team kan vaststellen welke onderdelen van het systeem beter kunnen. Naast deze rapportage- en optimalisatietools zetten we een hoogwaardig model in om onze advertentielevering te beoordelen en andere advertentiemodellen te trainen. Zo ontstaat een krachtige cyclus van zelfverbetering.
Gedetailleerde uitsplitsingen van wat er is gebeurd helpen ons elk onderdeel van het advertentiesysteem afzonderlijk te begrijpen en te verbeteren. Het systeem voor logverwerking legt ook specifieke uitkomsten vast, zoals:
De gespreksbeurt kwam niet in aanmerking voor advertenties.
Er is een advertentiesessie gestart, maar er is geen ophaalverzoek gedaan.
Het ophalen leverde geen kandidaten op.
Er zijn kandidaten opgehaald, maar het aanvullen van hun gegevens mislukte of ze voldeden niet aan de geschiktheidseisen.
Er is een advertentie geleverd waarmee later een interactie plaatsvond.
Deze gedetailleerde uitsplitsingen helpen ons elk onderdeel van het systeem voor advertentieweergave afzonderlijk te verbeteren. Om de detectie van advertentiemogelijkheden te verbeteren, zijn andere gegevens nodig dan voor het verbeteren van het ophalen, de kwaliteit van kandidaten, veilingdeelname of de betrouwbaarheid van de levering.
Systemen voor levering, weergave en kwaliteit volgen elk een ander deel van de levenscyclus. Verwerking met privacywaarborgen bepaalt welke gegevens mogen worden gebruikt voor metingen en modelverbetering.
Het idee achter modelgebaseerde evaluatie is dat onze krachtigste modellen, met het sterkste vermogen tot redenering, de resultaten van ons systeem observeren en beoordelen. Vervolgens verbeteren ze het aanvullend getrainde LLM door het te trainen om beter te presteren. Zo kunnen we kleinere, efficiëntere modellen of modellen met een beperkter vermogen tot redenering inzetten voor orkestratie of ophalen, als ons krachtigste model feedback verzamelt en deze kleine uitvoerders traint om hun werk zo goed mogelijk te doen.
We verzamelen menselijke feedback, zoals klikken op en verbergen van advertenties door gebruikers, en handelen daarnaar. Ook gebruiken we enquêtes onder gebruikers en directe feedback van adverteerders via onze Ads Manager. Tijdens de ontwikkeling staat ons team ook open voor feedback en luisteren we rechtstreeks naar de wensen van zowel ChatGPT‑gebruikers als adverteerders. Deze feedback bepaalt onze koers nog sterker dan de feedback uit modelobservaties. Mede daardoor konden we snel, via opeenvolgende verbeteringen, tot de juiste productbeslissingen komen. Het model kan misschien gebruikersintentie begrijpen en kritisch nadenken om iets waardevols te leveren, maar mensen bepalen wat goed aanvoelt.
Een jaar geleden hadden we geen advertentiesysteem en dachten slechts enkele mensen over dit vraagstuk na. Nu hebben we een robuust advertentiesysteem dat omgerekend naar jaarbasis meer dan 1 miljard dollar omzet genereert, met een LLM-gebaseerde orchestrator die het advertentieproces aanstuurt. Codex vergrootte onze slagkracht aanzienlijk en was essentieel om ons systeem vanaf nul op te bouwen en deze belangrijke gebruiksmijlpaal ongekend snel te bereiken. Vanaf het begin hebben we het team en de ontwikkelworkflows zo ingericht dat we met Codex het systeem snel konden bouwen en opschalen. We hebben waarborgen ingebouwd zodat Codex betrouwbaar en veilig code kan opleveren. Tegelijk hebben we plug-ins voor de data-infrastructuur ingericht voor Codex. Daarmee hebben we de cyclus van inzichten verzamelen en systeemverbeteringen doorvoeren sterk verkort, van nieuwe productfuncties en kwaliteitsverbeteringen tot betere systeemprestaties.
De combinatie van de grenzen van ons systeem (gebaseerd op onze advertentieprincipes) en onze LLM-gebaseerde orchestrator maakt advertenties nuttig zonder elk gesprek als een advertentieverzoek te behandelen. We blijven experimenteren met dynamischere advertentievormen om meer waarde te bieden aan gebruikers en adverteerders, bijvoorbeeld door gebruikers via advertenties rechtstreeks met bedrijven te laten praten. De zelfverbeterende architectuur van de stack, gebouwd op OpenAI-modellen met continue feedbackcycli, stelt ons in staat relevantie en personalisatie steeds sneller te verbeteren.



