Zum Hauptinhalt springen
Lektion 6 von 12 · Bildanalyse und visuelle Erkennung über die API

Mehrere Bilder in einer einzigen Nachricht senden

Lektion 6 von 12 Aktualisiert am 2. November 2026 Entwickler
Auf dieser Seite
  1. Mehrere Bilder gleichzeitig analysieren
  2. Struktur einer Mehr-Bilder-Nachricht
  3. Beispiel: Vergleich zweier Bilder
  4. Durchmischen von Text und Bildern
  5. Batch-Verarbeitung mit Base64
  6. Grenzen von Mehr-Bilder-Aufrufen
  7. Strategie für große Volumina
  8. Kernaussagen

Mehrere Bilder gleichzeitig analysieren

Die Vision API von Mistral ist nicht auf ein Bild pro Nachricht beschränkt. Sie können mehrere Bilder in einem einzigen Aufruf senden, um das Modell zu bitten, sie zu vergleichen, zu synthetisieren oder gemeinsam zu analysieren. Der Unterschied zu zwei separaten Aufrufen ist entscheidend: Bei einem einzigen Aufruf sieht das Modell beide Bilder gleichzeitig und kann über ihre Beziehungen nachdenken – etwas, das eine Aggregation einzelner Antworten niemals leisten könnte.

Diese Fähigkeit erschließt Anwendungsfälle, bei denen die Frage sich auf die Lücke konzentriert, nicht auf den Inhalt: Vergleiche von Vorher/Nachher, Analyse von Dokumentenserien oder visuelle Compliance-Checks.

Struktur einer Mehr-Bilder-Nachricht

Das Prinzip ist einfach: Fügen Sie mehrere image_url-Elemente zum content-Array hinzu:

message = {
    "role": "user",
    "content": [
        {"type": "text", "text": "Vergleichen Sie diese beiden Bilder und beschreiben Sie die Unterschiede."},
        {"type": "image_url", "image_url": "https://example.com/image1.jpg"},
        {"type": "image_url", "image_url": "https://example.com/image2.jpg"}
    ]
}

Homogenität ist nicht erforderlich: Sie können Bilder über URL und Base64 in derselben Nachricht mischen. Dies ist üblich, wenn Sie ein gehostetes Referenzbild mit einem frisch generierten lokalen Datei vergleichen müssen.

Beispiel: Vergleich zweier Bilder

Betrachten Sie eine Inspektion bei der Wareneingangskontrolle. Sie vergleichen ein Referenzfoto des konformen Produkts mit einem Foto des empfangenen Samples unter Verwendung eines System-Prompts, der die Rolle des Inspektors festlegt:

from mistralai.client import Mistral
import os

client = Mistral(api_key=os.environ["MISTRAL_API_KEY"])

response = client.chat.complete(
    model="mistral-large-latest",
    messages=[
        {
            "role": "system",
            "content": "Sie sind ein Experte für Qualitätskontrolle. Vergleichen Sie die bereitgestellten Bilder mit Präzision."
        },
        {
            "role": "user",
            "content": [
                {
                    "type": "text",
                    "text": "Hier sind zwei Fotos desselben Produkts. Das erste ist die Referenz, das zweite ist das empfangene Sample. Identifizieren Sie alle Unterschiede."
                },
                {"type": "image_url", "image_url": "https://example.com/reference.jpg"},
                {"type": "image_url", "image_url": "https://example.com/sample.jpg"}
            ]
        }
    ]
)

print(response.choices[0].message.content)

Der Text gibt die Reihenfolge explizit an – „das erste ist die Referenz” –, da das Modell diese nicht erraten kann.

Durchmischen von Text und Bildern

Dieser Ansatz der Anordnung stößt schnell an seine Grenzen, wenn es sich um mehr als zwei Bilder handelt. Eine robustere Methode besteht darin, jedes Bild kurz vor seiner Bereitstellung zu kennzeichnen, indem Sie text- und image_url-Elemente abwechseln:

response = client.chat.complete(
    model="mistral-large-latest",
    messages=[
        {
            "role": "user",
            "content": [
                {"type": "text", "text": "Hier ist der ursprüngliche Architekturbau:"},
                {"type": "image_url", "image_url": "https://example.com/plan-original.png"},
                {"type": "text", "text": "Und hier ist das Foto des errichteten Gebäudes:"},
                {"type": "image_url", "image_url": "https://example.com/photo-batiment.jpg"},
                {"type": "text", "text": "Entspricht das Gebäude dem Plan? Listen Sie die Diskrepanzen auf."}
            ]
        }
    ]
)

Jedes Bild trägt nun seine eigene Kennzeichnung, und die abschließende Frage erfolgt erst nach Darstellung aller Materialien. Dieses Format verbessert das Verständnis des Modells erheblich: Es weiß, dass der Plan der Standard ist und das Foto das Objekt zur Bewertung. Eine Umkehrung würde zu einem umgekehrten Diskrepanzbericht führen.

Batch-Verarbeitung mit Base64

Für einen Ordner lokaler Bilder wird das Erstellen des content-Arrays programmgesteuert. Sie montieren die Liste in einer Schleife und codieren jede Datei auf dem Laufenden:

import base64
import os
from pathlib import Path
from mistralai.client import Mistral

client = Mistral(api_key=os.environ["MISTRAL_API_KEY"])

