Promptteknik til AI · Lektion

Kompilering og optimering af prompts

BootstrapFewShot, MIPRO og andre DSPy-optimeringsværktøjer i praksis.

Lektion 3 af 413 trin

Kompilering og optimering af prompts er en gratis Promptteknik til AI-lektion på CoddyKit. Dette er lektion 3 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Promptteknik til AI, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Promptteknik til AI-kurset indeholder 4 lektioner i alt.

Hvad optimering betyder i DSPy

DSPys optimering (kaldet kompilering) finder den bedste promptkonfiguration til dit program ud fra et træningssæt og en metrik. Optimeringsværktøjet søger blandt mulige few-shot-eksempler, instruktioner og demonstrationer af ræsonnering.

Du kører kompileringen én gang, gemmer resultatet og udruller det optimerede program. Ved inferens er der kun hurtige LLM-kald — ingen yderligere optimeringsomkostning.

Definition af en metrikfunktion

Alle DSPy-optimeringsværktøjer har brug for en metrikfunktion, der bedømmer en forudsigelse ud fra den forventede uddata. Den returnerer et tal eller en boolsk værdi — højere er bedre.

Metrikken er det signal, optimeringsværktøjet bruger til at afgøre, om en promptkonfiguration er god.

# Metric: exact match on answer field
def exact_match_metric(example, prediction, trace=None):
    """
    example: a training example with .answer
    prediction: the module's output with .answer
    Returns 1.0 if correct, 0.0 otherwise
    """
    expected = example.answer.strip().lower()
    predicted = prediction.answer.strip().lower()
    return float(expected == predicted)

# Metric: F1 score for token overlap (common in QA)
def token_f1_metric(example, prediction, trace=None):
    gold_tokens = set(example.answer.lower().split())
    pred_tokens = set(prediction.answer.lower().split())
    if not pred_tokens:
        return 0.0
    precision = len(gold_tokens & pred_tokens) / len(pred_tokens)
    recall = len(gold_tokens & pred_tokens) / len(gold_tokens)
    if precision + recall == 0:
        return 0.0
    return 2 * precision * recall / (precision + recall)

Forberedelse af et træningssæt

DSPy har brug for et træningssæt med dspy.Example-objekter. Hvert eksempel angiver inddataene og den forventede uddata. Selv 20-50 eksempler er ofte nok til BootstrapFewShot.

import dspy

# Build training examples
trainset = [
    dspy.Example(
        question='What is the capital of Germany?',
        answer='Berlin'
    ).with_inputs('question'),

    dspy.Example(
        question='Who wrote Romeo and Juliet?',
        answer='William Shakespeare'
    ).with_inputs('question'),

    dspy.Example(
        question='What year did World War II end?',
        answer='1945'
    ).with_inputs('question'),
    # ... add more examples
]

print(f'Training set size: {len(trainset)} examples')
print(trainset[0].question, '->', trainset[0].answer)

BootstrapFewShot-optimeringsværktøjet

BootstrapFewShot er det mest almindelige optimeringsværktøj i DSPy. Det kører dit program på træningssættet, indsamler vellykkede spor (par af inddata og uddata, hvor metrikken godkender resultatet) og bruger disse spor som few-shot-demonstrationer i den kompilerede prompt.

import dspy
from dspy.teleprompt import BootstrapFewShot

# Define your program
class QA(dspy.Signature):
    """Answer factual questions."""
    question: str = dspy.InputField()
    answer: str = dspy.OutputField()

program = dspy.ChainOfThought(QA)

# Set up the optimizer
optimizer = BootstrapFewShot(
    metric=exact_match_metric,
    max_bootstrapped_demos=4,   # Up to 4 few-shot examples per predictor
    max_labeled_demos=4,        # Use labeled examples directly if available
)

# Compile!
compiled_program = optimizer.compile(program, trainset=trainset)
print('Compilation complete')

MIPRO-optimeringsværktøjet

MIPRO (Multi-prompt Instruction Proposal and Optimization) er et mere avanceret optimeringsværktøj. Det vælger ikke kun few-shot-eksempler, men søger også efter bedre instruktionstekst, der kan medtages i prompten.

MIPRO kræver flere LLM-kald under kompileringen, men opnår ofte en markant højere nøjagtighed.

import dspy
from dspy.teleprompt import MIPROv2

class QA(dspy.Signature):
    """Answer factual questions."""
    question: str = dspy.InputField()
    answer: str = dspy.OutputField()

program = dspy.ChainOfThought(QA)

# MIPRO: optimizes both instructions AND few-shot examples
optimizer = MIPROv2(
    metric=exact_match_metric,
    auto='medium',      # 'light' / 'medium' / 'heavy' for optimization budget
    num_threads=4,      # Parallel evaluation threads
)

compiled_program = optimizer.compile(
    program,
    trainset=trainset,
    num_trials=20,       # Number of candidate prompts to evaluate
)
print('MIPRO compilation complete')

Sådan ser en kompileret prompt ud

Efter kompilering indlejrer DSPy optimerede few-shot-demonstrationer i prompten. Du kan undersøge dette ved at se på det kompilerede programs forudsigere.

import dspy

# After compiling, inspect the optimized state
compiled_program = dspy.ChainOfThought('question -> answer')
# (Assume this was returned by optimizer.compile(...))

# Inspect the demos that were found
for demo in compiled_program.demos:
    print('Input:', demo.question)
    print('Reasoning:', demo.get('reasoning', 'N/A'))
    print('Answer:', demo.answer)
    print('---')

# Save the compiled state
compiled_program.save('compiled_qa_program.json')
print('Saved compiled program')

Grænsefladen teleprompter.compile()

