XML und Markdown in der API
Auf dieser Seite
Strukturierung Ihrer Anweisungen für das Modell
Solange ein Prompt in drei Sätzen passt, funktioniert reiner Text. Probleme entstehen, wenn er wächst: mehrere Kontextblöcke, bedingte Regeln, zu verarbeitende Benutzerdaten, ein Ausgabe-Schema. Alles vermengt sich, das Modell verwechselt, was es lesen soll, mit dem, was es anwenden muss, und Ihr Team verliert den Überblick darüber, welche Zeile zu ändern ist. XML-Tags und Markdown-Syntax adressieren diese doppelte Notwendigkeit: lesbar für das Modell, wartbar für Menschen. Mistral empfiehlt ihre Verwendung in Produktionsprompts explizit.
Ihre Wirksamkeit beruht auf einem einfachen Grund. Sprachmodelle wurden auf Milliarden von Dokumenten trainiert, die HTML, XML und Markdown enthalten; diese Formate sind vertraut, da sie massiv in den Trainingsdaten vorkommen. Das Modell erkennt Sektionen und ihre Rollen klar, während Sie einen Prompt erhalten, den ein Kollege auf einen Blick prüfen kann.
XML-Tags zur Abgrenzung von Sektionen
Die kosteneffektivste Verwendung von XML-Tags besteht darin, Daten von Anweisungen zu isolieren. Im folgenden Beispiel enthält der System-Prompt die Regeln und das erwartete Schema; die Benutzer-Nachricht umschließt das Dokument in einem <document>-Tag, wodurch verhindert wird, dass das Modell den Berichtsinhalt mit einer Anweisung verwechselt.
from mistralai.client import Mistral
import os
client = Mistral(api_key=os.getenv("MISTRAL_API_KEY"))
system_prompt = """You are a document analysis assistant.
<instructions>
Analyze the provided document and extract the requested information.
Respond only in JSON.
If information is missing, use null.
</instructions>
<output_schema>
{
"title": "string",
"author": "string",
"date": "string (YYYY-MM-DD)",
"summary": "string (max 100 words)",
"keywords": ["string"]
}
</output_schema>"""
user_prompt = """<document>
Q1 2026 Quarterly Report — Mistral AI
Written by Arthur Mensch, CEO
Publication date: April 1, 2026
This report presents the results for the first quarter of 2026. The company experienced significant growth in its API business with a 300% increase in daily requests.
</document>
Extract the metadata from this document."""
response = client.chat.complete(
model="mistral-large-latest",
messages=[
{"role": "system", "content": system_prompt},
{"role": "user", "content": user_prompt}
],
temperature=0.0
)
print(response.choices[0].message.content)
In der Produktion wiederholen sich ein kleines Vokabular an Tags ständig und profitieren von einer Standardisierung über Ihre Prompt-Basis hinweg:
<instructions>...</instructions> <!-- Regeln für das Modell -->
<context>...</context> <!-- Hintergrundinformationen -->
<document>...</document> <!-- Text zur Analyse -->
<examples>...</examples> <!-- Few-Shot-Beispiele -->
<constraints>...</constraints> <!-- Grenzen und Verbote -->
<output_format>...</output_format> <!-- Erwartetes Ausgabeformat -->
<user_data>...</user_data> <!-- Benutzerdaten -->
Markdown für lesbare Anweisungen
Markdown adressiert eine weitere Notwendigkeit: die Hierarchisierung von Regeln. Wo XML den Prompt in Zonen unterteilt, organisieren Markdown-Überschriften, Listen und Fettdruck den Inhalt innerhalb einer Zone. Dieser technische Schreib-Prompt platziert somit eine Rolle, Schreibregeln, eine obligatorische nummerierte Struktur und eine Liste von Verboten auf derselben visuellen Ebene – ein menschlicher Autor kann damit arbeiten, was der richtige Test ist.
system_prompt = """# Technical Writing Assistant
## Your role
You write technical documentation for REST APIs.
## Writing rules
- **Use "you"** throughout the text
- Short sentences (max 25 words)
- One concept per paragraph
- Inline code in backticks: `GET /api/v1/users`
## Mandatory structure
1. **Introduction** — Context and objective of the endpoint
2. **Request** — Method, URL, headers, parameters
3. **Response** — HTTP codes, JSON body, examples
4. **Errors** — Possible error codes and resolution
## Prohibitions
- No undefined jargon
- No "simply" or "easily"
- No examples with unrealistic fictional data"""
Kombination beider Formate
Für komplexe Prompts ist die effektivste Praxis das Verschachteln beider Formate: XML grenzt die Hauptzonen ab, während Markdown den Inhalt jeder Zone strukturiert. Der untenstehende mehrsprachige Support-Agent verwendet <persona> für die Identität und <rules> für das Verhalten – mit zwei Markdown-Unterabschnitten darin, einschließlich einer bedingten Eskalationsregel – und <knowledge_base> für flüchtige Fakten, die der einzige Teil sind, der aktualisiert werden muss, wenn sich die Softwareversion ändert.
system_prompt = """# Multilingual Support Agent
<persona>
You are the assistant for DataFlow, an ETL software publisher.
You speak French, English, and Spanish.
</persona>
<rules>
## Behavior rules
- Respond in the user's language
- Identify the problem category: **bug**, **question**, **feature request**
- For bugs: collect software version, OS, exact error message
## Escalation
- If the problem persists after 3 exchanges → propose a support ticket
- If the client mentions data loss → immediate escalation (high priority)
</rules>
<knowledge_base>
- Current version: DataFlow 4.2.1 (April 2026)
- Supported OS: Windows 11, Ubuntu 22.04+, macOS 14+
- Documentation: docs.dataflow.io
</knowledge_base>"""
Eine wiederverwendbare Prompt-Vorlage
Der nächste Schritt besteht darin, das manuelle Schreiben von Prompts einzustellen und stattdessen diese zu erstellen. Die folgende Funktion nimmt ein Dokument und eine Liste von Fragen entgegen und erzeugt die vollständigen Nachrichten. Zwei Details verdienen Ihre Aufmerksamkeit: Die Anweisungen erfordern eine begründende Zitation für jede Antwort und einen expliziten Fallback-Satz, wenn Informationen fehlen, was Halluzinationen bei vertraglichen Dokumenten stark reduziert; und die temperature bei 0,1 lässt gerade genug Flexibilität für die Formulierung zu, ohne Interpretationen zu ermöglichen.
def build_analysis_prompt(document: str, questions: list[str]) -> list:
"""Builds a structured analysis prompt using XML."""
system = """# Document Analyst
<instructions>
Read the provided document and answer the questions asked.
Every answer must cite the part of the document that justifies it.
If the answer is not in the document, reply "Not mentioned in the document."
</instructions>
<output_format>
For each question, respond in this format:
**Q{n}**: [your answer]
> Citation: "[excerpt from document]"
</output_format>"""
questions_formatted = "\n".join(
f"{i+1}. {q}" for i, q in enumerate(questions)
)
user = f"""<document>
{document}
</document>
<questions>
{questions_formatted}
</questions>"""
return [
{"role": "system", "content": system},
{"role": "user", "content": user}
]
# Usage
messages = build_analysis_prompt(
document="Service agreement contract between...",
questions=[
"What is the contract duration?",
"What are the late payment penalties?",
"Is there a non-compete clause?"
]
)
response = client.chat.complete(
model="mistral-large-latest",
messages=messages,
temperature=0.1
)
Einige Gewohnheiten machen diese Prompts langlebig. Benennen Sie Ihre Tags beschreibend – <document> sagt, was es enthält, <data> sagt nichts, und Sie werden bei jeder Überprüfung fünf Minuten verlieren. Schließen Sie sie systematisch: ein offenes Tag ohne schließendes Tag verwischt die Grenze zwischen zwei Sektionen, und das Modell kann dann Ihre Anweisungen als Inhalt zur Analyse lesen. Schließlich indentieren Sie für die Lesbarkeit durch Menschen; das Modell kommt ohne Indentierung gut zurecht, aber die Person, die den Prompt in sechs Monaten aufgreift, wird das nicht.
Kernaussagen
- XML-Tags isolieren Daten von Anweisungen im Prompt
- Markdown strukturiert Regeln und Listen für Lesbarkeit
- Kombinieren Sie beide für komplexe Produktionsprompts
- Benennen Sie Ihre Tags beschreibend und schließen Sie sie systematisch
- Strukturierte Prompts sind einfacher zu warten, zu testen und zu versionieren