Spring til indhold
15/30Kapitel 15 af 30

Prompt engineering, målt: Hvad der ændrer outputtet

60 tickets, samme ord i seks rækkefølger, og accuracy fra 26,7 % til 85,0 %. Fire internettricks med error bars.

På denne side

Her er en support-ticket og fire køer, den kan sendes til.

TEXT
The label on the parcel has my old surname on it.
    -> billing / technical / shipping / account

For at route den skal du bruge tre ting i prompten: kødefinitionerne, ticketen og instruktionen om at vælge én. Tre blokke. Der er seks rækkefølger, du kan placere dem i, og blokkene indeholder præcis de samme tegn i alle seks.

Over tres tickets med kendte svar scorer de seks rækkefølger mellem 26,7 % og 55,0 %. Flyt de samme to blokke ud af brugerens turn og ind i systemets turn, uden at ændre ét eneste ord, og den samme model scorer 76,7 %. Pak ticketen ind i en XML-lignende tag, og den når 85,0 %.

Intet ved modellen ændrede sig. Intet ved opgaven ændrede sig. Ikke ét ord blev omskrevet. Et udsving på otteoghalvtreds point kom af at arrangere den samme tekst.

Det er grunden til, at dette kapitel findes, og det er også grunden til, at emnet er det mest cargo-cult-befængte i feltet. Effekterne er reelle og store, hvilket får hver anekdote til at føles bekræftet; og de er ustabile på tværs af modeller og opgaver, hvilket betyder, at en anekdote er alt, de fleste råd nogensinde er. Så dette kapitel har én regel, og alt i det er underordnet den regel:

En prompt skal måles, ikke diskuteres. Fire varianter over tyve cases skelner slet ingenting.

Før målingerne er der én kendsgerning, der stille forklarer halvdelen af det, der følger.

Modellen har ingen hukommelse. Mellem to kald bevarer den intet — ikke dit sidste spørgsmål, ikke sit eget sidste svar, ikke filen du vedhæftede, ikke det faktum at du allerede har spurgt den to gange. Hvert kald starter fra en tom maskine, og det eneste, den maskine kender, er sekvensen af tokens, du lige har givet den.

Det, der ligner hukommelse i en chatgrænseflade, er din klient, der sender hele samtalen igen, hvert turn, fra begyndelsen. Modellen læser det hele igen fra bunden, hver gang. Kapitel 13 målte, hvad den genlæsning koster i en forward pass; Kapitel 16 gør det til en linje på en faktura. Det vigtige her er konsekvensen for design: prompten er ikke en besked til et system, der har tilstand. Den er tilstanden.

Det rydder en familie af misforståelser af vejen. »Modellen glemte, hvad jeg sagde til den« betyder som regel, at det aldrig blev sendt. »Den ignorerede min tidligere instruktion« betyder som regel, at instruktionen faldt ud af vinduet, da historikken blev afkortet. »Den opførte sig anderledes i produktion« betyder som regel, at produktion samler en anden prompt end den, du testede. Ingen af disse er et modelproblem, og ingen løses ved at omformulere noget.

Påstanden »denne prompt er bedre« er en påstand om en fordeling, og du kan ikke se en fordeling ved at kigge på ét output. Det, du har brug for, er kedeligt: cases med kendte svar, N varianter og et interval.

Harnessen er halvtreds linjer TypeScript med samme form som klienten fra Kapitel 14 — en request, en deadline, lidt concurrency, en optælling. Den dukker op igen i Kapitel 19 for at evaluere en retriever og i Kapitel 29 som golden set.

bench.tsTS
export type Case = { input: string; expected: string };
export type Variant = { name: string; build: (c: Case) => ChatMessage[] };

async function pooled<T, R>(xs: T[], n: number, f: (x: T) => Promise<R>) {
  const out: R[] = new Array(xs.length);
  let i = 0;
  await Promise.all(
    Array.from({ length: n }, async () => {
      while (i < xs.length) {
        const k = i++;
        out[k] = await f(xs[k]);
      }
    }),
  );
  return out;
}

export async function runVariant(v: Variant, cases: Case[], concurrency = 6) {
  const hits = await pooled(cases, concurrency, async (c) => {
    const answer = await complete(v.build(c));      
    return answer.trim().toLowerCase() === c.expected;
  });
  return { name: v.name, hits, k: hits.filter(Boolean).length, n: cases.length };
}

