Alle Guides
Sven Böttger|10. Juni 2026|11 Min.

Der Praxisleitfaden für XML-Prompting

Wie Sie mit strukturierten XML-Prompts vorhersagbare, parsbare und produktionssichere KI-Ausgaben erzeugen

Der Praxisleitfaden für XML-Prompting

Bei myos bauen wir KI-Betriebssysteme für echte Unternehmen. Der Unterschied zwischen einem hübschen Demo und einem belastbaren Produktiv-Workflow entscheidet sich fast immer an einer Stelle: der Struktur des Prompts. XML-Prompting ist eine der zuverlässigsten Methoden, um Modell-Ausgaben vorhersagbar, maschinell auswertbar und sicher in nachgelagerten Code einbindbar zu machen.

Dieser Leitfaden ist unsere Arbeitsreferenz. Wir greifen darauf zurück, wenn wir Extraktions-Pipelines, Routing-Schichten und strukturierte Generierung entwerfen. Sie können die Vorlagen direkt übernehmen oder die Tag-Namen an Ihre Domäne anpassen.

Warum XML für Prompts?

XML eignet sich aus mehreren Gründen besonders gut für Prompts:

  • Klare Struktur: Sie trennen Anweisungen, Kontext, Eingaben und erwartete Ausgaben sauber über Tags.
  • Parser-freundlich: Die Ausgabe lässt sich mit jeder Standard-XML-Bibliothek lesen und ist deutlich robuster als selbstgebaute Trennzeichen.
  • Erweiterbar: Sie können neue Tags ergänzen, ohne ältere zu brechen.
  • Menschlich lesbar: Entwicklerinnen, Entwickler und Fachabteilungen können Prompts gleichermaßen lesen und bearbeiten.

Setzen Sie XML ein, um Ausgaben zu erzwingen, Informationen zu extrahieren, Aufgaben zu routen, Formate durchzusetzen, Few-Shot-Beispiele zu kennzeichnen und Selbstprüfungen laufen zu lassen. Und das alles, ohne verstecktes schrittweises Nachdenken (Chain-of-Thought) zu verlangen.

Faustregel: XML oder JSON?

Wenn Ihre Prompts oder Ausgaben viel Freitext oder Code enthalten, spielt XML seine Stärken aus. Für rein numerische, flache Datenstrukturen kann JSON die kompaktere Wahl sein.

Kernregeln, die Ihnen Ärger ersparen

  1. Erzeugen Sie immer wohlgeformtes XML: ein Wurzel-Tag, jedes Tag geschlossen, keine freistehenden Sonderzeichen im Text (außer maskiert oder in CDATA).
  2. Benennen Sie Tags nach der Domäne: bevorzugen Sie <invoice>, <clause> oder <persona> gegenüber generischem <section1>.
  3. Trennen Sie sauber: Anweisungen, Beispiele, Eingaben und Ausgaben gehören in eigene Blöcke (<instructions>, <examples>, <input>, <output_format>).
  4. Definieren Sie das Verhalten im Fehlerfall: geben Sie ein <error>-Schema vor und legen Sie fest, wann es genutzt wird.
  5. Verzichten Sie auf Chain-of-Thought: verlangen Sie keine schrittweisen Gedankengänge, sondern kurze Begründungen oder Checklisten (etwa <key_points> mit einer Obergrenze).
  6. Nutzen Sie CDATA für Code, JSON, Regex und alles mit geschweiften oder spitzen Klammern.
  7. Geben Sie das Ausgabeschema klar vor: ein <output_format> mit allen Pflicht-Tags und Einschränkungen.
  8. Versionieren Sie Ihre Prompts: ein <meta version="1.2" id="email-reply-v12"/> macht Änderungen nachvollziehbar.
<code><![CDATA[
def add(a, b): return a + b
]]></code>

Ein minimales, wiederverwendbares Grundgerüst

Mit diesem Skelett starten Sie jeden neuen Prompt. Es enthält Metadaten, Aufgabe, Anweisungen, Eingabe, Ausgabeformat und einen Fehler-Handler.

<prompt>
  <meta version="1.0" id="GEN-001"/>
  <task>Fasse einen langen Artikel für eine vielbeschäftigte Führungskraft zusammen.</task>

  <instructions>
    - Schreibe in einfacher Sprache.
    - Halte dich an 120 bis 150 Woerter.
    - Ergaenze 3 stichpunktartige Highlights.
  </instructions>

  <input>
    <article><![CDATA[
      {{ARTIKEL HIER EINFUEGEN}}
    ]]></article>
  </input>

  <output_format>
    <summary>120 bis 150 Woerter.</summary>
    <highlights>
      <bullet>Praegnante Aussage</bullet>
      <bullet>Praegnante Aussage</bullet>
      <bullet>Praegnante Aussage</bullet>
    </highlights>
  </output_format>

  <error_handler>
    Wenn die Eingabe fehlt oder nicht auswertbar ist, gib zurueck:
    <error code="INPUT_INVALID" message="Grund hier"/>
  </error_handler>
