Prompt engineering is zelden een proces dat in één keer slaagt. De beste prompts ontstaan door iteratie—testen, observeren en verfijnen totdat je de gewenste resultaten bereikt.

<Callout type="info" title="Eerste Versie, Niet Definitieve Versie">
Beschouw je eerste prompt als een ruwe schets. Zelfs ervaren prompt engineers slagen er zelden in om het de eerste keer perfect te doen.
</Callout>

## De Iteratiecyclus

Effectieve promptverfijning volgt een voorspelbare cyclus: schrijven, testen, analyseren en verbeteren. Elke iteratie brengt je dichter bij een prompt die betrouwbaar de resultaten oplevert die je nodig hebt.

<IterativeRefinementDemo />

## Veelvoorkomende Verfijningspatronen

De meeste prompt-mislukkingen vallen in een handvol categorieën. Door deze patronen te leren herkennen, kun je problemen snel diagnosticeren en oplossen zonder helemaal opnieuw te beginnen.

### Probleem: Output Te Lang

Een van de meest voorkomende problemen. Zonder expliciete beperkingen hebben modellen de neiging om grondig te zijn in plaats van beknopt.

<DiffView 
  before="Explain how photosynthesis works."
  after={`Explain how photosynthesis works in 3-4 sentences suitable for a 10-year-old.`}
  beforeLabel="Origineel"
  afterLabel="Verfijnd"
/>

### Probleem: Output Te Vaag

Vage prompts produceren vage outputs. Het model kan niet gedachten lezen over wat "beter" betekent of welke aspecten het belangrijkst voor je zijn.

<DiffView 
  before="Give me tips for better presentations."
  after={`Give me 5 specific, actionable tips for improving technical presentations to non-technical stakeholders. For each tip, include a concrete example.`}
  beforeLabel="Origineel"
  afterLabel="Verfijnd"
/>

### Probleem: Verkeerde Toon

Toon is subjectief en varieert per context. Wat voor het model "professioneel" klinkt, past mogelijk niet bij de stem van je organisatie of de relatie met je ontvanger.

<DiffView 
  before="Write an apology email for missing a deadline."
  after={`Write a professional but warm apology email for missing a project deadline. The tone should be accountable without being overly apologetic. Include a concrete plan to prevent future delays.`}
  beforeLabel="Origineel"
  afterLabel="Verfijnd"
/>

### Probleem: Belangrijke Informatie Ontbreekt

Open verzoeken krijgen open antwoorden. Als je specifieke soorten feedback nodig hebt, moet je er expliciet om vragen.

<DiffView 
  before="Review this code."
  after={`Review this Python code for:
1. Bugs and logical errors
2. Performance issues
3. Security vulnerabilities
4. Code style (PEP 8)

For each issue found, explain the problem and suggest a fix.

[code]`}
  beforeLabel="Origineel"
  afterLabel="Verfijnd"
/>

### Probleem: Inconsistent Formaat

Zonder een sjabloon zal het model elke reactie anders structureren, waardoor vergelijking moeilijk wordt en automatisering onmogelijk.

<DiffView 
  before="Analyze these three products."
  after={`Analyze these three products using this exact format for each:

## [Product Name]
**Price:** $X
**Pros:** [bullet list]
**Cons:** [bullet list]
**Best For:** [one sentence]
**Rating:** X/10

[products]`}
  beforeLabel="Origineel"
  afterLabel="Verfijnd"
/>

## Systematische Verfijningsaanpak

Willekeurige wijzigingen verspillen tijd. Een systematische aanpak helpt je problemen snel te identificeren en efficiënt op te lossen.

### Stap 1: Diagnosticeer het Probleem

Voordat je iets verandert, identificeer wat er daadwerkelijk mis is. Gebruik deze diagnostische tabel om symptomen aan oplossingen te koppelen:

<div className="my-4 grid gap-2">
  <div className="grid grid-cols-3 gap-2 p-3 bg-muted/50 rounded-lg text-sm">
    <span className="font-semibold">Symptoom</span>
    <span className="font-semibold">Waarschijnlijke Oorzaak</span>
    <span className="font-semibold">Oplossing</span>
  </div>
  <div className="grid grid-cols-3 gap-2 p-3 bg-red-50 dark:bg-red-950/20 rounded-lg text-sm">
    <span>Te lang</span>
    <span className="text-muted-foreground">Geen lengtebeperking</span>
    <span className="text-green-600 dark:text-green-400">Voeg woord-/zinlimieten toe</span>
  </div>
  <div className="grid grid-cols-3 gap-2 p-3 bg-red-50 dark:bg-red-950/20 rounded-lg text-sm">
    <span>Te kort</span>
    <span className="text-muted-foreground">Ontbreekt detailverzoek</span>
    <span className="text-green-600 dark:text-green-400">Vraag om uitwerking</span>
  </div>
  <div className="grid grid-cols-3 gap-2 p-3 bg-red-50 dark:bg-red-950/20 rounded-lg text-sm">
    <span>Niet relevant</span>
    <span className="text-muted-foreground">Vage instructies</span>
    <span className="text-green-600 dark:text-green-400">Wees specifieker</span>
  </div>
  <div className="grid grid-cols-3 gap-2 p-3 bg-red-50 dark:bg-red-950/20 rounded-lg text-sm">
    <span>Verkeerd formaat</span>
    <span className="text-muted-foreground">Formaat niet gespecificeerd</span>
    <span className="text-green-600 dark:text-green-400">Definieer exacte structuur</span>
  </div>
  <div className="grid grid-cols-3 gap-2 p-3 bg-red-50 dark:bg-red-950/20 rounded-lg text-sm">
    <span>Verkeerde toon</span>
    <span className="text-muted-foreground">Doelgroep niet duidelijk</span>
    <span className="text-green-600 dark:text-green-400">Specificeer doelgroep/stijl</span>
  </div>
  <div className="grid grid-cols-3 gap-2 p-3 bg-red-50 dark:bg-red-950/20 rounded-lg text-sm">
    <span>Inconsistent</span>
    <span className="text-muted-foreground">Geen voorbeelden gegeven</span>
    <span className="text-green-600 dark:text-green-400">Voeg few-shot voorbeelden toe</span>
  </div>
</div>

### Stap 2: Maak Gerichte Wijzigingen

Weersta de drang om alles te herschrijven. Het tegelijkertijd wijzigen van meerdere variabelen maakt het onmogelijk om te weten wat hielp en wat schadde. Maak één wijziging, test deze en ga dan verder:

```
Iteratie 1: Voeg lengtebeperking toe
Iteratie 2: Specificeer formaat
Iteratie 3: Voeg voorbeeld toe
Iteratie 4: Verfijn tooninstructies
```

### Stap 3: Documenteer Wat Werkt

Kennis over prompt engineering gaat gemakkelijk verloren. Houd een logboek bij van wat je hebt geprobeerd en waarom. Dit bespaart tijd wanneer je later terugkeert naar de prompt of vergelijkbare uitdagingen tegenkomt:

```markdown
## Prompt: Klant E-mail Reactie

### Versie 1 (te formeel)
"Write a response to this customer complaint."

### Versie 2 (betere toon, nog steeds geen structuur)
"Write a friendly but professional response to this complaint. 
Show empathy first."

### Versie 3 (definitief - goede resultaten)
"Write a response to this customer complaint. Structure:
1. Acknowledge their frustration (1 sentence)
2. Apologize specifically (1 sentence)  
3. Explain solution (2-3 sentences)
4. Offer additional help (1 sentence)

Tone: Friendly, professional, empathetic but not groveling."
```

## Praktijkvoorbeeld van Iteratie

