Konsistente, gut formatierte Ausgaben zu erhalten ist essentiell für Produktionsanwendungen und effiziente Workflows. Dieses Kapitel behandelt Techniken zur genauen Kontrolle, wie KI-Modelle ihre Antworten formatieren.

<Callout type="info" title="Von Prosa zu Daten">
Strukturierte Ausgabe transformiert KI-Antworten von Freitext in verwertbare, parsbare Daten.
</Callout>

## Warum Struktur wichtig ist

<StructuredOutputDemo />

## Grundlegende Formatierungstechniken

### Listen

Listen sind perfekt für Schritt-für-Schritt-Anleitungen, Ranglisten oder Sammlungen zusammengehöriger Punkte. Sie sind leicht zu überfliegen und zu parsen. Verwende **nummerierte Listen** wenn die Reihenfolge wichtig ist (Schritte, Rankings) und **Aufzählungspunkte** für ungeordnete Sammlungen.

<TryIt 
  compact
  title="Listen-Formatierung"
  prompt={`Gib 5 Tipps für besseren Schlaf.

Format: Nummerierte Liste mit kurzer Erklärung für jeden.
Jeder Tipp sollte fett sein, gefolgt von einem Bindestrich und Erklärung.`}
/>

<Callout type="tip" title="Listen Best Practices">
Gib die genaue Anzahl der gewünschten Elemente an, ob Erklärungen enthalten sein sollen, und ob Elemente fett oder in einer bestimmten Struktur sein sollen.
</Callout>

### Tabellen

Tabellen eignen sich hervorragend zum Vergleichen mehrerer Elemente über dieselben Dimensionen. Sie sind ideal für Funktionsvergleiche, Datenzusammenfassungen und jede Information mit konsistenten Attributen. Definiere immer explizit deine Spaltenüberschriften.

<TryIt 
  compact
  title="Tabellen-Formatierung"
  prompt={`Vergleiche die Top 4 Python Web-Frameworks.

Formatiere als Markdown-Tabelle mit Spalten:
| Framework | Beste Für | Lernkurve | Performance |`}
/>

<Callout type="tip" title="Tabellen Best Practices">
Gib Spaltennamen, erwartete Datentypen (Text, Zahlen, Bewertungen) und wie viele Zeilen du brauchst an. Für komplexe Vergleiche beschränke dich auf 4-6 Spalten für bessere Lesbarkeit.
</Callout>

### Überschriften und Abschnitte