</prompt>

Prompt-Bibliothek: sofort einsetzbare Vorlagen

Alle Vorlagen verzichten bewusst auf verstecktes Chain-of-Thought. Übernehmen Sie sie unverändert oder passen Sie die Tag-Namen an Ihre Domäne an.

1) Strukturierte Extraktion

<prompt>
  <task>Extrahiere Firma, Produkt, Preis und Stimmung aus einer Rezension.</task>

  <input>
    <review><![CDATA[
      Ich liebe den Acme Air 2000, nur 249 Dollar und leiser als mein alter Ventilator.
    ]]></review>
  </input>

  <output_format>
    <extraction>
      <company>string</company>
      <product>string</product>
      <price currency="USD">number</price>
      <sentiment one_of="positive|neutral|negative">string</sentiment>
      <key_points max="3">stichpunktartige Phrasen</key_points>
    </extraction>
  </output_format>

  <instructions>
    - Ist ein Feld unbekannt, setze ein leeres Tag (z. B. <price/>).
    - Halte <key_points> auf hoechstens 3 kurze Stichpunkte.
  </instructions>
</prompt>

2) Klassifikation mit festen Labels

<prompt>
  <task>Klassifiziere die Absicht eines Support-Tickets.</task>
  <labels>
    <label id="bug">Fehlermeldung</label>
    <label id="billing">Abrechnung</label>
    <label id="feature">Feature-Wunsch</label>
    <label id="other">Sonstiges</label>
  </labels>
  <input>
    <ticket>Meine Karte wurde diesen Monat zweimal belastet.</ticket>
  </input>
  <output_format>
    <classification>
      <label_id one_of="bug|billing|feature|other">string</label_id>
      <justification max_chars="180">Ein bis zwei Saetze.</justification>
    </classification>
  </output_format>
</prompt>

3) E-Mail-Antwort (professionell und sicher)

<prompt>
  <persona>
    <role>Customer Success Manager</role>
    <tone>Professionell, hilfsbereit, knapp</tone>
    <signature>Viele Gruesse, Alex (Customer Success)</signature>
  </persona>

  <task>Entwirf eine Antwort, die bestaetigt, beantwortet und naechste Schritte vorschlaegt.</task>

  <input>
    <email_from_customer><![CDATA[
      Hallo, ich komme nach dem Zuruecksetzen meines Passworts nicht mehr ins Dashboard.
    ]]></email_from_customer>
  </input>

  <output_format>
    <email>
      <subject>string</subject>
      <body>Klartext, kurze Absaetze</body>
      <next_steps>
        <step>Stichpunkt</step>
      </next_steps>
    </email>
  </output_format>
</prompt>

4) SQL-Generierung mit Schema-Kontext

<prompt>
  <task>Erzeuge eine SQL-Abfrage aus einer natuerlichsprachlichen Frage und einem Schema.</task>
  <schema><![CDATA[
  tables:
    orders(order_id, customer_id, total, created_at)
    customers(customer_id, region)
  ]]></schema>
  <input>
    <question>Gesamtumsatz pro Region fuer das laufende Jahr 2024.</question>
  </input>
  <output_format>
    <sql><![CDATA[
      SELECT ...
    ]]></sql>
    <assumptions max="3">
      <item>kurzer Satz</item>
    </assumptions>
    <safety_checks>
      <check>Sind die Datumsfilter korrekt?</check>
      <check>Verbinden die Joins die richtigen Schluessel?</check>
    </safety_checks>
  </output_format>
</prompt>

5) Meeting-Notizen zu Action Items

<prompt>
  <task>Wandle ein Meeting-Transkript in strukturierte Notizen um.</task>
  <input>
    <transcript><![CDATA[(Transkript einfuegen)]]></transcript>
  </input>
  <output_format>
    <notes>
      <topics>
        <topic>...</topic>
      </topics>
      <decisions>
        <decision>...</decision>
      </decisions>
      <action_items>
        <item owner="Name" due="YYYY-MM-DD">...</item>
      </action_items>
    </notes>
  </output_format>
</prompt>

6) Intent-Routing (Weiche)