def encode_image(path):
    with open(path, "rb") as f:
        b64 = base64.standard_b64encode(f.read()).decode("utf-8")
    ext = Path(path).suffix.lower()
    mime = {"jpg": "jpeg", "jpeg": "jpeg", "png": "png", "webp": "webp"}.get(ext.lstrip("."), "jpeg")
    return f"data:image/{mime};base64,{b64}"

# Laden aller Bilder aus einem Ordner
folder = Path("captures/")
images = sorted(folder.glob("*.png"))

# Aufbau des Nachrichteninhalts
content = [{"type": "text", "text": f"Analysieren Sie diese {len(images)} Screenshots und fassen Sie gemeinsame Elemente zusammen."}]
for img in images[:5]:  # Begrenzung auf maximal 5 Bilder
    content.append({"type": "image_url", "image_url": encode_image(img)})

response = client.chat.complete(
    model="mistral-small-latest",
    messages=[{"role": "user", "content": content}]
)

print(response.choices[0].message.content)

Der Slice images[:5] dient als Sicherheitsvorkehrung des Skripts. Ohne ihn würde ein Ordner mit zweihundert Screenshots vollständig in einen einzigen Aufruf gehen – mit den Konsequenzen, die gleich unten beschrieben werden.

Grenzen von Mehr-Bilder-Aufrufen

Es gibt keine strikt dokumentierte Obergrenze für die Anzahl der Bilder, aber zwei Effekte kombinieren sich ab fünf bis zehn Bildern: Die Analysequalität verschlechtert sich, da die Aufmerksamkeit des Modells über die Bilder verteilt wird, und die Token-Kosten steigen stark an. Erinnern Sie sich an die Größenordnung aus Lektion 2: Jedes Bild verbraucht 800 bis 1.500 Tokens, sodass fünf Bilder bereits 5.000 bis 7.500 Prompt-Tokens darstellen, bevor Ihre Frage überhaupt beginnt. Die Gesamtsumme – Bilder, Text und Antwort – muss auch in das Kontextfenster des Modells passen, eine Obergrenze, die eine Batch-Ansicht von Bildern viel schneller erreicht als ein Textdokument.

Diese Funktion berechnet die Rechnung vor dem Aufruf, nicht danach:

def estimate_multi_image_cost(num_images, tokens_per_image=1000, text_tokens=100, response_tokens=500):
    """Schätzung der Gesamt-Token für einen Mehr-Bilder-Aufruf."""
    total_input = (num_images * tokens_per_image) + text_tokens
    total = total_input + response_tokens

    print(f"Bilder: {num_images} x {tokens_per_image} = {num_images * tokens_per_image} Tokens")
    print(f"Prompt-Text: {text_tokens} Tokens")
    print(f"Geschätzte Antwort: {response_tokens} Tokens")
    print(f"Geschätzte Gesamtsumme: {total} Tokens")
    return total

estimate_multi_image_cost(3)
# Bilder: 3 x 1000 = 3000 Tokens
# Prompt-Text: 100 Tokens
# Geschätzte Antwort: 500 Tokens
# Geschätzte Gesamtsumme: 3600 Tokens

Strategie für große Volumina

Ab fünf Bildern sollten Sie Ihren Ansatz ändern, statt weiterzumachen. Es gibt drei Wege, die oft kombiniert werden: Die sequenzielle Analyse verarbeitet Bilder nacheinander und aggregiert dann die Ergebnisse – die Kosten bleiben linear und die Präzision pro Bild ist maximal. Die Batch-Gruppierung sendet Pakete von drei bis fünf Bildern und bewahrt so einige Vergleiche innerhalb des Batches. Schließlich verwendet die Vorfilterung ein leichteres Modell wie Small, um irrelevante Bilder zu verwerfen, bevor wichtige Fälle an Large weitergegeben werden.

Der erste Weg sieht so aus, mit einer abschließenden Synthese, die nur Text verarbeitet:

# Sequenzielle Analyse mit Aggregation
results = []
for img_path in images:
    response = client.chat.complete(
        model="mistral-small-latest",
        messages=[{
            "role": "user",
            "content": [
                {"type": "text", "text": "Beschreiben Sie den Inhalt dieses Bildes kurz."},
                {"type": "image_url", "image_url": encode_image(img_path)}
            ]
        }]
    )
    results.append(response.choices[0].message.content)

# Finale Synthese (nur Text)
synthesis = client.chat.complete(
    model="mistral-small-latest",
    messages=[{
        "role": "user",
        "content": f"Hier sind Beschreibungen von {len(results)} Bildern:\n\n" +
                   "\n---\n".join(results) +
                   "\n\nBieten Sie eine globale Synthese."
    }]
)

Der Trick liegt im zweiten Aufruf: Er enthält keine Bilder, daher keine visuellen Tokens. Sie synthetisieren fünfzig Bilder zum Preis weniger hundert Text-Token.

Kernaussagen

  • Sie können mehrere Bilder in einer einzigen Nachricht senden, indem Sie mehrere image_url-Elemente hinzufügen.
  • Vermischen Sie Text zwischen den Bildern, um dem Modell Kontext zu geben.
  • Jedes Bild fügt 800–1.500 Tokens hinzu – schätzen Sie Ihre Kosten vor dem Aufruf.
  • Ab fünf Bildern bevorzugen Sie eine sequenzielle oder gebatchte Strategie.
  • URLs und Base64 können in derselben Nachricht gemischt werden.