Section 11.4.7 : API Anthropic — Claude et ses spécificités
🎯 Objectif pédagogique
Maîtriser l'API Anthropic (Claude) et comprendre ses différences avec OpenAI. Vous serez capable d'utiliser Claude pour des tâches nécessitant de longs contextes, une analyse nuancée, et de gérer les deux APIs dans vos projets.
Pourquoi apprendre deux APIs ?
Marc utilise GPT-4o. Mais dans le monde professionnel, les équipes utilisent plusieurs LLMs selon les tâches. Claude excelle dans l'analyse de longs documents, le raisonnement nuancé, et le suivi d'instructions complexes. Connaître les deux fait de Marc un développeur IA complet.
Configuration Anthropic
# pip install anthropic python-dotenv
# .env
# ANTHROPIC_API_KEY=sk-ant-xxxxxxxxxxxxx
import os
from dotenv import load_dotenv
import anthropic
load_dotenv()
client = anthropic.Anthropic(api_key=os.environ.get("ANTHROPIC_API_KEY"))
Appel basique — Messages API
def ask_claude(prompt, system_prompt="Tu es un assistant utile.", model="claude-sonnet-4-20250514"):
"""Appel simple à l'API Anthropic."""
message = client.messages.create(
model=model,
max_tokens=1024,
system=system_prompt, # System prompt séparé (pas dans messages)
messages=[
\{"role": "user", "content": prompt\}
]
)
return message.content[0].text
# Utilisation
result = ask_claude("Analyse les tendances du marché data analyst en France pour 2025.")
print(result)
Différences d'API : Anthropic vs OpenAI
# OPENAI :
response = openai_client.chat.completions.create(
model="gpt-4o-mini",
messages=[
\{"role": "system", "content": "Tu es expert."\}, # System dans messages
\{"role": "user", "content": "Question"\}
],
temperature=0.7,
max_tokens=1000
)
text = response.choices[0].message.content
# ANTHROPIC :
response = anthropic_client.messages.create(
model="claude-sonnet-4-20250514",
system="Tu es expert.", # System SÉPARÉ
messages=[
\{"role": "user", "content": "Question"\}
],
temperature=0.7, # Même paramètre
max_tokens=1000
)
text = response.content[0].text # .content[0].text vs .choices[0].message.content
Analyse de long document (force de Claude)
def analyze_long_document(document_text, questions):
"""Analyser un long document (CV, rapport, article) avec Claude."""
prompt = f"""Voici un document à analyser :
<document>
\{document_text\}
</document>
Réponds aux questions suivantes en te basant UNIQUEMENT sur le document :
\{chr(10).join(f'\{i+1\}. \{q\}' for i, q in enumerate(questions))\}
Pour chaque réponse, cite le passage pertinent du document entre guillemets."""
message = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=2000,
system="Tu es un analyste de documents expert. Sois précis et cite tes sources.",
messages=[\{"role": "user", "content": prompt\}]
)
return message.content[0].text
# Utilisation : analyser un long rapport
with open("rapport_annuel.txt", "r", encoding="utf-8") as f:
report = f.read() # Peut être 50+ pages
result = analyze_long_document(report, [
"Quel est le chiffre d'affaires 2024 ?",
"Quelles sont les priorités stratégiques mentionnées ?",
"Combien de nouveaux employés ont été embauchés ?"
])
print(result)
XML tags — Feature unique Anthropic
# Claude comprend les balises XML pour structurer les prompts
prompt = """Analyse cette candidature :
<candidat>
<nom>Marc Dupont</nom>
<experience>8 ans finance, 3 mois data/IA</experience>
<competences>Python, SQL, Excel avancé, présentation de données</competences>
</candidat>
<poste>
<titre>Data Analyst Junior</titre>
<entreprise>TechStartup</entreprise>
<requis>Python, SQL, Tableau, esprit analytique</requis>
</poste>
<format_reponse>
Donne ton analyse dans ce format :
- Match score : X/10
- Forces : [liste]
- Gaps : [liste]
- Verdict : POSTULER / PASSER / PEUT-ÊTRE
- Plan d'action : [si PEUT-ÊTRE ou POSTULER]
</format_reponse>"""
Classe wrapper multi-LLM
class LLMClient:
"""Client unifié pour OpenAI et Anthropic."""
def __init__(self):
self.openai = OpenAI(api_key=os.environ.get("OPENAI_API_KEY"))
self.anthropic = anthropic.Anthropic(api_key=os.environ.get("ANTHROPIC_API_KEY"))
def ask(self, prompt, system="Tu es un assistant utile.",
provider="openai", model=None):
"""Interface unifiée pour les deux providers."""
if provider == "openai":
model = model or "gpt-4o-mini"
response = self.openai.chat.completions.create(
model=model,
messages=[
\{"role": "system", "content": system\},
\{"role": "user", "content": prompt\}
]
)
return response.choices[0].message.content
elif provider == "anthropic":
model = model or "claude-sonnet-4-20250514"
response = self.anthropic.messages.create(
model=model,
max_tokens=1024,
system=system,
messages=[\{"role": "user", "content": prompt\}]
)
return response.content[0].text
# Utilisation
llm = LLMClient()
# Extraction rapide → OpenAI (moins cher)
skills = llm.ask("Extrais les compétences de cette offre en JSON", provider="openai")
# Analyse nuancée → Claude (meilleur sur les textes longs)
analysis = llm.ask("Analyse ce rapport de 50 pages", provider="anthropic")
Quand utiliser Claude vs GPT
Claude : longs documents (200k tokens), analyse nuancée, suivi d'instructions complexes, XML structuré, éthique/sécurité. GPT-4o : code generation, API plus mature, plugins/tools, batch API pour le volume. gpt-4o-mini : extraction, classification, tâches simples à faible coût.
🏋️ Exercice pratique (25 minutes)
- →Créez un compte Anthropic et générez une clé API
- →Écrivez le même prompt d'analyse d'offre pour Claude et GPT-4o
- →Comparez les réponses (ton, structure, détail)
- →Implémentez le
LLMClientmulti-provider - →Testez l'analyse d'un long document (article Wikipedia) avec Claude
Quelle est la principale force de Claude par rapport à GPT-4o ?
Pourquoi créer un LLMClient unifié plutôt que d'appeler directement chaque API ?