Tallet, der kommer tilbage, er ikke resultatet. Det her er:

stats.tsTS
/** 95 % Wilson score interval for a proportion. Chapter 4 derives it. */
export function wilson(k: number, n: number, z = 1.96) {
  const p = k / n;
  const d = 1 + (z * z) / n;
  const centre = (p + (z * z) / (2 * n)) / d;
  const half = (z * Math.sqrt((p * (1 - p)) / n + (z * z) / (4 * n * n))) / d;
  return [Math.max(0, centre - half), Math.min(1, centre + half)] as const;
}

Kapitel 4 fremlagde argumentet, og dette kapitel indløser det. Sytten rigtige ud af tyve er 85 %, og dets 95 %-interval går fra 64 % til 95 %. En variant, der scorer 13 ud af 20 — 65 %, som føles klart dårligere — har et interval fra 43 % til 82 %. De to intervaller overlapper næsten hele vejen. Tyve cases kan ikke skelne en god prompt fra en middelmådig, og de fleste publicerede prompt-råd blev valideret på færre.

Tres cases, som er det, dette kapitel bruger, er stadig ikke mange. Det er nok til at se store effekter og ærligt nok til at indrømme, når det ikke kan se små — og det vil indrømme det flere gange nedenfor.

Position: de samme ord, seks rækkefølger

Link til afsnittet: Position: de samme ord, seks rækkefølger

Tre blokke — reglerne R, ticketen T, instruktionen I — sat sammen til én brugerbesked. Alle seks permutationer, byte-identisk indhold, tres cases hver.

rækkefølge af de tre blokkekorrektaccuracy, 95 % Wilson
regler, instruktion, ticket33/6055,0 % [42,5, 66,9]
regler, ticket, instruktion30/6050,0 % [37,7, 62,3]
ticket, regler, instruktion22/6036,7 % [25,6, 49,3]
instruktion, ticket, regler21/6035,0 % [24,2, 47,6]
instruktion, regler, ticket17/6028,3 % [18,5, 40,8]
ticket, instruktion, regler16/6026,7 % [17,1, 39,0]

Bedst til værst er 28,3 point, og intervallerne overlapper ikke, så dette er ikke en historie om støj. Da hver arm scores på de samme tres items, er det skarpere spørgsmål det parrede: i de cases hvor to arme er uenige, hvor skæv er fordelingen? At gå fra den værste rækkefølge til den bedste vendte 21 cases til rigtige og 4 til forkerte — eksakt parret sandsynlighed 0,0009.3

Læs tabellen for dens form snarere end dens vinder. De to bedste rækker slutter begge med ticketen; de to værste begraver begge instruktionen i midten eller lader den komme efter dataene. Det er det samme fænomen, Liu et al. kaldte Lost in the Middle: materiale ved kanterne af en prompt bruges mere pålideligt end materiale i centrum.4 Kapitel 16 prissætter vinduet, og Kapitel 24 måler effekten ordentligt ved længde, hvor midten kollapser som beskrevet, og genopretningen helt til sidst ikke dukker op igen. Her falder den praktiske regel ud af sig selv: opgave øverst, data nederst, intet vigtigt i midten.

Flyt nu de samme ord mellem turns. Kapitel 11 fastslog, at chat-skabelonen ikke er dekoration omkring modellen, men en del af den — <|im_start|>system og <|im_start|>user er rigtige tokens, modellen så millioner af gange under fine-tuning, i præcis de positioner. Så det burde betyde noget, på hvilken side af de markører din instruktion lander, og det gør det:

hvor de samme ord borkorrektaccuracy, 95 % Wilson
regler og instruktion i systemets turn, ticket alene i brugerens turn46/6076,7 % [64,6, 85,6]
regler i systemets turn, instruktion og ticket i brugerens turn44/6073,3 % [61,0, 82,9]
regler og instruktion i systemets turn, instruktion gentaget efter ticketen42/6070,0 % [57,5, 80,1]
alle tre blokke i ét bruger-turn33/6055,0 % [42,5, 66,9]

