Dennis Vinkler KjærgaardAI, automatisering og specialbyggede webapps

Fra idé til resultat: Sådan kører mit automatiske AI-optimeringsloop

Dennis Vinkler Kjærgaard8 min læsningai
Fra idé til resultat: Sådan kører mit automatiske AI-optimeringsloop

Mit AI-loop finder svage sider, ændrer dem, måler mod en kontrolgruppe og ruller tilbage ved skade. Her er reglerne og den første dom.

Med AI er det blevet nemt automatisk at optimerer sine tekster og titler. En sprogmodel kan skrive en ny produkttekst på få sekunder. Om teksten reelt er bedre og sælger mere, kan den ikke fortælle dig.

Den udfordring har jeg selv løst med et loop bestående af fire trin. Systemet finder et sted i shoppen, der halter, laver en ændring, måler den mod en kontrolgruppe og beholder eller ruller tilbage. Bagefter leder det efter det næste. Det hele kører i vores Magento AI, den interne app jeg skrev om i indlægget om de 8 opgaver, jeg har automatiseret.

Hvor stor en del af det kører uden mig? Det afhænger af, hvor dyrt det er at tage fejl. Det vender jeg tilbage til.

Problemet: for lidt trafik til en A/B-test

En niche webshop i vores størrelse har for få besøgende til en klassisk A/B-test. Hvis en test skal påvise en forbedring på 10 %, skal hver variant køre i cirka 20 måneder. Så længe venter jeg ikke, og sæsonen for sportsklubber er meget forskellig.

Derfor deler loopet varerne i stedet for de besøgende. Halvdelen af en gruppe produkter får den nye tekst, og resten står uændret som kontrolgruppe. Delingen er tilfældig og sker parvis, så to lige populære varer havner i hver sin gruppe.

Effekten er forskellen mellem de to gruppers udvikling. Kommer der en travl uge, en Google-opdatering eller en kampagne, rammer den begge grupper, og så går regnestykket op.

Trin 1: Finde muligheder

Seks detektorer kører hver nat. De er skrevet som almindelig kode. Sprogmodellen må gerne forklare et fund bagefter, men den finder det ikke. Så kan jeg efterprøve hvert fund ved at regne det igen.

  • Mange besøg, få kurve. En vare sammenlignes med varer i samme kategori og samme prisleje, fordi kunderne naturligt lægger en pokal til 900 kr. i kurven sjældnere end en medalje til 15 kr. Første nat fandt den Lazio Pokaler: 74 besøgende-dage og 0 kurve, mens lignende varer lå omkring 5 %.

  • Søgninger i shoppen uden resultat. Speedway og ishockey var blandt de første.

  • Sider lige uden for side 1 i Google, hvor titlen mangler det søgeord, folk søger på.

  • To af vores egne sider, der slås om samme søgeord i Google.

  • Søgeord i Google Ads, hvor et køb koster over det dobbelte af snittet. Et søgeord havde kostet 997 kr. på 28 dage uden et eneste køb.

  • Søgetermer i Google Ads med klik, men uden køb.

Et fund tæller først, når det står der i to perioder i træk, så jeg ikke jager tilfældigheder.

Trin 2: Lave ændringen

Her kommer sprogmodellen ind, og reglen er, at modellen skriver, og koden dømmer.

Koden kasserer en ny produkttekst, hvis den bruger en påstand fra vores liste over forbudte påstande, fx en forkert leveringstid. Den kasserer den også, hvis den nævner et beløb, der ikke står i produktets egne tilvalg i Magento. Gravering koster 35 kr. på en pokal og 15 kr. på en medalje, så modellen må kun nævne den pris, der hører til den vare. Koden afviser også nye HTML-tags ud over punktlister og emojis.

Før ændringen går live, skriver systemet planen ned. Den siger, hvad vi måler, hvor mange data dommen kræver, og hvilken regel der afgør den. Planen kan ikke ændres bagefter. Ellers er det fristende at læse det resultat ind i tallene, man håbede på.

Lige før skrivningen henter appen den nuværende tekst fra Magento og gemmer den. Kan den ikke hente den, skriver den ikke. Så har hver ændring en vej tilbage.

Trin 3: Måle i egne tal

Loopet måler i vores egen cookiefri analytics, ikke i Google Analytics, som kun ser de besøgende, der har sagt ja til cookies. For produkttekster er tallet kurv-raten. Den viser, hvor stor en andel af dem, der ser varen på en given dag, der lægger den i kurven samme dag. Lægger en klub den samme pokal i kurven ti gange, tæller det som én.

Ved siden af målingen fører appen et register over de andre ændringer i shoppen, i annoncerne og i selve målingen. I det første forsøg viste registret sig at være lige så vigtigt som målingen.

Den første dom: ingen påviselig effekt