Überschriften schaffen eine klare Dokumentstruktur, die lange Antworten übersichtlich und organisiert macht. Verwende sie für Berichte, Analysen oder jede mehrteilige Antwort. Hierarchische Überschriften (##, ###) zeigen Beziehungen zwischen Abschnitten.

```
Analysiere diesen Geschäftsvorschlag.

Strukturiere deine Antwort mit diesen Abschnitten:
## Zusammenfassung
## Stärken
## Schwächen
## Empfehlungen
## Risikobewertung
```

<Callout type="tip" title="Abschnitte Best Practices">
Liste deine Abschnitte in der gewünschten Reihenfolge auf. Für Konsistenz gib an, was jeder Abschnitt enthalten soll (z.B. "Zusammenfassung: nur 2-3 Sätze").
</Callout>

### Betonung mit Großbuchstaben-Direktiven

Großgeschriebene Wörter wirken als starke Signale für das Modell und betonen kritische Einschränkungen oder Anforderungen. Verwende sie sparsam für maximale Wirkung—Übernutzung verwässert ihre Effektivität.

**Häufige Großbuchstaben-Direktiven:**

<InfoGrid items={[
  { label: "NIEMALS", description: "Absolutes Verbot: \"NIEMALS persönliche Meinungen einbeziehen\"", color: "red" },
  { label: "IMMER", description: "Pflichtanforderung: \"IMMER Quellen zitieren\"", color: "green" },
  { label: "WICHTIG", description: "Kritische Anweisung: \"WICHTIG: Antworten unter 100 Wörtern halten\"", color: "amber" },
  { label: "NICHT", description: "Starkes Verbot: \"Statistiken NICHT erfinden\"", color: "red" },
  { label: "MUSS", description: "Erforderliche Aktion: \"Ausgabe MUSS gültiges JSON sein\"", color: "blue" },
  { label: "NUR", description: "Einschränkung: \"Gib NUR den Code zurück, keine Erklärungen\"", color: "purple" },
]} />

```
Fasse diesen Artikel zusammen.

WICHTIG: Halte die Zusammenfassung unter 100 Wörtern.
NIEMALS Informationen hinzufügen, die nicht im Original vorhanden sind.
IMMER den ursprünglichen Ton und die Perspektive beibehalten.
Füge NICHT deine eigenen Meinungen oder Analysen hinzu.
```

<Callout type="warning" title="Sparsam verwenden">
Wenn alles großgeschrieben oder als kritisch markiert ist, sticht nichts hervor. Reserviere diese Direktiven für wirklich wichtige Einschränkungen.
</Callout>

## JSON-Ausgabe

JSON (JavaScript Object Notation) ist das beliebteste Format für strukturierte KI-Ausgaben. Es ist maschinenlesbar, wird von Programmiersprachen breit unterstützt und ist perfekt für APIs, Datenbanken und Automatisierungs-Workflows. Der Schlüssel zu zuverlässigem JSON ist ein klares Schema.

### Einfache JSON-Anfrage

Beginne mit einer Vorlage, die die genaue gewünschte Struktur zeigt. Füge Feldnamen, Datentypen und Beispielwerte hinzu. Dies wirkt als Vertrag, dem das Modell folgen wird.

<TryIt 
  title="JSON-Extraktion"
  description="Extrahiere strukturierte Daten aus unstrukturiertem Text."
  prompt={`Extrahiere Informationen aus diesem Text und gib sie als JSON zurück:

{
    "firmenname": "string",
    "gruendungsjahr": number,
    "hauptsitz": "string",
    "mitarbeiter": number,
    "branche": "string"
}

Text: "Apple Inc., gegründet 1976, hat seinen Hauptsitz in Cupertino, Kalifornien. Der Technologieriese beschäftigt weltweit etwa 164.000 Mitarbeiter."`}
/>

### Komplexe JSON-Strukturen

Für verschachtelte Daten verwende hierarchisches JSON mit Objekten in Objekten, Arrays von Objekten und gemischten Typen. Definiere jede Ebene klar und verwende TypeScript-artige Annotationen (`"positiv" | "negativ"`) um Werte einzuschränken.

```
Analysiere diese Produktbewertung und gib JSON zurück:

{
  "bewertungs_id": "string (generiere eindeutig)",
  "sentiment": {
    "gesamt": "positiv" | "negativ" | "gemischt" | "neutral",
    "score": 0.0-1.0
  },
  "aspekte": [
    {
      "aspekt": "string (z.B. 'preis', 'qualität')",
      "sentiment": "positiv" | "negativ" | "neutral",
      "erwahnungen": ["exakte Zitate aus der Bewertung"]
    }
  ],
  "kaufabsicht": {
    "wuerde_empfehlen": boolean,
    "konfidenz": 0.0-1.0
  },
  "schluesselphrasen": ["string-Array mit bemerkenswerten Phrasen"]
}

Gib NUR gültiges JSON zurück, keinen zusätzlichen Text.

Bewertung: "[Bewertungstext]"
```

### Gültiges JSON sicherstellen

Modelle fügen manchmal erklärenden Text oder Markdown-Formatierung um JSON hinzu. Verhindere dies mit expliziten Anweisungen zum Ausgabeformat. Du kannst rohes JSON oder JSON in Code-Blöcken anfordern—wähle basierend auf deinen Parsing-Anforderungen.

Füge explizite Anweisungen hinzu:

```
WICHTIG:
- Gib NUR das JSON-Objekt zurück, keine Markdown-Code-Blöcke
- Stelle sicher, dass alle Strings korrekt escaped sind
- Verwende null für fehlende Werte, nicht undefined
- Validiere, dass die Ausgabe parseables JSON ist
```

Oder fordere Code-Blöcke an, indem du das Modell bittest, seine Ausgabe zu umschließen:

````
Gib das Ergebnis als JSON-Code-Block zurück:
```json
{ ... }
```
````

## YAML-Ausgabe

YAML ist menschenlesbarer als JSON und verwendet Einrückung statt Klammern. Es ist der Standard für Konfigurationsdateien (Docker, Kubernetes, GitHub Actions) und funktioniert gut, wenn die Ausgabe von Menschen gelesen oder in DevOps-Kontexten verwendet wird. YAML ist einrückungssensitiv, also sei spezifisch über Formatierungsanforderungen.

<TryIt 
  compact
  title="YAML-Generierung"
  prompt={`Generiere einen GitHub Actions Workflow für ein Node.js-Projekt.

Gib als gültiges YAML zurück:
- Einbeziehen: Install, Lint, Test, Build-Stufen
- Verwende Node.js 18
- Cache npm Dependencies
- Ausführen bei Push auf main und Pull Requests`}
/>

## XML-Ausgabe

XML wird immer noch für viele Enterprise-Systeme, SOAP-APIs und Legacy-Integrationen benötigt. Es ist ausführlicher als JSON, bietet aber Funktionen wie Attribute, Namespaces und CDATA-Abschnitte für komplexe Daten. Gib Elementnamen, Verschachtelungsstruktur und wo Attribute vs. Kind-Elemente verwendet werden sollen an.

```
Konvertiere diese Daten in XML-Format:

Anforderungen:
- Root-Element: <katalog>
- Jedes Element in <buch>-Element
- Attribute wo angemessen einbeziehen
- CDATA für Beschreibungstext verwenden

Daten: [Buchdaten]
```

## Benutzerdefinierte Formate

Manchmal passen Standardformate nicht zu deinen Anforderungen. Du kannst jedes benutzerdefinierte Format definieren, indem du eine klare Vorlage bereitstellst. Benutzerdefinierte Formate funktionieren gut für Berichte, Logs oder domänenspezifische Ausgaben, die von Menschen gelesen werden.

### Strukturiertes Analyseformat

Verwende Trennzeichen (===, ---, [ABSCHNITT]) um übersichtliche Dokumente mit klaren Grenzen zwischen Abschnitten zu erstellen. Dieses Format ist großartig für Code-Reviews, Audits und Analysen.

```
Analysiere diesen Code mit diesem exakten Format:

=== CODE-ANALYSE ===

[ZUSAMMENFASSUNG]
Ein Absatz Überblick

[PROBLEME]
• KRITISCH: [Problem] — [datei:zeile]
• WARNUNG: [Problem] — [datei:zeile]  
• INFO: [Problem] — [datei:zeile]

[METRIKEN]
Komplexität: [Niedrig/Mittel/Hoch]
Wartbarkeit: [score]/10
Testabdeckung: [geschätzt %]

[EMPFEHLUNGEN]
1. [Priorität 1 Empfehlung]
2. [Priorität 2 Empfehlung]

=== ENDE ANALYSE ===
```

### Lückentext-Format

Vorlagen mit Lücken (___) leiten das Modell an, spezifische Felder auszufüllen und dabei exakte Formatierung beizubehalten. Dieser Ansatz ist ausgezeichnet für Formulare, Briefings und standardisierte Dokumente, bei denen Konsistenz wichtig ist.

```
Vervollständige diese Vorlage für das gegebene Produkt:

PRODUKT-BRIEF
─────────────
Name: _______________
Slogan: _______________
Zielnutzer: _______________
Gelöstes Problem: _______________
Hauptmerkmale:
  1. _______________
  2. _______________
  3. _______________
Alleinstellungsmerkmal: _______________

Produkt: [Produktbeschreibung]
```

## Typisierte Antworten

Typisierte Antworten definieren Kategorien oder Entitätstypen, die das Modell erkennen und kennzeichnen soll. Diese Technik ist essentiell für Named Entity Recognition (NER), Klassifizierungsaufgaben und jede Extraktion, bei der du Informationen konsistent kategorisieren musst. Definiere deine Typen klar mit Beispielen.

<TryIt 
  compact
  title="Entitäts-Extraktion"
  prompt={`Extrahiere Entitäten aus diesem Text.

Entitätstypen:
- PERSON: Vollständige Namen von Personen
- ORG: Organisations-/Firmennamen
- ORT: Städte, Länder, Adressen
- DATUM: Daten im ISO-Format (YYYY-MM-DD)
- GELD: Geldbeträge mit Währung

Formatiere jede als: [TYP]: [wert]

Text: "Tim Cook kündigte an, dass Apple bis Dezember 2024 1 Milliarde Dollar in eine neue Austin-Anlage investieren wird."`}
/>

## Mehrteilige strukturierte Antworten

Wenn du umfassende Ausgaben benötigst, die mehrere Aspekte abdecken, definiere verschiedene Teile mit klaren Grenzen. Gib genau an, was in jeden Teil gehört—Format, Länge und Inhaltstyp. Dies verhindert, dass das Modell Abschnitte vermischt oder Teile auslässt.

```
Recherchiere dieses Thema und liefere:

### TEIL 1: ZUSAMMENFASSUNG
[2-3 Sätze Überblick]

### TEIL 2: HAUPTERKENNTNISSE
[Genau 5 Aufzählungspunkte]

### TEIL 3: DATENTABELLE
| Metrik | Wert | Quelle |
|--------|------|--------|
[Mindestens 5 Zeilen]

### TEIL 4: EMPFEHLUNGEN
[Nummerierte Liste mit 3 umsetzbaren Empfehlungen]

### TEIL 5: WEITERFÜHRENDE LEKTÜRE
[3 vorgeschlagene Ressourcen mit kurzen Beschreibungen]
```

## Bedingte Formatierung

Bedingte Formatierung ermöglicht es dir, verschiedene Ausgabeformate basierend auf den Eigenschaften der Eingabe zu definieren. Dies ist mächtig für Klassifizierung, Triage und Routing-Systeme, bei denen das Antwortformat basierend auf dem, was das Modell erkennt, variieren sollte. Verwende klare wenn/dann-Logik mit expliziten Ausgabevorlagen für jeden Fall.

<TryIt 
  compact
  title="Ticket-Klassifizierung"
  prompt={`Klassifiziere dieses Support-Ticket.

Falls DRINGEND (System ausgefallen, Sicherheitsproblem, Datenverlust):
  Antwort: 🔴 DRINGEND | [Kategorie] | [Vorgeschlagene Aktion]

Falls HOCH (betrifft mehrere Nutzer, Umsatzauswirkung):
  Antwort: 🟠 HOCH | [Kategorie] | [Vorgeschlagene Aktion]

Falls MITTEL (einzelner Nutzer betroffen, Workaround existiert):
  Antwort: 🟡 MITTEL | [Kategorie] | [Vorgeschlagene Aktion]

Falls NIEDRIG (Fragen, Feature-Anfragen):
  Antwort: 🟢 NIEDRIG | [Kategorie] | [Vorgeschlagene Aktion]

Ticket: "Ich kann mich nicht in mein Konto einloggen. Ich habe zweimal versucht mein Passwort zurückzusetzen, bekomme aber immer noch einen Fehler. Das blockiert mein gesamtes Team vom Zugriff auf das Dashboard."`}
/>

## Arrays und Listen in JSON

Das Extrahieren mehrerer Elemente in Arrays erfordert sorgfältige Schema-Definition. Gib die Array-Struktur an, was jedes Element enthalten soll, und wie Randfälle behandelt werden (leere Arrays, einzelne Elemente). Ein Zählfeld hilft bei der Vollständigkeitsprüfung.

```
Extrahiere alle Aktionspunkte aus diesem Meeting-Transkript.

Gib als JSON-Array zurück:
{
  "aktionspunkte": [
    {
      "aufgabe": "string, der die Aufgabe beschreibt",
      "zustaendig": "Personenname oder 'Nicht zugewiesen'",
      "deadline": "Datum falls genannt, sonst null",
      "prioritaet": "hoch" | "mittel" | "niedrig",
      "kontext": "relevantes Zitat aus dem Transkript"
    }
  ],
  "gesamt_anzahl": number
}

Transkript: "[Meeting-Transkript]"
```

## Validierungsanweisungen

Selbstvalidierung fordert das Modell auf, seine eigene Ausgabe vor dem Antworten zu überprüfen. Dies fängt häufige Probleme wie fehlende Abschnitte, Platzhaltertext oder Einschränkungsverletzungen ab. Das Modell wird intern iterieren um Probleme zu beheben, was die Ausgabequalität ohne zusätzliche API-Aufrufe verbessert.

```
Generiere den Bericht, dann:

VALIDIERUNGS-CHECKLISTE:
□ Alle erforderlichen Abschnitte vorhanden
□ Kein Platzhaltertext verblieben
□ Alle Statistiken mit Quellen
□ Wortanzahl innerhalb 500-700 Wörter
□ Fazit bezieht sich auf Einleitung zurück

Falls eine Prüfung fehlschlägt, vor dem Antworten korrigieren.
```

## Umgang mit optionalen Feldern

Reale Daten haben oft fehlende Werte. Weise das Modell explizit an, wie mit optionalen Feldern umzugehen ist—`null` zu verwenden ist sauberer als leere Strings und einfacher programmatisch zu verarbeiten. Verhindere auch "Halluzination" fehlender Daten, indem du betonst, dass das Modell niemals Informationen erfinden soll.

```
Extrahiere Kontaktinformationen. Verwende null für fehlende Felder.

{
  "name": "string (erforderlich)",
  "email": "string oder null",
  "telefon": "string oder null", 
  "firma": "string oder null",
  "rolle": "string oder null",
  "linkedin": "URL-string oder null"
}

WICHTIG: 
- Erfinde niemals Informationen, die nicht in der Quelle sind
- Verwende null, nicht leere Strings, für fehlende Daten
- Telefonnummern wenn möglich im E.164-Format
```

## Zusammenfassung

<Callout type="tip" title="Schlüsseltechniken">
Sei explizit über das Format, verwende Beispiele, gib Typen an, behandle Randfälle mit null-Werten, und bitte das Modell seine eigene Ausgabe zu validieren.
</Callout>

<Quiz 
  question="Was ist der Hauptvorteil von strukturierter gegenüber unstrukturierter Ausgabe?"
  options={[
    "Sie verwendet weniger Tokens",
    "Sie ist einfacher für die KI zu generieren",
    "Sie kann programmatisch geparst und validiert werden",
    "Sie produziert immer korrekte Informationen"
  ]}
  correctIndex={2}
  explanation="Strukturierte Ausgaben wie JSON können von Code geparst, über Abfragen hinweg verglichen, in Workflows integriert und auf Vollständigkeit validiert werden—Dinge, die mit Freitext schwierig oder unmöglich sind."
/>

Strukturierte Ausgaben sind essentiell für den Aufbau zuverlässiger KI-gestützter Anwendungen. Im nächsten Kapitel erkunden wir Chain-of-Thought-Prompting für komplexe Denkaufgaben.