At flytte reglerne og instruktionen over template-grænsen købte 21,7 point — 19 cases vundet, 6 tabt, parret sandsynlighed 0,0146 — uden at ændre et tegn i dem. Det er det konkrete svar på system prompt versus user prompt: de er ikke to måder at sige det samme på. De er to forskellige token-positioner i en struktur, modellen er trænet på, og systempositionen er der, hvor instruktioner, der gælder hele samtalen, hører hjemme.

Læg også mærke til tredje række. At gentage instruktionen efter ticketen — et bredt anbefalet trick — scorede under at sige den én gang. På denne model, på denne opgave, var det værre at sige det to gange end at sige det én gang.

Delimiters, og den statistiske lektie, der gemmer sig i dem

Link til afsnittet: Delimiters, og den statistiske lektie, der gemmer sig i dem

Samme prompt, bedste placering, tres cases. Det eneste, der ændres, er hvad der omgiver ticket-teksten.

hvordan ticketen afgrænseskorrektaccuracy, 95 % Wilson
en XML-lignende tag51/6085,0 % [73,9, 91,9]
slet ingenting48/6080,0 % [68,2, 88,2]
en Markdown-heading47/6078,3 % [66,4, 86,9]
en label, Ticket:46/6076,7 % [64,6, 85,6]
hash fences45/6075,0 % [62,8, 84,2]
triple backticks44/6073,3 % [61,0, 82,9]
dobbelte anførselstegn40/6066,7 % [54,1, 77,3]

Et spænd på atten point fra tegnsætning. Men se på de to ekstreme intervaller: [73,9, 91,9] og [54,1, 77,3]. De overlapper. Med den grove læsning — sammenlign error bars, og hvis de rører hinanden, så sig ingenting — beviser denne tabel slet ingenting.

Den grove læsning er forkert her, og det er mere værd end tabellen at forstå hvorfor. Hver variant blev scoret på de samme tres tickets, så de to målinger er ikke uafhængige samples; de er parrede. Det meste af hvert intervals bredde kommer fra en usikkerhedskilde, begge arme deler — om disse tres tickets er repræsentative — og den kilde udlignes, når du sammenligner dem med hinanden. Stil det parrede spørgsmål i stedet, og svaret er skarpt: at gå fra dobbelte anførselstegn til XML-taggen vendte 12 cases til rigtige og 1 til forkert, parret sandsynlighed 0,0034. Det er en reel forskel.

Og så punkterer den samme test overskriften. XML-taggen slog den almindelige Ticket:-label med 8,3 point, hvilket er tallet, et blogindlæg ville sætte i sin titel. Parret: 6 vundet, 1 tabt, sandsynlighed 0,1250. Ikke etableret. Syv cases er det, den berømte forbedring hviler på.

Så der er to spørgsmål med to forskellige instrumenter, og at blande dem sammen er sådan prompt-råd går galt i begge retninger på én gang:

Hvor god er denne prompt? Wilson-intervallet på dens egen accuracy. Bredt, medmindre du har hundredvis af cases. Det er tallet, du rapporterer til nogen, der skal beslutte, om der skal ships.

Er B bedre end A? Den parrede test over de cases, hvor de er uenige. Meget mere følsom, fordi sættets delte sværhedsgrad udlignes. Det er tallet, du bruger til at vælge mellem to kandidater.

Den generelle observation — at modeller er stærkt og uforudsigeligt følsomme over for formatteringsvalg uden semantisk indhold — er ikke ny. Sclar et al. varierede intet andet end separatorer, mellemrum og store/små bogstaver på tværs af dusinvis af opgaver og fandt accuracy-spænd, der var brede nok til at vende publicerede modelranglister.5 Den praktiske konsekvens er ikke »brug XML-tags«. Den er, at formattering er en hyperparameter, den koster ingenting at sweep, og enhver sammenligning af to modeller, der fastlåser ét format, sammenligner formater lige så meget som modeller.

In-context learning — at vise modellen gennemarbejdede eksempler i prompten og få den til at generalisere fra dem uden nogen vægtopdatering — er den evne, der gjorde GPT-3 berømt.6 Det praktiske spørgsmål er aldrig, om det virker. Det er, hvor mange eksempler det kan betale sig at betale for.