Laten we een complete iteratiecyclus doorlopen om te zien hoe elke verfijning voortbouwt op de vorige. Let op hoe elke versie specifieke tekortkomingen van de vorige aanpakt.

### Taak: Genereer Productnamen

<VersionDiff versions={[
  {
    label: "Versie 1",
    content: "Generate names for a new productivity app.",
    note: "Te generiek, geen context"
  },
  {
    label: "Versie 2",
    content: `Generate names for a new productivity app. The app uses AI to automatically schedule your tasks based on energy levels and calendar availability.`,
    note: "Context toegevoegd, nog steeds generiek"
  },
  {
    label: "Versie 3",
    content: `Generate 10 unique, memorable names for a productivity app with these characteristics:
- Uses AI to schedule tasks based on energy levels
- Target audience: busy professionals aged 25-40
- Brand tone: modern, smart, slightly playful
- Avoid: generic words like "pro", "smart", "AI", "task"

For each name, explain why it works.`,
    note: "Beperkingen en redenering toegevoegd"
  },
  {
    label: "Versie 4 (definitief)",
    content: `Generate 10 unique, memorable names for a productivity app.

Context:
- Uses AI to schedule tasks based on energy levels
- Target: busy professionals, 25-40
- Tone: modern, smart, slightly playful

Requirements:
- 2-3 syllables maximum
- Easy to spell and pronounce
- Available as .com domain (check if plausible)
- Avoid: generic words (pro, smart, AI, task, flow)

Format:
Name | Pronunciation | Why It Works | Domain Availability Guess`,
    note: "Gestructureerd formaat, specifieke vereisten"
  }
]} />

## Verfijningsstrategieën per Taaktype

Verschillende taken falen op voorspelbare manieren. Het kennen van de veelvoorkomende faalwijzen helpt je problemen sneller te diagnosticeren en op te lossen.

### Voor Contentgeneratie

Contentgeneratie produceert vaak generieke, niet-gerichte of slecht geformatteerde output. De oplossing omvat meestal specifieker zijn over beperkingen, concrete voorbeelden geven of je merkstem expliciet definiëren.

<InfoGrid items={[
  { icon: "target", title: "Te Generiek", description: "Voeg specifieke beperkingen en context toe", example: "\"Write about dogs\" → \"Write about golden retrievers for first-time owners, focusing on training and exercise needs\"" },
  { icon: "scissors", title: "Te Lang", description: "Stel woord-/alinealimieten in", example: "Voeg toe: \"Keep response under 150 words\" of \"Maximum 3 paragraphs\"" },
  { icon: "palette", title: "Verkeerde Stijl", description: "Geef stijlvoorbeelden", example: "\"Write in the style of this example: [paste sample text]\"" },
  { icon: "megaphone", title: "Niet On-Brand", description: "Voeg richtlijnen voor merkstem toe", example: "\"Use friendly, casual tone. Avoid jargon. Address reader as 'you'.\"" }
]} />

### Voor Codegeneratie

Code-output kan technisch falen (syntaxfouten, verkeerde taalfuncties) of architecturaal (slechte patronen, ontbrekende gevallen). Technische problemen vereisen versie-/omgevingsspecificaties; architecturale problemen vereisen ontwerpbegeleiding.

<InfoGrid items={[
  { icon: "code", title: "Syntaxfouten", description: "Specificeer taalversie", example: "\"Use Python 3.11+ syntax with type hints\" of \"ES2022 JavaScript\"" },
  { icon: "git-branch", title: "Verkeerde Aanpak", description: "Beschrijf gewenste patronen", example: "\"Use functional approach, avoid classes\" of \"Follow repository pattern\"" },
  { icon: "shield", title: "Ontbrekende Randgevallen", description: "Som scenario's op om af te handelen", example: "\"Handle: empty input, null values, network timeouts, invalid formats\"" },
  { icon: "tag", title: "Slechte Naamgeving", description: "Voeg naamgevingsconventies toe", example: "\"Use camelCase for variables, PascalCase for classes, UPPER_SNAKE for constants\"" }
]} />

