Aller au contenu principal

Prompts multimodaux avec images

Mis à jour le 29 juillet 2026

Capacités vision

Tous les modèles Claude actuels possèdent des capacités de vision qui leur permettent de comprendre et d’analyser des images. Vous pouvez donc fournir à la fois du texte et des images dans vos prompts, ce qui ouvre une catégorie entière de cas d’usage : lire une facture scannée, commenter un graphique, décrire une photo de produit, transcrire un document manuscrit. Techniquement, rien de nouveau n’est à apprendre du côté de l’API — c’est le même appel messages.create(), avec une seule différence dans la façon de composer le contenu.

Format des messages avec images

Jusqu’à présent, votre content était une chaîne de caractères. Il peut aussi être une liste de blocs, chacun typé. Cette forme est strictement équivalente à la précédente quand elle ne contient qu’un bloc de texte :

messages = [
    {
        "role": "user",
        "content": [
            {"type": "text", "text": "Raconte-moi une histoire"},
        ]
    }
]

L’intérêt apparaît dès qu’un second type entre en jeu. Un bloc image porte une clé source qui décrit d’où viennent les données, ici encodées directement dans la requête en base64.

messages = [
    {
        "role": "user",
        "content": [
            {
                "type": "image",
                "source": {
                    "type": "base64",
                    "media_type": "image/jpeg",
                    "data": "<donnees_base64>"
                }
            }
        ]
    }
]

Le champ media_type doit correspondre au format réel du fichier, sous peine d’erreur : les formats supportés sont image/jpeg, image/png, image/gif et image/webp.

Encoder une image locale

L’encodage base64 transforme les octets binaires du fichier en une chaîne de caractères transmissible dans du JSON. Deux lignes suffisent, à condition d’ouvrir le fichier en mode binaire avec "rb" et de décoder le résultat en utf-8 pour obtenir une chaîne Python plutôt qu’une séquence d’octets.

import base64

with open("mon_image.jpg", "rb") as f:
    image_data = base64.standard_b64encode(f.read()).decode("utf-8")

Image seule vs image + texte

Vous pouvez envoyer une image sans aucun texte : Claude la décrira spontanément, mais selon son propre angle, qui ne sera pas forcément le vôtre. Sur une photo d’étagère de magasin, il vous parlera peut-être de l’ambiance du rayon quand vous attendiez la liste des références visibles. Pour des résultats précis, combinez toujours l’image et une consigne explicite dans le même message.

messages = [
    {
        "role": "user",
        "content": [
            {
                "type": "image",
                "source": {
                    "type": "base64",
                    "media_type": "image/jpeg",
                    "data": image_data
                }
            },
            {"type": "text", "text": "Décris cette image en detail."}
        ]
    }
]

Plusieurs images

Rien ne vous limite à une seule image : ajoutez autant de blocs image que nécessaire dans le content. Un conseil pratique s’impose alors, car sans repère Claude peut confondre les sources dans sa réponse. Avec certains modèles, labellisez chaque image avec un bloc texte qui la précède — « Image 1 », « Image 2 », et ainsi de suite — pour de meilleurs résultats. Vous pourrez ensuite formuler des consignes qui s’y réfèrent sans ambiguïté, du type « quelles différences entre l’image 1 et l’image 3 ? ».

Images depuis une URL

Pour des images distantes, l’API n’ira pas les chercher à votre place. Récupérez-les avec une bibliothèque HTTP puis encodez-les exactement comme un fichier local.

import httpx
import base64

url = "https://example.com/image.jpg"
image_bytes = httpx.get(url).content
image_data = base64.standard_b64encode(image_bytes).decode("utf-8")

Fonction helper

Ces quelques lignes reviennent à chaque image, et rien n’est plus propice aux erreurs que de recopier un media_type à la main. Une fonction utilitaire déduit le type MIME du chemin du fichier et renvoie un bloc prêt à insérer dans n’importe quel content.

import base64
import mimetypes

def image_block_from_path(path):
    mime_type = mimetypes.guess_type(path)[0]
    with open(path, "rb") as f:
        data = base64.standard_b64encode(f.read()).decode("utf-8")
    return {
        "type": "image",
        "source": {
            "type": "base64",
            "media_type": mime_type,
            "data": data
        }
    }

Bonnes pratiques pour la vision

Soyez spécifique

Comme pour les prompts texte, la précision améliore les résultats — et l’écart est encore plus marqué sur une image, où l’ambiguïté visuelle s’ajoute à l’ambiguïté de la consigne. Prenons une demande banale : « combien de personnes ? » sur une photo de foule. Vous obtiendrez un nombre, sans savoir comment il a été obtenu ni ce qu’il inclut. Guidez plutôt Claude en lui demandant de réfléchir étape par étape, en précisant qu’il est un expert en comptage, et surtout en mentionnant les cas limites : que faire des personnes partiellement visibles au bord du cadre ou masquées par un poteau ? En traitant explicitement ces cas dans votre prompt, vous transformez une estimation opaque en un décompte que vous pouvez vérifier.

Utilisez des exemples

Le few-shot prompting que vous avez vu sur du texte fonctionne aussi avec les images. Fournissez dans l’historique de conversation un exemple complet — une image accompagnée de la réponse exactement telle que vous l’attendez —, puis envoyez la nouvelle image à analyser. C’est la méthode la plus efficace pour imposer un format de sortie stable, par exemple lorsque chaque analyse doit remplir les mêmes champs pour alimenter une base de données.

Exercice

Mettez tout cela au service d’une tâche réaliste : la transcription et le résumé d’un document dont vous n’avez que les pages en images. Envoyez chaque page à Claude pour transcription, combinez les transcriptions obtenues, puis demandez-lui un résumé non technique du document complet. Le découpage page par page n’est pas un détail — il maintient chaque appel dans un périmètre où la transcription reste fidèle, avant que la synthèse ne travaille sur le texte reconstitué.