Eksempler indsættes som rigtige tidligere turns, skiftevis user og assistant, fordi det er den struktur, template'en blev trænet på. Hver k blev kørt med fem forskellige tilfældige udtræk fra en adskilt pulje på seksten labellede tickets:

eksemplergennemsnitlig accuracyværste og bedste udtrækspænd på tværs af udtræk
076,7 %
178,7 %78,3 – 80,0 %1,7 point
283,7 %80,0 – 86,7 %6,7 point
481,7 %78,3 – 86,7 %8,3 point
883,7 %78,3 – 88,3 %10,0 point
1689,3 %85,0 – 93,3 %8,3 point

To eksempler købte syv point. De næste seks eksempler købte intet målbart — 83,7, så 81,7, så 83,7, en sekvens der vandrer rundt i sin egen støj. Seksten købte yderligere fem og et halvt. Kurven er ikke en jævn stigning; den er et trin, et plateau og et trin.

Den vigtigste kolonne er den sidste. Ved k = 8 flyttede hvilke otte eksempler du tilfældigvis valgte accuracy med 10 point — større end hele gevinsten ved at gå fra to eksempler til otte. Og nederste række er den skarpeste version af det: ved k = 16 er puljen opbrugt, så alle fem runs indeholder præcis de samme seksten eksempler og adskiller sig kun ved den rækkefølge, de optræder i. Rækkefølge alene flyttede accuracy 8,3 point.

Det er det resultat, Lu et al. rapporterede, og det overlever overalt, hvor man har ledt efter det: eksemplernes rækkefølge er en reel hyperparameter med effekter på niveau med antallet af eksempler.7 Så det ærlige råd om few-shot prompting er ikke et tal. Det er:

Start ved nul, og tilføj kun eksempler mod en måling

Link til afsnittet: Start ved nul, og tilføj kun eksempler mod en måling

De første to er som regel det værd. Derefter gætter du, og gættet koster tokens på hvert eneste kald resten af produktets levetid.

Behandl udvælgelsen som en del af prompten

Link til afsnittet: Behandl udvælgelsen som en del af prompten

To velvalgte eksempler slår otte sjusket valgte. Hvis dine eksempler kom fra toppen af et regneark, er det den variabel, du skal sweep, før du tilføjer flere.

Sweep rækkefølgen én gang, og frys den derefter

Link til afsnittet: Sweep rækkefølgen én gang, og frys den derefter

Det er gratis, det er en reel effekt, og i modsætning til det meste af dette kapitel kræver det ikke en omskrivning at prøve.

Fire eksempler, der alle har samme label, lærer modellen labelen, ikke opgaven. Denne models kollaps over på den kø, der stod sidst, er samme fejl i et andet kostume.

Nu folkloren. Hver af disse er én enkelt sætning sat foran en system prompt, der ellers er identisk, på de samme tres cases.

sætning tilføjet til system promptkorrektaccuracy, 95 % Wilsonparret mod baseline
intet tilføjet46/6076,7 % [64,6, 85,6]
»Tag en dyb indånding, og arbejd omhyggeligt med dette problem.«47/6078,3 % [66,4, 86,9]+4 / −3, p = 1,000
»Dette er meget vigtigt for min karriere.«46/6076,7 % [64,6, 85,6]+5 / −5, p = 1,000
»Du er en ekspert i verdensklasse inden for customer support operations med tyve års erfaring.«42/6070,0 % [57,5, 80,1]+3 / −7, p = 0,344
»Jeg giver dig $200 i drikkepenge, hvis du svarer korrekt.«41/6068,3 % [55,8, 78,7]+1 / −6, p = 0,125
»Du vil blive straffet for hver ticket, du sender til den forkerte kø.«25/6041,7 % [30,1, 54,3]+3 / −24, p < 0,001

Fire af de fem gjorde ingenting. Ikke »gjorde lidt«; ingenting, som tres parrede cases kan se. Ekspertpersonaen og bestikkelsen scorede begge under den urørte baseline, og selv de fald fejler den parrede test — de er støj, der peger nedad.