### Voor Analyse

Analysetaken produceren vaak oppervlakkige of ongestructureerde resultaten. Begeleid het model met specifieke frameworks (SWOT, Porter's Five Forces), vraag om meerdere standpunten of geef een sjabloon voor de outputstructuur.

<InfoGrid items={[
  { icon: "layers", title: "Te Oppervlakkig", description: "Vraag om specifieke frameworks", example: "\"Analyze using SWOT framework\" of \"Apply Porter's Five Forces\"" },
  { icon: "scale", title: "Bevooroordeeld", description: "Vraag om meerdere perspectieven", example: "\"Present arguments for and against\" of \"Include skeptic's viewpoint\"" },
  { icon: "database", title: "Ontbrekende Data", description: "Specificeer wat te analyseren", example: "\"Focus on: market size, growth rate, key players, entry barriers\"" },
  { icon: "layout", title: "Ongestructureerd", description: "Geef analysesjabloon", example: "\"Format as: Summary → Key Findings → Implications → Recommendations\"" }
]} />

### Voor Vraag & Antwoord

Vraag-en-antwoord kan te beknopt of te uitgebreid zijn, en mist mogelijk betrouwbaarheidsindicatoren of bronnen. Specificeer het detailniveau dat je nodig hebt en of je citaties of uitdrukking van onzekerheid wilt.

<InfoGrid items={[
  { icon: "plus", title: "Te Kort", description: "Vraag om uitwerking", example: "\"Explain in detail with examples\" of \"Elaborate on each point\"" },
  { icon: "minus", title: "Te Lang", description: "Vraag om beknopt antwoord", example: "\"Answer in 2-3 sentences\" of \"Give me the TL;DR\"" },
  { icon: "help-circle", title: "Onzeker", description: "Vraag om betrouwbaarheidsniveau", example: "\"Rate your confidence 1-10\" of \"Note any assumptions made\"" },
  { icon: "link", title: "Zonder Bron", description: "Vraag om citaties", example: "\"Cite sources for claims\" of \"Include references where possible\"" }
]} />

## De Feedbackloop-Techniek

Hier is een metatechniek: gebruik het model zelf om je prompts te helpen verbeteren. Deel wat je hebt geprobeerd, wat je kreeg en wat je wilde. Het model kan vaak verbeteringen voorstellen waar je niet aan had gedacht.

```
I used this prompt:
"[your prompt]"

And got this output:
"[model output]"

I wanted something more [describe gap]. How should I modify 
my prompt to get better results?
```

## A/B Testen van Prompts

Voor prompts die herhaaldelijk of op schaal worden gebruikt, kies niet zomaar de eerste die werkt. Test variaties om de meest betrouwbare en hoogste kwaliteit aanpak te vinden.

```
Prompt A: "Summarize this article in 3 bullet points."
Prompt B: "Extract the 3 most important insights from this article."
Prompt C: "What are the key takeaways from this article? List 3."
```

Voer elke meerdere keren uit en vergelijk:
- Consistentie van output
- Kwaliteit van informatie
- Relevantie voor je behoeften

## Wanneer Stoppen met Itereren

Perfectie is de vijand van goed genoeg. Weet wanneer je prompt klaar is voor gebruik en wanneer je alleen maar polijst voor afnemende opbrengsten.

<div className="my-6 grid md:grid-cols-2 gap-4">
  <div className="border rounded-lg bg-green-50/50 dark:bg-green-950/20 border-green-200 dark:border-green-900">
    <p className="text-sm font-semibold text-green-700 dark:text-green-400 px-4 pt-3 flex items-center gap-2 m-0!"><IconCheck className="h-4 w-4" /> Klaar voor Lancering</p>
    <div className="text-sm p-4 pt-2 space-y-1">
      <p className="m-0!">Output voldoet consistent aan vereisten</p>
      <p className="m-0!">Randgevallen worden correct afgehandeld</p>
      <p className="m-0!">Formaat is betrouwbaar en te parseren</p>
      <p className="m-0!">Verdere verbeteringen tonen afnemende opbrengsten</p>
    </div>
  </div>
  <div className="border rounded-lg bg-red-50/50 dark:bg-red-950/20 border-red-200 dark:border-red-900">
    <p className="text-sm font-semibold text-red-700 dark:text-red-400 px-4 pt-3 flex items-center gap-2 m-0!"><IconX className="h-4 w-4" /> Blijf Itereren</p>
    <div className="text-sm p-4 pt-2 space-y-1">
      <p className="m-0!">Output is inconsistent tussen runs</p>
      <p className="m-0!">Randgevallen veroorzaken fouten</p>
      <p className="m-0!">Kritieke vereisten worden gemist</p>
      <p className="m-0!">Je hebt niet genoeg variaties getest</p>
    </div>
  </div>
</div>

## Versiebeheer voor Prompts

Prompts zijn code. Behandel elke prompt die in productie wordt gebruikt met dezelfde zorgvuldigheid: versiebeheer, changelogs en de mogelijkheid om terug te draaien als iets kapotgaat.

<Callout type="tip" title="Ingebouwd Versiebeheer">
prompts.chat bevat automatische versiegeschiedenis voor je prompts. Elke bewerking wordt opgeslagen, zodat je versies kunt vergelijken en eerdere iteraties met één klik kunt herstellen.
</Callout>

Voor zelfbeheerde prompts, gebruik een mappenstructuur:

```
prompts/
├── customer-response/
│   ├── v1.0.txt    # Initiële versie
│   ├── v1.1.txt    # Toonprobleem opgelost
│   ├── v2.0.txt    # Grote herstructurering
│   └── current.txt # Symlink naar actieve versie
└── changelog.md    # Documenteer wijzigingen
```

## Samenvatting

<Callout type="tip" title="Belangrijkste Punten">
Begin eenvoudig, observeer zorgvuldig, verander één ding tegelijk, documenteer wat werkt en weet wanneer je moet stoppen. De beste prompts worden niet geschreven—ze worden ontdekt door systematische iteratie.
</Callout>

<Quiz 
  question="Wat is de beste aanpak bij het verfijnen van een prompt die verkeerde resultaten produceert?"
  options={[
    "Herschrijf de hele prompt vanaf nul",
    "Voeg meer voorbeelden toe totdat het werkt",
    "Verander één ding tegelijk en test elke wijziging",
    "Maak de prompt zo lang mogelijk"
  ]}
  correctIndex={2}
  explanation="Door één ding tegelijk te veranderen kun je isoleren wat werkt en wat niet. Als je meerdere dingen tegelijk verandert, weet je niet welke wijziging het probleem oploste of welke het erger maakte."
/>

## Oefening: Verbeter Deze Prompt

Probeer zelf deze zwakke prompt te verbeteren. Bewerk deze en gebruik dan AI om je versie met het origineel te vergelijken:

<BeforeAfterEditor
  title="Verfijn Deze E-mail Prompt"
  badPrompt="Write an email."
  idealPrompt={`You are a professional business writer.

Task: Write a follow-up email to a potential client after a sales meeting.

Context:
- Met with Sarah Chen, VP of Marketing at TechCorp
- Discussed our analytics platform
- She expressed interest in the reporting features
- Meeting was yesterday

Requirements:
- Professional but warm tone
- Reference specific points from our meeting
- Include a clear next step (schedule a demo)
- Keep under 150 words

Format: Subject line + email body`}
  task="Transformeer deze vage e-mail prompt naar iets dat een professioneel, effectief resultaat zal opleveren."
/>

In het volgende hoofdstuk verkennen we JSON en YAML prompting voor gestructureerde data-toepassingen.