Den 15. september fik de 8 mest sete pokaler en ny kort beskrivelse. Den skulle svare på fire spørgsmål, som kunderne stiller os igen og igen. Hvor stor er pokalen, hvad koster graveringen, hvad følger med, og hvornår har jeg den? Dommen faldt 14. oktober efter 28 dage.

  • De 8 pokaler med ny tekst: kurv-rate 7,0 % før og 6,2 % efter.

  • 122 andre pokaler (kontrolgruppe): kurv-rate 6,2 % før og 5,5 % efter.

Kigger man kun på de 8 pokaler, faldt kurv-raten 11 %, og teksterne ser skadelige ud. Men kontrolgruppen faldt også 11 %. Forskellen mellem de to er omkring 1 %, og usikkerheden spænder fra 44 % dårligere til 75 % bedre. Dommen blev «ingen påviselig effekt», og systemet lod teksterne stå.

Halvvejs i forsøget viste en ældre måling 12 % fremgang. Den talte hvert klik på «Læg i kurv», og ét klik giver fire hændelser i vores måling. Samtidig kan én klub lægge den samme pokal i kurven mange gange.

Så den samme ændring fik tre svar. Uden kontrolgruppe havde jeg rullet en tekst tilbage, der ikke gjorde skade. Med den gamle optælling havde jeg erklæret den som vinder. Registret viste desuden 37 andre ændringer i shoppen og 7 ændringer i selve målingen i de otte uger, forsøget dækkede.

Det første forsøg brugte en kontrolgruppe, jeg valgte bagefter blandt de andre pokaler, mens de næste runder får den tilfældige deling fra starten.

Trin 4: Beholde eller rulle tilbage

Reglen for ændringer med lav risiko er «behold, medmindre det skader».

  • Virker det, beholder systemet ændringen.

  • Kan målingen ikke påvise en effekt, beholder systemet den også. En tekst, der svarer på kundens spørgsmål og ikke skader, er ikke dårligere end den gamle.

  • Skader det, ruller systemet de behandlede ændringer tilbage af sig selv. Grænsen er 80 % sandsynlighed for et fald på over 10 %. Før tilbagerulningen læser appen feltet igen, og har jeg selv rettet det imens, lader den min rettelse stå.

Resultatet lander i en læring pr. type ændring. Én runde på 8 produkter giver et for bredt interval til at sige noget. Lægger man fem runder sammen, begynder tallene at tale. Det er dér, en lille shop kan få svar.

Hvad kører uden mig?

Loopet kører tre steder i dag, og hvert sted har sit eget niveau.

Klikpriser i Google Ads kører selv. Siden 15. oktober sætter appen buddet pr. søgeord. Buddet flytter sig højst 20 % ad gangen, der går mindst 7 dage mellem to ændringer på samme søgeord, og højst 10 bud ændres pr. nat. De første to nætter ændrede den 20 bud. Efter 7 dage tjekker den, om en hævning gav en bedre placering. Gav den ikke det, ruller den hævningen tilbage. De første domme kommer 22. oktober.

Meta-annoncer kører selv inden for en grænse. En annonce, der koster over X kr. pr. køb i vores egne tal, går på pause, og den næste godkendte annonce tager pladsen. Siden 10. oktober har autopiloten sat 7 annoncer på pause, startet 5 nye og flyttet én vinder over i sit eget annoncesæt. Alle annocner laves automatisk at Grok Bot, og hver ny annonce godkender jeg, før den kommer i køen.

Tekster i shoppen kører med mig som godkender. Systemet finder muligheden, skriver kladden, måler og ruller tilbage ved skade. Men udrulningen trykker jeg selv på. Før loopet må rulle tekster ud uden mig, skal det igennem en port med fem krav, bl.a. tre afsluttede forsøg i træk uden skade på samme type ændring og nul forbudte påstande i de seneste 24 tekster. Porten er lukket i dag. Ét forsøg af tre er gennemført indtil videre.

Priser, fragt, checkout og budgetter kan loopet ikke røre. Det kan foreslå en ændring, men koden har ingen vej til at udføre den. Den giver mig i stedet en prompt, jeg selv kan arbejde videre med i Claude Code.

Hvis du selv vil i gang

  • Start med målingen, ikke med AI'en. Kan du ikke koble et køb til en betalt ordre, dømmer loopet efter forkerte tal.

  • Skriv reglen ned, før du ændrer noget. Både hvad du måler, og hvad der tæller som skade.

  • Brug en kontrolgruppe. En før/efter-sammenligning i en sæsonvirksomhed fortæller mest om sæsonen.

  • Lad maskinen gøre det, der er billigt at fortryde. Et bud, der flytter sig 20 %, kan rulles tilbage i morgen. En forkert pris i checkout kan ikke.

  • Regn med, at «ingen effekt» bliver det hyppigste svar. I en lille shop er det et ærligt svar, og det er grunden til at lægge runderne sammen.

Vil du se, hvordan jeg arbejder med det for andre webshops, kan du læse mere om AI til webshop.

Skal vi se på din webshop?

Skriv en kort besked om, hvad du gerne vil have målt eller forbedret, så giver jeg en ærlig vurdering af, hvor du skal starte. Også hvis svaret er, at din shop har brug for bedre måling før AI.

kontakt@denniskjaergaard.dk