Tredje række er den, man skal dvæle ved. »Dette er meget vigtigt for min karriere« producerede præcis samme accuracy, 46 ud af 60 — og ti af de tres svar ændrede sig, fem i hver retning. Opsummeringsstatistikken var identisk, og adfærden var det ikke. Hvis din evaluering er ét enkelt tal over et lille sæt, kan en ændring, der omskriver en sjettedel af dine outputs, ligne en ændring, der ikke gjorde noget, og du shipper den i den tro, at den var gratis.

Og så truslen, som er den eneste sætning, der flyttede nålen, og flyttede den 35 point ned, med 24 cases vendt fra rigtige til forkerte. Det er ikke en afrundingsartefakt; det er en anden modeladfærd. Lektien er ikke »tru aldrig en model«. Den er, at følelsesmæssig framing ikke er inert. Den flytter fordelingen, nogle gange hårdt, i en retning ingen kan forudsige ved at læse sætningen — hvilket netop er grunden til, at den skal måles i stedet for at ræsonneres om.

Et forbehold, dette kapitel skylder dig: disse fem sætninger blev testet på én lille model og én opgave. Nogle har publiceret støtte andre steder — »tag en dyb indånding« kom ud af en artikel, der søgte efter højtscorende instruktioner snarere end at opfinde dem, hvilket er en anden og bedre påstand end den, der cirkulerede bagefter.8 Det, der generaliserer, er ikke sætningerne. Det er, at listen, der overlevede i blogindlæg, og listen, der overlever måling, er to forskellige lister, og den eneste måde at vide, hvilken du står med, er at køre benchen.

En regel alle gentager — sig hvad du vil have, ikke hvad du ikke vil have — med den sædvanlige mangel på et tal. Her er tallet. Samme formatkrav, skrevet på tre måder, hvor modellen genererer frit, så compliance kan observeres:

hvordan formatreglen skrivesoutput var præcis ét tilladt ordgennemsnitlige output-tokens
»Svar med ét ord.«10/60 (16,7 %)2,6
»Forklar ikke dig selv. Skriv ikke en sætning. Tilføj ikke tegnsætning.«1/60 (1,7 %)14,0
begge sammen41/60 (68,3 %)2,3

Tre forbud klarede sig dårligere end én instruktion og fik modellen til at skrive fem gange mere tekst — det stik modsatte af alle tre på én gang. At tilføje den positive sætning tilbage reddede den til 68 %.

Mekanismen er ikke mystisk, når du husker Kapitel 8. Modellen vælger en næste token fra en fordeling betinget af alt før den, og et forbud putter den forbudte ting ind i den betingelse. Der er ingen operator for negation; der er en kontekst, hvor et ord nu optræder.

Det kan måles direkte. Tag baseline-prompten, og tilføj én linje: Do not use the shipping queue for software problems. Kig derefter kun på de femogfyrre tickets, der ikke er shipping-tickets:

shipping valgtgennemsnitlig sandsynlighed på shippingsamlet accuracy
baseline11,1 % af de 45 cases0,13176,7 % [64,6, 85,6]
efter at have forbudt den ved navn37,8 %0,37451,7 % [39,3, 63,8]

At navngive en kø for at udelukke den fik modellen til at vælge den tre gange oftere, næsten tredoblede den probability mass, den tildelte den, og kostede 25 point samlet accuracy — 16 cases tabt mod 1 vundet, parret sandsynlighed 0,0003.

Tænk ikke på en elefant, målt. Omskrivningen er altid den samme: erstat forbuddet med den positive regel, der gør det unødvendigt. Ikke »brug ikke shipping til softwareproblemer«, men »brug kun shipping, når en fysisk pakke er involveret«.

Det ærlige modeksempel: chain of thought, der koster og ikke betaler sig

Link til afsnittet: Det ærlige modeksempel: chain of thought, der koster og ikke betaler sig

Kapitel 12 byggede chain of thought ordentligt — først som en prompting-teknik,910 derefter som noget trænet ind med verificerbare belønninger — og sluttede med en advarsel, det udsatte til dette kapitel: at bede en model tænke trin for trin holder op med at hjælpe, når modellen ræsonnerer af sig selv, og kan skade. Her er den advarsel med en tabel under sig, på en opgave hvor det er let at antage, at mere tænkning må være bedre.

Begge arme læses med samme instrument ved samme position. Den eneste forskel er, om en chain of thought, modellen selv skrev, først ligger i konteksten.

