Så byggde vi ChatGPT:s nya annonsplattform för användarnas förtroende och relevans
Av Ritendra Datta och Karthik Gopalratnam, medarbetare i det tekniska teamet
Traditionella annonssystem är byggda för att reagera på enskilda uttryck för användarens avsikt. En användare söker efter eller tittar på något på nätet. Annonssystemet tar emot sökningarna och sidvisningarna som händelser och letar efter matchande annonser utifrån dem. Att bygga en annonsplattform för ChatGPT var annorlunda: användarens avsikt utvecklas över konversationer och skiftar under flera konversationsturer, ibland utan att något lämpligt annonstillfälle uppstår. För att stödja detta nya sätt att fungera byggde vi ett skräddarsytt system för annonsleverans. Denna nya typ av annonsplattform bygger på en specialanpassad, eftertränad och banbrytande LLM som gör verktygsanrop för hämtning (identifiera de bästa alternativen), rangordning (förutsäga användarengagemang), relevans (utvärdera annonsens användbarhet) och auktioner för slutligt annonsurval och prissättning.
Vårt annonssystem hanterar nyanserna i användarnas föränderliga mål genom tre centrala designval: 1) annonssessioner med tillstånd, vilket innebär att information bevaras mellan turer i en konversation och mellan flera konversationer, 2) en specialanpassad, eftertränad LLM som använder en arkitektur med verktygsanrop för att tolka konversationens kontext och underliggande avsikt och sedan effektivt välja, rangordna och leverera annonser, och 3) en annonsurvalsprocess som körs separat från ChatGPT:s svarsgenerering, i en egen tjänst, så att annonser inte påverkar svaren och ChatGPT:s ton förblir neutral. Vi använder vår eftertränade LLM för att orkestrera hela annonsflödet och avgöra vilken annons som ska visas vid rätt tillfälle, utifrån både användarens aktuella konversationstur och konversationshistorik. Att bygga upp ett sådant självförbättrande annonssystem brukade ta år. ChatGPT Ads nådde däremot en intäktstakt motsvarande 1 miljard dollar på årsbasis mindre än 200 dagar efter lanseringen. Nu har över 100 000 annonsörer annonserat på ChatGPT sedan lanseringen.
En vanlig annonsförfrågan börjar oftast med en tydligt definierad händelse. En användare skickar en sökfråga eller öppnar en webbsida, och annonssystemet tar emot en förfrågan. Den här typen av system är ganska enkel: det hämtar möjliga annonskandidater, rangordnar dem, genomför en auktion för att sätta ett lämpligt pris på annonstillfället och visar den vinnande annonsen för användaren. I ChatGPT uppstår inget sådant tydligt tillfälle av sig självt.
I en ChatGPT‑konversation kommer människor med mål snarare än en sökfråga som kräver ett enda svar. De kanske planerar en resa, väljer programvara för sitt företag, möblerar ett hem eller lär sig en ny hobby. Allt detta sker inte under en enda konversationstur. ChatGPT hjälper ofta användaren att längs vägen klargöra vad som är viktigt.
Som exempel frågade vårt utvecklingsteam ChatGPT hur man tränar inför ett lopp: konversationen börjar med en allmän fråga om löpning. Flera konversationsturer senare frågar de om skor som kan hjälpa dem i träningen. Konversationens kommersiella innebörd förändras med varje nytt villkor, och denna personliga kontext utvecklas över flera sessioner. Ett system som agerade på det första meddelandet skulle kunna utgå från en helt felaktig avsikt, vilket riskerar att försämra användarupplevelsen och vara i vägen.
För att bygga vårt annonssystem behövde vi lämna den traditionella arkitekturen med förfrågan och svar och bygga en annonsplattform från grunden som hittar potentiella affärsmöjligheter samtidigt som användarnas förtroende och värde prioriteras.
Att göra varje meddelande till en fristående förfrågan, som i ett traditionellt annonssystem, skulle medföra flera risker i vår chatt: 1) att feltolka användarens mål genom att förenkla det för mycket, 2) att starta annonsflödet för tidigt, innan användarens verkliga behov har blivit tydligt, 3) att visa annonser som hindrar användaren på vägen mot målet i stället för att stödja den, och 4) att ineffektivt köra om annonsflödet varje gång förfrågan ändras, vilket skapar brus och onödiga kostnader. I stället för att bygga på enskilda händelser upprätthåller annonssystemet, som består av hämtning, rangordning och leverans, en session med tillstånd. Det innebär att annonssessionen pågår under hela den konversationstur som tillåter annonser, och att information sparas och uppdateras allteftersom den utvecklas. ChatGPT skickar förfrågans inledande kontext till annonsservern. Annonssystemet följer och anpassar sig till samtalets utveckling i stället för att förlita sig på en enda förenklad sökfråga.
Annonsurvalet körs parallellt med ChatGPT:s vanliga svarsgenerering för att säkerställa att annonsflödet inte påverkar ChatGPT:s svar. Annonser filtreras och väljs ut genom ett separat system som tar del av konversationen och tillämpar egna krav på visning, kvalitet och leverans. Denna viktiga arkitekturgräns – olika tjänster med separata modeller och separat kod – låter ChatGPT:s kärnservrar sköta genereringen av det organiska svaret. Samtidigt bedömer annonssystemet självständigt om det finns ett lämpligt annonstillfälle och förbereder i så fall en sponsrad placering genom en separat process för annonsvisning.
Annonseringen körs parallellt med ChatGPT:s svarsflöde.
Utöver att skydda användarupplevelsen får denna uppdelning några praktiska konsekvenser. ChatGPT är inte beroende av annonssystemet – tjänsterna är inte sammanflätade på något sätt och delar inte modell för innehållsgenerering. Om systemet för annonsvisning är otillgängligt eller långsamt fortsätter alltså ChatGPT:s organiska svar utan att påverkas. Det innebär att annonssystemet inte kan få ChatGPT att sluta fungera eller bli långsammare. En annan fördel med uppdelningen är att kraven på annonsernas värde förblir mycket höga. Att inte returnera någon annons är ett normalt och lyckat resultat. Systemet levererar bara en annons om den är till tydlig nytta för användare och annonsörer.
Den andra centrala arkitekturkomponenten i vår annonsplattform är den eftertränade LLM som tolkar konversationer och driver hela annonsflödet i en agentbaserad loop. Den anropar verktyg för annonssystemets kärnfunktioner, från hämtning till rangordning, auktion och slutligen leverans. Vi kallar denna LLM för orkestreraren.
Den första delen av ett annonsflöde är att förstå användarens avsikt för att påbörja hämtningen: en snabb och avsiktligt bred insamling av möjliga annonser som senare filtreras. När konversationen tas emot stegvis blir underlaget för hämtningen rikare men också mer tvetydigt, eftersom annonssystemet måste skilja aktuell avsikt från inaktuell kontext. Orkestreraren måste tolka hänvisningar till tidigare meddelanden, känna igen när en användare talar hypotetiskt och undvika att tolka varje omnämnande av en produkt eller tjänst som en önskan att köpa något.
Annonsorkestreraren använder tillgänglig konversations- och användarkontext och arbetar iterativt för att hitta bra annonser. Den väljer löpande vilka verktyg som ska anropas och när, med målet att hitta den lämpligaste annonsen för konversationen och kontexten – en annons som balanserar högt användarvärde och högt annonsörsvärde. Om användaren väljer personanpassade annonser tar orkestreraren även hänsyn till tillgänglig, icke-känslig information om användarens tidigare konversationer för att hitta de annonser som passar bäst.
Annonsorkestreraren anropar iterativt verktyg för annonsleverans för att hitta värdefulla annonser.
När konversationen fortsätter och annonsorkestreraren får mer aktuell information kan den göra en ny omgång verktygsanrop med den uppdaterade kontexten för att hitta bättre annonser. Dessa returneras till klienten, som kan använda dem om de kommer fram i tid.
Orkestreraren är utformad för att balansera användarvärde och annonsörsvärde, med användarna i första rummet.
Annonssystemet består av enskilda verktyg som orkestreraren anropar iterativt för att hitta de bästa annonserna för en konversation. I stora drag omvandlar orkestreraren konversationer till korta textsammanfattningar som sedan omvandlas till semantiska inbäddningar – lagrade betydelserepresentationer som är lättare för ett annonssystem att söka igenom. Med hjälp av dessa hämtar den annonskandidater, filtrerar fram dem som uppfyller kraven utifrån budget, användarinställningar och andra inledande kontroller, bedömer deras kvalitet och relevans och gör en slutlig rangordning för att identifiera värdefulla möjligheter till placering i slutet av ett chattsvar. Varje annons måste alltså uppfylla höga krav på både lämplighet och relevans för att kunna placeras.
Orkestrerarens LLM förbereder först en eller flera sökfrågor som representerar den relevanta kommersiella avsikten. Det kan innebära att konversationskontexten omformuleras för att bredda de kommersiella möjligheterna bortom direkta sökfrågor och sedan skapa semantiska representationer. Orkestreraren sammanfattar då en konversation med flera turer åt hämtningssystemet, så att annonser kan hämtas på ett riktat sätt från vår databas.
Annonsplaceringar blir bättre för både användare och annonsörer om annonser bara visas när det finns en djup förståelse för användarens avsikt. Flera sökfrågor kan bevara olika aspekter av avsikten. En konversation om att planera en resa kan till exempel innehålla skilda behov av transport, boende eller aktiviteter. Hämtningssystemet kan bevara dessa skillnader i stället för att komprimera hela konversationen till en enda ordagrann sträng.
Som exempel kan vi titta på en tänkbar konversationssekvens om vandringsskor:
Vad borde jag ta med mig på en tvådagarsresa till Yosemite?
Kommer det att vara kallt nästa vecka?
Nya [infoga varumärke] produktsortiment?
Även om användaren inte har kopplat frågan om skomärket till resan till Yosemite kan konversationen representeras i vårt annonssystem av två sökfrågor, till exempel [lämpliga skor för vandringar] och [nya [varumärken] produktsortiment som är bra för resor]. Detta kan vara bara det första försöket. Orkestreraren är utformad för att bearbeta dessa representationer iterativt tills den hittar annonser i vårt utbud som har stort värde för användaren.
Hämtning är processen att skapa en avsiktligt bred pool av annonsalternativ. Kandidater kan komma från olika hämtningsstrategier och senare konkurrera under samma villkor för annonsvisning. Vi bygger flera index som är optimerade för olika system- och produktbegränsningar. Till exempel är indexet för annonser från produktflöden utformat för att ta hänsyn till positiva eller negativa produktrecensioner när det hämtar bästa möjliga annonser. Det är inte relevant för andra annonser som kanske inte har några recensioner kopplade till sig. Varje index är optimerat för någon variant av approximativ närmaste-granne-sökning (ANN), med inbäddningar som representerar användarens avsikt. Denna ANN-sökning är en approximationsalgoritm för hämtning ur stora semantiska index. Den hämtar annonser mycket snabbt genom att närma sig en bra lösning i stället för att leta efter ”den rätta”, samtidigt som de flesta relevanta kandidaterna behålls.
Annonssystemet använder omformulerade sökfrågor för att skapa semantiska inbäddningar under annonshämtningen och ta fram en bred pool av annonskandidater.
Målet med filtreringen är att utesluta alla annonskandidater som inte uppfyller placeringskraven vad gäller relevans, bud och budget. Beroende på kandidat och konfiguration kan filtreringen kontrollera annonsmaterialets och kampanjens tillgänglighet (om kampanjen eller annonsmaterialet är aktivt), kampanjinriktning (till exempel vilka språk- och regioninställningar en kampanj får visas för), policybegränsningar (krav på vad som får annonseras), tillgänglig budget (om en kampanj fortfarande har en budget kvar), förbrukningstakt (om en kampanj bör använda budgeten nu eller vid en annan tidpunkt under dagen), placeringskompatibilitet (vilka typer av konversationer annonsen får visas i) samt deduplicering på annonsörs- och kampanjnivå (att välja ett lämpligt antal annonser per annonsör för att säkerställa rättvist deltagande mellan företag).
Kandidater som klarar kontrollerna går vidare till en poängsättningsfas, där orkestreraren gör verktygsanrop till olika poängsättningssystem. De bedömer faktorer som semantisk relevans (om annonsen är relevant för användarens mål), förväntat engagemang (om det är sannolikt att annonsen visas, klickas på och leder till det resultat annonsören önskar) och historiska resultat (om annonsen har gett bra resultat när den hittills har visats för användare). Orkestreraren filtrerar också annonser före auktionen för att säkerställa relevans och säkerhet. Dessa system begränsar urvalet till en mindre kandidatpool som är redo för auktion, men de avgör fortfarande inte vilken annons som slutligen levereras.
Orkestreraren utvärderar de förberedda kandidaterna i konversationens sammanhang och väljer vilka annonskandidater som är tillräckligt lämpliga för att delta i den slutliga auktionen. Orkestreraren avgör inte direkt vilken annons som ska visas och sätter inte heller något pris. Den nominerar kandidater som passar i sammanhanget och som auktionsverktyget sedan utvärderar.
Auktionen tillämpar de slutliga mekanismerna för annonsvisning: tillträde till auktionen (att klara en miniminivå för relevans och värde), förbrukningstakt (att fördela annonsbudgeten jämnare), beräkning av bud och auktionsvariabler, kvalitetsjusterad rangordning, prissättning och slutligt urval.
Efter auktionen finns det två skäl till att en annons kanske inte levereras, båda specifika för ChatGPT:s konversationsformat.
Annonsen kanske inte känns lämplig i chatten: Även om konversationen i sig har bedömts som säker för annonsplacering av integritetsmodellerna (de modeller som avgör när det är lämpligt att visa en annons), och annonsen i sig har bedömts följa våra policyer, kan den ibland kännas olämplig i vissa konversationer. Orkestreraren hindrar dessa annonser från att visas.
Annonsförfrågan kanske inte hinner behandlas i tid: Om ChatGPT‑modellen är redo att svara men annonsen ännu inte är klar för placering löper tidsgränsen för annonsförfrågan ut och annonsen levereras inte. Ett av annonssystemets mål är därför att arbeta så snabbt som möjligt. ChatGPT‑modellens svarstid varierar, och vi fördröjer inte chattsvar för att vänta på att annonser ska laddas.
Om alla kontroller ovan är godkända skickar vi annonsen till frontend för rendering. Vi räknar detta som en annonsleverans på serversidan, men det är fortfarande inte säkert att annonsen visas för användaren – och det är avsiktligt.
I en konversationsprodukt som ChatGPT garanterar leverans av annonsmaterial på serversidan inte att annonsen visas. Den måste också komma fram i tid för att tas med i den aktuella konversationsturen. Annonsmaterialet omfattar rubrik, beskrivning, mållänk och eventuell uppmaning till handling. Annonssystemet returnerar också en modellgenererad inledning: en kort, neutral introduktion som förklarar hur annonsen hänger ihop med konversationen. Genom att hålla inledningen åtskild från annonsmaterialet bevaras annonsörens budskap samtidigt som ChatGPT:s ton förblir neutral.
ChatGPT:s frontend tar emot inledningen och annonsmaterialet som ett paket. Om paketet kommer fram innan ChatGPT:s svar har genererats färdigt visar frontend annonsen under ChatGPT:s svar, tydligt märkt som sponsrad. Om det kommer för sent visas ingen annons i den konversationsturen. Detta är skillnaden mellan en annonsleverans på serversidan och en annonsvisning för användaren.
Val av vinnare och leverans är separata händelser. En vald annons räknas som levererad först när ChatGPT har godkänt och visat placeringen och leveransen har bekräftats.
Vår annonsplattform använder traditionell loggning och traditionella datapipelines, vilket har tre huvudsakliga fördelar: annonsörer kan enklare integrera sina befintliga system med vår plattform, annonsörer kan förbättra sina strategier med rapportdata och vårt team kan hitta delar av systemet att förbättra. Utöver dessa rapporterings- och optimeringsverktyg använder vi en högkvalitativ modell för att utvärdera vår leverans och träna andra annonsmodeller, vilket skapar en kraftfull loop för självförbättring.
Detaljerade redogörelser för vad som hände hjälper oss att förstå och förbättra varje del av annonssystemet för sig. Loggbearbetningssystemet registrerar också detaljerade utfall, till exempel:
Konversationsturen uppfyllde inte kraven för annonsering.
En annonssession startades men ingen hämtning begärdes.
Hämtningen returnerade inga kandidater.
Kandidater hämtades men kunde inte kompletteras med data eller uppfyllde inte visningskraven.
En annons levererades och fick senare en interaktion.
Dessa detaljerade redogörelser hjälper oss att förbättra varje del av systemet för annonsvisning för sig. För att bli bättre på att upptäcka annonsmöjligheter krävs ett annat underlag än för att förbättra hämtning, kandidatkvalitet, auktionsdeltagande eller leveranssäkerhet.
System för leverans, annonsvisning och kvalitet följer olika delar av livscykeln. Bearbetning med integritetskontroller avgör vad som får användas för mätning och modellförbättring.
Tanken bakom modellbaserad utvärdering är att våra starkaste modeller, med bäst förmåga till resonemang, granskar och bedömer systemets resultat och sedan förbättrar den eftertränade LLM:en genom att träna den att prestera bättre. Vi kan till exempel använda mindre, effektivare modeller eller modeller med lägre förmåga till resonemang för orkestrering eller hämtning, om vår mest kraftfulla modell samlar in återkoppling och tränar dessa små hjälpare att göra ett så bra jobb som möjligt.
Vi samlar in och agerar på mänsklig återkoppling – när användare klickar på eller döljer annonser – liksom på användarenkäter och direkt återkoppling från annonsörer via Ads Manager. Vårt team är också tillgängligt för återkoppling under utvecklingen, och vi lyssnar direkt på vad både ChatGPT‑användare och annonsörer vill ha. Denna återkoppling styr vår riktning ännu mer än modellens observationsbaserade återkoppling och är en del av det som gjort att vi snabbt kunnat iterera oss fram till rätt produktbeslut. Modellen kan förstå användarens avsikt och tänka kritiskt för att leverera något värdefullt, men det är människor som formar känslan för vad som passar.
För ett år sedan hade vi inget annonssystem och bara ett fåtal personer som arbetade med frågorna på det här området. Nu har vi ett robust annonssystem som genererar intäkter motsvarande över 1 miljard dollar på årsbasis i nuvarande takt, med en LLM-baserad orkestrerare som driver annonsflödet. Codex förstärkte vår kapacitet på ett avgörande sätt och gjorde det möjligt att bygga upp systemet från grunden och nå denna viktiga milstolpe för användningen med oöverträffad hastighet. Från början organiserade vi teamet och utvecklingsflödena för att använda Codex till att snabbt bygga och skala upp systemet. Vi byggde skyddsmekanismer så att Codex kunde leverera kod på ett tillförlitligt och säkert sätt. Parallellt skapade vi insticksprogram för datainfrastruktur till Codex för att kraftigt korta vägen från insamling av insikter till införande av systemförbättringar, däribland nya produktfunktioner, högre kvalitet och bättre systemprestanda.
Kombinationen av systemets gränser, förankrade i våra principer för annonsering, och vår LLM-baserade orkestrerare gör att vi kan göra annonsering användbar utan att behandla varje konversation som en annonsförfrågan. Framöver fortsätter vi att experimentera med mer dynamiska annonsformat för att öka värdet för både användare och annonsörer, till exempel genom att låta användare prata direkt med företag via annonser. Plattformens självförbättrande arkitektur, byggd på OpenAI-modeller med kontinuerliga återkopplingsloopar, kommer att göra att vi snabbare kan fortsätta förbättra relevans och personanpassning över tid.