Alle DSPy-optimeringsværktøjer deler den samme grænseflade med compile(). Denne ensartethed betyder, at du kan skifte optimeringsværktøj uden at ændre din programkode.

from dspy.teleprompt import BootstrapFewShot, MIPROv2, COPRO

# All optimizers use the same interface:
# compiled = optimizer.compile(program, trainset=trainset)

# BootstrapFewShot: fast, uses successful traces as demos
opt1 = BootstrapFewShot(metric=exact_match_metric)

# MIPRO: slower, optimizes instructions too
opt2 = MIPROv2(metric=exact_match_metric, auto='light')

# COPRO: coordinate descent over instruction proposals
opt3 = COPRO(metric=exact_match_metric, depth=3)

# Swap between them with one line change:
compiled = opt1.compile(program, trainset=trainset)
# or: compiled = opt2.compile(program, trainset=trainset)

BootstrapFewShotWithRandomSearch

BootstrapFewShotWithRandomSearch udvider BootstrapFewShot ved at generere mange mulige demonstrationssæt og vælge det bedst præsterende på et valideringssæt.

Det er et godt kompromis mellem BootstrapFewShots enkelhed og MIPROs styrke.

from dspy.teleprompt import BootstrapFewShotWithRandomSearch

# Split data into train and validation
trainset = examples[:40]
devset = examples[40:60]

optimizer = BootstrapFewShotWithRandomSearch(
    metric=exact_match_metric,
    max_bootstrapped_demos=4,
    num_candidate_programs=8,  # Try 8 different demo sets
    num_threads=4,
)

compiled_program = optimizer.compile(
    program,
    trainset=trainset,
    valset=devset,  # Picks the best program based on validation
)
print('Best program selected from 8 candidates')

Overvejelser om kompileringsomkostninger

Kompilering foretager ekstra LLM-kald for at generere og evaluere mulige prompter. Planlæg budgettet derefter:

  • BootstrapFewShot: cirka 1-2 gange størrelsen på dit træningssæt i LLM-kald
  • RandomSearch med 8 kandidater: cirka 8-10 gange så mange
  • MIPRO mellem: cirka 30-50 gange så mange

Kør kompileringen offline, gem resultatet, og udrul det gemte program. Omkostningen ved inferens i produktion er uændret.

Validering af det kompilerede program

Efter kompilering skal du altid evaluere på et separat afprøvningssæt for at bekræfte, at det optimerede program faktisk generaliserer. Se ikke kun på ydeevnen på træningssættet.

import dspy

# Evaluate on test set
evaluate = dspy.Evaluate(
    devset=testset,
    metric=exact_match_metric,
    num_threads=4,
    display_progress=True,
)

# Compare uncompiled vs compiled
uncompiled_score = evaluate(uncompiled_program)
compiled_score = evaluate(compiled_program)

print(f'Uncompiled accuracy: {uncompiled_score:.1%}')
print(f'Compiled accuracy:   {compiled_score:.1%}')
print(f'Improvement: +{compiled_score - uncompiled_score:.1%}')

Sæt det hele sammen

En komplet arbejdsgang til DSPy-optimering: definér signaturen → opbyg modulet → forbered træningsdata → vælg optimeringsværktøj → kompilér → evaluér → gem. Det er hele forløbet fra idé til en optimeret promptarbejdsgang, der er klar til produktion.

import dspy
from dspy.teleprompt import BootstrapFewShot

# 1. Configure LM
dspy.configure(lm=dspy.LM('openai/gpt-4o-mini', api_key='sk-...'))

# 2. Define signature and module
class QA(dspy.Signature):
    """Answer questions accurately."""
    question: str = dspy.InputField()
    answer: str = dspy.OutputField()

program = dspy.ChainOfThought(QA)

# 3. Compile
optimizer = BootstrapFewShot(metric=exact_match_metric)
compiled = optimizer.compile(program, trainset=trainset)

# 4. Save
compiled.save('production_qa.json')
print('Production program ready')

Videnstjek: BootstrapFewShot

Hvad bruger BootstrapFewShot fra dit træningssæt til at forbedre den kompilerede prompt?

Opsummering: Kompilering og optimering

DSPy-optimering søger efter den bedste promptkonfiguration ved hjælp af en metrikfunktion og et træningssæt. BootstrapFewShot finder gode few-shot-demonstrationer fra vellykkede spor. MIPROv2 søger desuden efter bedre instruktionstekst. Alle optimeringsværktøjer deler grænsefladen compile(program, trainset=...). Kompilering er en engangsudgift offline — gem resultatet med program.save(), og udrul det optimerede program uden optimeringsomkostninger ved inferens.

Gratis at komme i gang

Lær Promptteknik til AI med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
53
Lektioner
199

Ofte stillede spørgsmål

Er lektionen “Kompilering og optimering af prompts” gratis?

Ja — alle 3 lektioner i læringssporet Promptteknik til AI, inklusive “Kompilering og optimering af prompts”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Promptteknik til AI-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Kompilering og optimering af prompts”?

BootstrapFewShot, MIPRO og andre DSPy-optimeringsværktøjer i praksis. Du øver dig i Promptteknik til AI med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Promptteknik til AI?

Der kræves ingen tidligere erfaring. Promptteknik til AI på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 3 af 4.

Hvor lang tid tager lektionen “Kompilering og optimering af prompts”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Promptteknik til AI-lektion?

Ja. Alle Promptteknik til AI-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Introduktion til DSPy-frameworket
  2. Definition af signaturer og moduler
  3. Kompilering og optimering af prompts
  4. Evaluering af DSPy-pipelines
← Tilbage til Promptteknik til AI