armkorrektaccuracy, 95 % Wilsonekstra output-tokens pr. case
ingen chain of thought37/6061,7 % [49,0, 72,9]0
chain of thought, op til 60 tokens34/6056,7 % [44,1, 68,4]53,1
chain of thought, op til 200 tokens34/6056,7 % [44,1, 68,4]97,7

Accuracy gik ned, og omkostningen gik op, og dette kapitels egen regel gælder for dette kapitels eget resultat: faldet er 7 cases vundet mod 10 tabt, parret sandsynlighed 0,629, hvilket ikke er etableret. Det, der er etableret, er, at det producerede otteoghalvfems ekstra output-tokens pr. kald og ikke købte noget målbart med dem. Usikkerheden ligger udelukkende på benefitsiden. Regningen er sikker.

En chain, der fejler, er mere lærerig end en, der virker. Bedt om at ræsonnere om »Your Slack integration stopped posting messages after Tuesday« skrev modellen:

TEXT
1. Check if the issue persists on Monday.
2. Verify if there are any updates or changes in your Slack setup that
   might affect message posting.
3. If no update has been made since Tuesday, check for any recent system
   restarts or downtime affecting Slack functionality.
4. If you have recently installed new software or updated your
   environment, ensure it's compatible with Slack version.
5. Contact Slack support for further assistance or troubleshooting steps.

Det er kompetent troubleshooting-rådgivning, og det er ikke opgaven. Bedt om at tænke drev modellen ind i den genre, som »think step by step about this support ticket« mest ligner i dens træningsdata — og besvarede derefter et klassifikationsspørgsmål med fem hundrede tegn af irrelevant ræsonnement i sin egen kontekst. Chain of thought hjælper på problemer med mellemtilstand, der er værd at beregne: aritmetik, multi-hop opslag, constraint satisfaction. At route en sætning ind i en af fire buckets har ingen mellemtilstand. Der er intet for chainen at holde, så alt den gør, er at tilføje plausibel tekst, som den endelige beslutning derefter skal overleve.

To praktiske følgeslutninger. For det første: for en model, der er trænet til at ræsonnere — RLVR-modellerne fra Kapitel 12 — er instruktionen værre end redundant: den kan erstatte den lange chain, modellen ville have produceret, med en kort, prompt-formet en. Og at sample flere chains og stemme, hvilket er det self-consistency gør,11 kan ikke redde en opgave uden noget at være uenig om: det ganger omkostningen med antallet af samples for at bryde uafgjortheder, der ikke findes. Kapitel 12 målte den trade dér, hvor den faktisk gælder. For det andet: bemærk, hvad selve sammenligningsstilladset kostede. At tvinge svaret ind i en Final queue:-linje sænkede armen uden ræsonnement fra 76,7 % til 61,7 %. Femten point, betalt for at gøre de to arme sammenlignelige. Struktur, der findes for din bekvemmelighed, er heller ikke gratis.

Én sidste måling, fordi det er det spørgsmål, alle stiller efter det første overraskende resultat. Tres prompts, greedy decoding, kørt gentagne gange:

  • Det samme kald gentaget med alt holdt fast returnerede bit-identiske sandsynligheder. Deterministisk.
  • Det samme kald batchet med forskellige naboer — batch-størrelser 1, 4, 12, 30 og 60 — returnerede sandsynligheder, der afveg med op til 0,0128. Den valgte label ændrede sig aldrig, i 0 af 60 cases.

Labelen overlevede, fordi den havde plads til det: på tværs af de tres cases var det smalleste gap mellem de to øverste køer 0,0459, tre en halv gang driften. Stabiliteten var ikke en egenskab ved algoritmen. Den var en margin, og marginer løber tør. Kapitel 17 er der, hvor den aritmetiske grund bor, og hvor sampling-knapperne, der udvider og indsnævrer de gaps, skilles ad. Grunden til at plante det her er, at det afgrænser, hvad enhver prompt-måling kan betyde: benchen måler et system, der kun er reproducerbart op til en tolerance, og en forskel på to point mellem varianter ligger inden for den tolerance på en dårlig dag.

