Schémas de raisonnement multimodal
Ancrer les affirmations textuelles dans des images et synthétiser un contexte multimodal provenant de plusieurs sources.
Schémas de raisonnement multimodal est une leçon AI Agents gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage AI Agents, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours AI Agents comprend 4 leçons au total.
Raisonnement multimodal
Le raisonnement multimodal intervient lorsqu’un agent doit réconcilier des informations provenant de deux modalités ou plus — texte, images, graphiques ou tableaux — qui peuvent être concordantes, contradictoires ou complémentaires. Exemple : le texte d’un rapport indique que les revenus ont augmenté de 20 %, mais le graphique joint montre une ligne stable.
L’agent doit déterminer quelle source est correcte ou signaler la divergence pour un examen humain.
Ancrage du texte dans l’image
L’ancrage du texte dans l’image consiste à vérifier que les affirmations formulées dans le texte peuvent être confirmées visuellement dans une image associée. Par exemple : la description du produit correspond-elle à la photo du produit ? Le document mentionne-t-il un tableau qui apparaît réellement dans l’image ?
import anthropic
import base64
def ground_text_in_image(
text_claim: str,
image_path: str
) -> dict:
client = anthropic.Anthropic(api_key='YOUR_API_KEY')
with open(image_path, 'rb') as f:
b64 = base64.standard_b64encode(f.read()).decode('utf-8')
prompt = (
f'Text claim: "{text_claim}"\n\n'
'Does the image above support, contradict, or partially support this claim?\n'
'Return JSON: {"verdict": "support|contradict|partial|insufficient_evidence", '
'"confidence": 0.0, "evidence": "..."}'
)
response = client.messages.create(
model='claude-opus-4-5', max_tokens=256,
messages=[{'role': 'user', 'content': [
{'type': 'image', 'source': {'type': 'base64',
'media_type': 'image/jpeg', 'data': b64}},
{'type': 'text', 'text': prompt}
]}]
)
import json
return json.loads(response.content[0].text)Détection des contradictions entre graphique et texte
Un scénario courant dans le monde réel : le texte d’un rapport financier affirme une chose, mais le graphique intégré au document raconte une autre histoire. L’agent peut extraire visuellement les données du graphique et les comparer aux affirmations numériques du texte.
def compare_chart_to_text(
chart_image_path: str,
text_with_claims: str
) -> dict:
import anthropic, base64, json
client = anthropic.Anthropic(api_key='YOUR_API_KEY')
with open(chart_image_path, 'rb') as f:
b64 = base64.standard_b64encode(f.read()).decode('utf-8')
prompt = (
'The following text makes claims about data.\n'
f'TEXT: {text_with_claims}\n\n'
'Compare the chart image to the text claims. '
'List any contradictions and agreements. '
'Return JSON: {"agreements": [str], "contradictions": [str], '
'"verdict": "consistent|inconsistent|partial"}'
)
response = client.messages.create(
model='claude-opus-4-5', max_tokens=512,
messages=[{'role': 'user', 'content': [
{'type': 'image', 'source': {'type': 'base64',
'media_type': 'image/jpeg', 'data': b64}},
{'type': 'text', 'text': prompt}
]}]
)
return json.loads(response.content[0].text)Stratégies de combinaison des signaux
Lorsque les signaux provenant de plusieurs modalités concordent, augmentez le niveau de confiance. Lorsqu’ils divergent, appliquez une stratégie de résolution des conflits : faites davantage confiance à la source la plus structurée (pour les nombres, les graphiques priment sur le texte), signalez le cas pour un examen humain ou demandez au LLM de déterminer quelle source est la plus fiable.
SIGNAL_SOURCES = {
'chart': 0.9, # high trust for quantitative data
'table': 0.85,
'photo': 0.8,
'prose': 0.6, # lower trust — may be imprecise or outdated
'caption': 0.7
}
def combine_signals(signals: list) -> dict:
"""
signals: list of {'source': str, 'claim': str, 'supports': bool}
Returns weighted verdict.
"""
support_weight = 0.0
total_weight = 0.0
for sig in signals:
w = SIGNAL_SOURCES.get(sig['source'], 0.5)
total_weight += w
if sig['supports']:
support_weight += w
confidence = support_weight / total_weight if total_weight > 0 else 0.0
return {
'confidence': round(confidence, 3),
'verdict': 'supported' if confidence >= 0.6 else 'contested',
'needs_review': 0.4 <= confidence < 0.6
}
if __name__ == '__main__':
signals = [
{'source': 'chart', 'claim': 'Revenue grew 20%', 'supports': True},
{'source': 'prose', 'claim': 'Revenue grew 20%', 'supports': False},
]
print(combine_signals(signals))
Chaîne de vérification du texte par rapport à l’image
Une chaîne de vérification de produit fonctionne ainsi : à partir d’une description du produit et de sa photo, vérifiez que chaque attribut essentiel mentionné dans le texte est visible dans l’image. Renvoyez un rapport structuré indiquant les correspondances et les divergences.
def verify_product_description(
description: str,
product_image_path: str
) -> dict:
import anthropic, base64, json
client = anthropic.Anthropic(api_key='YOUR_API_KEY')
with open(product_image_path, 'rb') as f:
b64 = base64.standard_b64encode(f.read()).decode('utf-8')
prompt = (
f'Product description:\n{description}\n\n'
'For each attribute mentioned in the description (color, shape, material, '
'size, features), check whether it is visible in the product photo.\n'
'Return JSON: {"verified": [{"attribute": str, "status": str}], '
'"unverified": [str], "overall_match": float}\n'
'status: confirmed / contradicted / not_visible\n'
'overall_match: 0.0-1.0'
)
response = client.messages.create(
model='claude-opus-4-5', max_tokens=512,
messages=[{'role': 'user', 'content': [
{'type': 'image', 'source': {'type': 'base64',
'media_type': 'image/jpeg', 'data': b64}},
{'type': 'text', 'text': prompt}
]}]
)
return json.loads(response.content[0].text)Recouper un document et une image
Lors de l’analyse de documents numérisés, le texte issu de l’OCR et l’image sous-jacente existent tous deux. Recoupez-les : le texte extrait correspond-il à ce qui est visuellement présent ? Les divergences peuvent indiquer des erreurs d’OCR à corriger.
def crossref_ocr_with_image(
ocr_text: str,
document_image_path: str
) -> dict:
import anthropic, base64, json
client = anthropic.Anthropic(api_key='YOUR_API_KEY')
with open(document_image_path, 'rb') as f:
b64 = base64.standard_b64encode(f.read()).decode('utf-8')
prompt = (
f'The OCR system produced this text from the document image:\n\n'
f'{ocr_text}\n\n'
'Compare the OCR text to what you actually see in the image. '
'Identify any OCR errors, missed text, or hallucinated characters.\n'
'Return JSON: {"ocr_errors": [{"incorrect": str, "correct": str}], '
'"missed_sections": [str], "accuracy_estimate": float}'
)
response = client.messages.create(
model='claude-opus-4-5', max_tokens=512,
messages=[{'role': 'user', 'content': [
{'type': 'image', 'source': {'type': 'base64',
'media_type': 'image/jpeg', 'data': b64}},
{'type': 'text', 'text': prompt}
]}]
)
return json.loads(response.content[0].text)Agent de raisonnement multisource
Un agent de raisonnement multisource recueille systématiquement les éléments probants de chaque modalité, combine les signaux et produit une conclusion finale accompagnée d’un niveau de confiance. Il indique quelles sources étayent sa conclusion et lesquelles la contredisent.
def multi_source_reasoning(
claim: str,
evidence_sources: list # list of {'type': 'text'|'image', 'content': str|path}
) -> dict:
import anthropic, base64, json
client = anthropic.Anthropic(api_key='YOUR_API_KEY')
content_blocks = [
{'type': 'text',
'text': f'Evaluate this claim using ALL sources below:\nClaim: "{claim}"\n'}
]
for i, src in enumerate(evidence_sources):
if src['type'] == 'text':
content_blocks.append(
{'type': 'text', 'text': f'Source {i+1} (text): {src["content"]}'}
)
elif src['type'] == 'image':
with open(src['content'], 'rb') as f:
b64 = base64.standard_b64encode(f.read()).decode('utf-8')
content_blocks.append(
{'type': 'text', 'text': f'Source {i+1} (image):'}
)
content_blocks.append(
{'type': 'image', 'source': {'type': 'base64',
'media_type': 'image/jpeg', 'data': b64}}
)
content_blocks.append({'type': 'text', 'text':
'Return JSON: {"verdict": str, "confidence": float, '
'"supporting_sources": [int], "contradicting_sources": [int]}'
})
response = client.messages.create(
model='claude-opus-4-5', max_tokens=512,
messages=[{'role': 'user', 'content': content_blocks}]
)
return json.loads(response.content[0].text)Générer des faits à partir d’une image
Vous disposez parfois d’une image à partir de laquelle vous devez générer des faits structurés pour un raisonnement textuel ultérieur. Extrayez les données quantitatives des graphiques et des tableaux au format JSON afin de pouvoir les vérifier mathématiquement par rapport aux affirmations du texte.
def extract_facts_from_chart(chart_path: str) -> dict:
import anthropic, base64, json
client = anthropic.Anthropic(api_key='YOUR_API_KEY')
with open(chart_path, 'rb') as f:
b64 = base64.standard_b64encode(f.read()).decode('utf-8')
prompt = (
'Extract all quantitative data from this chart. '
'Return JSON with: chart_type, x_axis_label, y_axis_label, '
'and data_points as [{label: str, value: float}].\n'
'Also extract any trend: increasing/decreasing/stable/volatile.'
)
response = client.messages.create(
model='claude-opus-4-5', max_tokens=512,
messages=[{'role': 'user', 'content': [
{'type': 'image', 'source': {'type': 'base64',
'media_type': 'image/jpeg', 'data': b64}},
{'type': 'text', 'text': prompt}
]}]
)
return json.loads(response.content[0].text)Routage selon un seuil de confiance
Après le raisonnement multimodal, orientez le résultat en fonction du niveau de confiance : niveau élevé → approbation automatique, niveau moyen → signalement pour un examen facultatif, niveau faible → transmission à un humain. N’approuvez jamais automatiquement des signaux contradictoires, quel que soit le niveau de confiance.
def route_cross_modal_result(result: dict) -> str:
confidence = result.get('confidence', 0.0)
has_contradiction = bool(result.get('contradicting_sources'))
if has_contradiction:
return 'ESCALATE'
if confidence >= 0.85:
return 'AUTO_APPROVE'
if confidence >= 0.6:
return 'OPTIONAL_REVIEW'
return 'ESCALATE'
# Example routing table:
# confidence >= 0.85, no contradiction -> AUTO_APPROVE
# confidence 0.6-0.85, no contradiction -> OPTIONAL_REVIEW
# any contradiction, or confidence < 0.6 -> ESCALATE
def handle_routing(claim: str, evidence_sources: list):
result = multi_source_reasoning(claim, evidence_sources)
action = route_cross_modal_result(result)
print(f'Claim: "{claim}"')
print(f'Verdict: {result["verdict"]} (confidence={result["confidence"]:.2f})')
print(f'Action: {action}')
return action, resultGérer des éléments visuels insuffisants
Une image est parfois trop peu définie, floue ou partiellement masquée pour fournir des éléments probants utiles. L’agent doit le détecter et s’abstenir de tirer une conclusion multimodale plutôt que d’en inventer une.
def assess_image_evidence_quality(
image_path: str,
claim: str
) -> dict:
import anthropic, base64, json
client = anthropic.Anthropic(api_key='YOUR_API_KEY')
with open(image_path, 'rb') as f:
b64 = base64.standard_b64encode(f.read()).decode('utf-8')
prompt = (
f'Claim to verify: "{claim}"\n\n'
'Assess whether this image provides sufficient evidence to evaluate the claim.\n'
'Consider: image quality, relevance, completeness, and readability.\n'
'Return JSON: {"sufficient": bool, "quality_issues": [str], '
'"usable_evidence": str}'
)
response = client.messages.create(
model='claude-opus-4-5', max_tokens=256,
messages=[{'role': 'user', 'content': [
{'type': 'image', 'source': {'type': 'base64',
'media_type': 'image/jpeg', 'data': b64}},
{'type': 'text', 'text': prompt}
]}]
)
return json.loads(response.content[0].text)Construire un vérificateur de faits multimodal
Pour tout réunir : un vérificateur de faits documentaires reçoit un rapport (texte et images intégrées) et vérifie chaque affirmation quantitative du texte par rapport aux graphiques et tableaux justificatifs. Il renvoie un rapport de vérification structuré.
def fact_check_report(
report_text: str,
image_paths: list
) -> dict:
import re
# Extract numeric claims from text (simple regex pattern)
claim_pattern = r'[A-Z][^.!?]*[0-9][%$][^.!?]*[.!?]'
claims = re.findall(claim_pattern, report_text)
results = []
for claim in claims:
sources = [
{'type': 'text', 'content': report_text},
] + [{'type': 'image', 'content': p} for p in image_paths]
reasoning = multi_source_reasoning(claim, sources)
action = route_cross_modal_result(reasoning)
results.append({
'claim': claim,
'verdict': reasoning['verdict'],
'confidence': reasoning['confidence'],
'action': action
})
total = len(results)
auto_approved = sum(1 for r in results if r['action'] == 'AUTO_APPROVE')
return {
'total_claims': total,
'auto_approved': auto_approved,
'escalated': total - auto_approved,
'details': results
}Vérification des connaissances
Lorsque les signaux du texte et du graphique se contredisent, que doit faire l’agent multimodal selon les bonnes pratiques ?
Récapitulatif : schémas de raisonnement multimodal
Vous avez terminé cette leçon. Points essentiels :
- Ancrage du texte dans l’image : vérifier les affirmations du texte par rapport aux éléments visuels
- Combinaison des signaux : confiance pondérée (pour les nombres, graphiques > texte), les sources structurées priment sur les sources non structurées
- Détection des contradictions : transmettre toujours le cas à un humain — ne jamais résoudre automatiquement les contradictions
- Routage selon la confiance : approbation automatique (niveau élevé) → examen facultatif (niveau moyen) → transmission à un humain (niveau faible ou contradiction)
- Éléments probants insuffisants : s’abstenir plutôt que d’inventer une conclusion multimodale
Prochain cours : agents IdO pilotés par des capteurs — traiter des flux de données du monde réel avec MQTT.
Questions Fréquemment Posées
La leçon « Schémas de raisonnement multimodal » est-elle gratuite ?
Oui — le texte complet de « Schémas de raisonnement multimodal » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours AI Agents, passe à CoddyKit PRO. Le cours AI Agents comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Schémas de raisonnement multimodal » ?
Ancrer les affirmations textuelles dans des images et synthétiser un contexte multimodal provenant de plusieurs sources. Tu pratiques AI Agents avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer AI Agents ?
Aucune expérience préalable n'est requise. AI Agents sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.
Combien de temps prend la leçon « Schémas de raisonnement multimodal » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon AI Agents ?
Oui. Chaque leçon AI Agents inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Agents image + texte avec Claude Vision et GPT-4V
- Flux de travail d’agents audio + texte
- Compréhension vidéo par les agents
- Schémas de raisonnement multimodal