<prompt>
  <task>Leite die Nutzereingabe an den richtigen Handler weiter.</task>
  <handlers>
    <handler id="KB_SEARCH">Wissensdatenbank-Suche</handler>
    <handler id="HUMAN_HANDOFF">Uebergabe an Mensch</handler>
    <handler id="ORDER_STATUS">Bestellstatus</handler>
  </handlers>
  <input>
    <utterance>Wo ist meine Bestellung Nr. 1234?</utterance>
  </input>
  <output_format>
    <routing>
      <handler_id one_of="KB_SEARCH|HUMAN_HANDOFF|ORDER_STATUS">ORDER_STATUS</handler_id>
      <entities>
        <order_id>1234</order_id>
      </entities>
      <confidence>0-1</confidence>
    </routing>
  </output_format>
</prompt>

7) Kritisieren und verbessern (Selbstprüfung)

<prompt>
  <task>Kritisiere und verbessere den Entwurf, begrenze die Begruendung.</task>
  <constraints>
    <rationale_limit>120 Zeichen</rationale_limit>
  </constraints>
  <input>
    <draft><![CDATA[(Entwurf einfuegen)]]></draft>
  </input>
  <output_format>
    <improvement>
      <revised><![CDATA[(ueberarbeiteter Text)]]></revised>
      <rationale>max. 120 Zeichen</rationale>
      <checks>
        <check id="clarity">pass|fail</check>
        <check id="tone">pass|fail</check>
        <check id="length">pass|fail</check>
      </checks>
    </improvement>
  </output_format>
</prompt>

Parsing und Validierung

Mit der Python-Standardbibliothek lesen Sie die XML-Ausgabe in wenigen Zeilen aus:

import xml.etree.ElementTree as ET

def parse_extraction(xml_text: str):
    root = ET.fromstring(xml_text)
    ext = root.find('extraction')
    return {
        "company": (ext.findtext('company') or '').strip(),
        "product": (ext.findtext('product') or '').strip(),
        "price": (ext.findtext('price') or '').strip(),
        "sentiment": (ext.findtext('sentiment') or '').strip(),
        "key_points": [e.text.strip() for e in ext.findall('key_points/bullet') if e.text]
    }

Validierungs-Checkliste:

  • Das Wurzel-Tag entspricht der Erwartung.
  • Alle Pflicht-Kinder existieren (nicht leer, sofern leer nicht erlaubt ist).
  • Erlaubte Aufzählungen werden eingehalten (one_of-Attribute).
  • Keine unerwarteten Tags (optional, aber nützlich).

Robustheit und Anti-Patterns

Mit ein paar bewährten Techniken werden Ihre Prompts deutlich stabiler:

Anti-PatternLösung
"Denke Schritt für Schritt und zeige deinen Gedankengang."Fragen Sie nach kurzen Kernpunkten oder einer Checkliste: <key_points max="5">.
Unbenannte oder generische Tags wie <section1>.Domänen-Substantive verwenden: <risks>, <mitigations>, <decision>.
Anweisungen mit Beispielen vermischt.<instructions> und <examples> in getrennte Blöcke.
Freitext-Ausgaben, obwohl Struktur nötig ist.Ein <output_format> mit Pflicht-Kindern vorgeben.
Code ohne CDATA eingebettet.Code, JSON und Regex immer in CDATA kapseln.
Optionale Felder nicht spezifiziert.Festlegen, wie Unbekanntes dargestellt wird (leeres Tag).

FAQ

Warum XML statt Markdown-Überschriften? XML ist maschinell parsbar und konsistent. Markdown ist gut für Menschen, aber mehrdeutig für Maschinen.

Kann ich XML mit Markdown mischen? Ja. Halten Sie die maschinenlesbaren Teile in XML, menschliche Hinweise können als Stichpunkte innerhalb von <instructions> stehen.

Was ist mit Sicherheit und Compliance? Nutzen Sie <checks>, um Regeln wie keine personenbezogenen Daten oder keine medizinische oder rechtliche Beratung zu erzwingen. Bei Verstoß geben Sie ein <error> aus.

Wie vermeide ich ausschweifende Begründungen? Begrenzen Sie sie über Attribute wie max_chars oder max und bevorzugen Sie Checklisten gegenüber Fließtext.

Drei Prinzipien zum Mitnehmen

  • Kurze, spezifische Tag-Namen schlagen clevere.
  • Zeigen Sie pro Prompt ein vollständiges Beispiel, damit das Modell das Format imitiert.
  • Bevorzugen Sie Einschränkungen gegenüber Prosa (maximal 150 Wörter, 3 Stichpunkte, feste Aufzählungen).

Bereit für dein
AI Operating System?

Starte heute, und in wenigen Wochen übernimmt dein erster KI-Mitarbeiter die erste Aufgabe. Wir vergeben nur eine Handvoll Build-Slots pro Monat.

von Menschen.
für Menschen.