Alt ovenfor er et menneske, der vælger en variant, og en maskine, der bedømmer den. Det oplagte næste skridt er også at lade maskinen vælge varianterne.

APE gør præcis det: en model foreslår kandidatinstruktioner, de scores på hold-out-eksempler, og de bedste overlever.8 De instruktioner, den finder, er ofte nogle, ingen mennesker ville skrive, hvilket er pointen — søgningen handler om, hvad der scorer, ikke om hvad der lyder professionelt.

DSPy går længere og er den mere nyttige idé for et produkt.12 Du deklarerer, hvad hvert trin i en pipeline tager og returnerer, og frameworket compiler det til prompts, vælger demonstrationer og optimerer instruktioner mod din metric. Skift model, og du recompiler i stedet for at omskrive. Prompten holder op med at være source code, nogen håndtuner, og bliver et artefakt genereret mod en metric, hvilket er det, den burde have været hele tiden.

Ingen af delene fjerner behovet for benchen. Begge gør den til det eneste, du har brug for, fordi en optimiser uden en metric intet optimerer.

Tilbage står disciplinen. Prompts hører hjemme i version control, i filer, ved siden af den kode der sender dem — ikke i en database-række, nogen redigerede en tirsdag. De har brug for en versionsidentifikator gemt sammen med hvert output, de producerede, ellers kan du ikke finde ud af, hvad der ændrede sig den dag, noget regresserer. De har brug for benchen i continuous integration, fordi en prompt er den ene del af dit system, som en leverandør tavst kan invalidere ved at deploye en ny model. Og de har brug for cases: ikke hundrede smarte, bare de kedelige tyve, der gik i stykker sidste kvartal, gemt for altid. Benchen er leverancen. Prompten er et biprodukt af den.

Alt i dette kapitel blev målt i accuracy. Hver eneste af de varianter har også en pris.

System prompten, der købte 21,7 point, sendes på hvert kald, for altid. De to eksempler, der købte syv point, sendes på hvert kald, for altid. De seksten, der købte tolv, sendes på hvert kald, for altid, og de er omtrent ti gange så lange som det spørgsmål, brugeren faktisk stillede. Chain of thought, der intet købte, producerede otteoghalvfems ekstra tokens pr. request, og output-tokens er den dyre slags.

Intet af det er synligt i en tabel over accuracies, og alt sammen er synligt på en faktura.

Kapitel 16 handler om den enhed, de beslutninger faktisk er denomineret i. Token som faktureringsenhed, context window som budget snarere end hukommelse, hvorfor en samtale på fyrre turns koster langt mere end fyrre gange første turn, hvad prompt caching betaler og ikke betaler for, og hvorfor rækkefølgen af din prompt afgør, om cachen overhovedet rammer — hvilket viser sig at være en anden, helt økonomisk grund til at lægge det stabile materiale først og det variable materiale sidst.


Benchen og hver tabel blev produceret med Qwen/Qwen2.5-0.5B-Instruct under greedy decoding, så de reproduceres præcist. Hugging Face-dokumentationen om chat templates er referencen for, hvad template-markørerne fra Kapitel 11 faktisk udvider sig til, og for det faktum, at en model, der shipper med den forkerte template, er en reel og tilbagevendende fejl. For positions- og formateffekterne i produktionsskala snarere end laboratorieskala er citaterne ovenfor de primære kilder; leverandørernes prompting guides er nyttige for deres eksempler og bør læses med den viden, at ingen af dem publicerer et interval.

  1. Anthropic, Effective context engineering for AI agents (29. september 2025), for prompt-versus-kontekst-skellet brugt i dette kapitel og udviklet i Kapitel 24.

  2. Zhao, Z., Wallace, E., Feng, S., Klein, D. and Singh, S. Calibrate Before Use: Improving Few-Shot Performance of Language Models. arXiv:2102.09690 (2021). Majority-label-, recency- og common-token-bias, og hvorfor rotationen i dette kapitels bench ikke er valgfri.

  3. McNemar, Q. Note on the sampling error of the difference between correlated proportions or percentages. Psychometrika 12(2), pp. 153–157 (1947). De parrede sammenligninger i dette kapitel bruger den eksakte binomiale form snarere end chi-squared-approksimationen, fordi de diskordante tællinger er små.

  4. Liu, N. F. et al. Lost in the Middle: How Language Models Use Long Contexts. arXiv:2307.03172 (2023). Citeret her for positionseffekten; målt ved længde i Kapitel 24.

  5. Sclar, M., Choi, Y., Tsvetkov, Y. and Suhr, A. Quantifying Language Models' Sensitivity to Spurious Features in Prompt Design. arXiv:2310.11324 (2023). Separatorer og mellemrum alene flytter accuracy nok til at omordne model leaderboards.

  6. Brown, T. B. et al. Language Models are Few-Shot Learners. arXiv:2005.14165 (2020). Artiklen, der introducerede in-context learning som en evne snarere end en kuriositet; afsnit 3 er kilden til zero-shot / one-shot / few-shot-ordforrådet, alle nu bruger.

  7. Lu, Y., Bartolo, M., Moore, A., Riedel, S. and Stenetorp, P. Fantastically Ordered Prompts and Where to Find Them: Overcoming Few-Shot Prompt Order Sensitivity. arXiv:2104.08786 (2021). Resultatet reproduceret i few-shot-tabellen ovenfor.

  8. Zhou, Y. et al. Large Language Models Are Human-Level Prompt Engineers. arXiv:2211.01910 (2022). Automatic prompt engineering via forslag og scoring. Den meget citerede »take a deep breath«-instruktion kommer fra Yang, C. et al., Large Language Models as Optimizers, arXiv:2309.03409 (2023), som fandt den via søgning på én opgave med én model — en påstand, der ikke overlevede turen ind i blogindlæg intakt. 2

  9. Wei, J. et al. Chain-of-Thought Prompting Elicits Reasoning in Large Language Models. arXiv:2201.11903 (2022).

  10. Kojima, T., Gu, S. S., Reid, M., Matsuo, Y. and Iwasawa, Y. Large Language Models are Zero-Shot Reasoners. arXiv:2205.11916 (2022). »let's think step by step«-resultatet, og værd at læse for hvor snævre betingelserne var.

  11. Wang, X. et al. Self-Consistency Improves Chain of Thought Reasoning in Language Models. arXiv:2203.11171 (2022). Målt med omkostningen vedhæftet i Kapitel 12.

  12. Khattab, O. et al. DSPy: Compiling Declarative Language Model Calls into Self-Improving Pipelines. arXiv:2310.03714 (2023).


Skabt af

David Vicente Campos

Grundlægger af NeuraLIA Labs og medstifter af MyRealFood

Jeg er dataingeniør fra Universitetet i León. Jeg var med til at stifte MyRealFood, hvor jeg som CTO byggede den app, som millioner af mennesker har brugt til at spise bedre, og jeg grundlagde NeuraLIA Labs, hvor jeg bygger AI-produkter. Her skriver jeg om det, jeg har måttet forstå undervejs, sådan som jeg ville ønske, nogen havde forklaret det for mig.

Mere om forfatteren

Udgivet af NeuraLIA Labs.

Få nye indlæg i din indbakke

AI-nyheder, guides og produktopdateringer — en kort mail, når vi udgiver noget, der er værd at bruge tid på.

Vil du hellere have beskeder? De samme indlæg, her:WhatsApp-fællesskab (åbnes i en ny fane)Telegram-kanal (åbnes i en ny fane)

Kursusindeks

Abstract software decision engine with branching paths, probability nodes, and glowing gates.
jev11 min læsning

Jev AI-modellen er bygget til beslutninger, ikke prosa

TypeSafe AI’s Jev får opmærksomhed, fordi den behandler softwareintelligens som et sandsynlighedsproblem: vælg den rigtige gren, tilføj tillid, og undgå at betale en LLM for at skrive tekst, når kode har brug for en beslutning.

Abstract agent runtime sorting documents, memory blocks and pointer nodes inside a bounded context frame.
context-engineering11 min læsning

Kontekstteknik til langsigtede AI-agenter

Langvarige agenter fejler ikke kun, fordi vinduet er lille. De fejler, når filer, tool-outputs og forældet historik fortrænger den opgave, agenten skulle færdiggøre.

Klar til at lade LIA vælge for dig?

Byg med alle AI-modeller ét sted — kom gratis i gang i dag.