Vous avez un fichier CSV de 50 000 lignes. Vous avez besoin de schémas. Pas de statistiques récapitulatives — des informations concrètes sur ce qui change, où ça plante, ce qui se corrèle. Vous le collez dans ChatGPT. Il invente des chiffres. Vous essayez Claude. Même problème, hallucination différente. Aucun des deux modèles n’a lu le fichier correctement.
Le problème n’est pas le modèle. C’est la façon dont vous posez la question.
Pourquoi les téléversements directs de fichiers échouent
Claude et GPT-4o peuvent tous deux traiter des données CSV et de feuilles de calcul, mais il existe une limite stricte à la taille des fichiers et à l’efficacité des jetons. Une feuille de calcul de 50 000 lignes représente 800 000 jetons. Les modèles n’hallucinent pas sur des ensembles de données petits et propres — ils hallucinent sous charge, lorsque la pression du contexte les force à deviner.
Il y a aussi un problème de format. Un CSV collé brut n’est que du texte. Le modèle voit les en-têtes de colonne une fois, puis des lignes de valeurs sans contexte de structure clair. À la ligne 200, le modèle a oublié ce que représentait la colonne 3.
La solution est de filtrer avant l’analyse.
Filtrer d’abord, puis poser des questions
N’envoyez jamais de données brutes à un LLM. Extrayez ou agrégez d’abord.
Si vous travaillez avec une feuille de calcul en Python, utilisez pandas pour découper avant d’envoyer :
import pandas as pd
import anthropic
# Charger le CSV
df = pd.read_csv('data.csv')
# Filtrer les lignes pertinentes AVANT l'analyse
recent_data = df[df['date'] >= '2025-01-01'].head(100)
relevant_columns = recent_data[['id', 'revenue', 'status', 'region']]
# Convertir en chaîne de caractères pour Claude
data_summary = relevant_columns.to_string()
client = anthropic.Anthropic()
message = client.messages.create(
model="claude-3-5-sonnet-20241022",
max_tokens=1024,
messages=[
{
"role": "user",
"content": f"""Analysez cet ensemble de données. Concentrez-vous sur :
1. Quelle région a le revenu moyen le plus élevé ?
2. Quel pourcentage des enregistrements ont status='complete' ?
3. Y a-t-il des anomalies dans la colonne des revenus ?
Ensemble de données :
{data_summary}"""
}
]
)
print(message.content[0].text)
Cette approche fonctionne car vous avez supprimé le bruit. Le modèle reçoit 100 lignes au lieu de 50 000. Le nombre de jetons passe de 800 000 à environ 5 000. La précision passe de 60% à plus de 90%.
Les requêtes structurées réduisent le taux d’hallucination
La façon dont vous formulez la question est aussi importante que les données elles-mêmes.
Mauvaise invite :
Analysez ces données et dites-moi ce qui est intéressant.
Le modèle inventera des schémas. Il citera des corrélations qui n’existent pas car « intéressant » n’est pas défini.
Meilleure invite :
Analysez cet ensemble de données. Répondez uniquement à ces questions :
1. Quel est le revenu total pour chaque région ? (Affichez sous forme de liste : Région = X$)
2. Combien d'enregistrements ont status='pending' ? (Affichez sous forme de nombre)
3. Quelle est la valeur moyenne de la colonne 'conversion_rate' ? (Affichez en pourcentage)
Si vous ne pouvez pas répondre à une question à partir des données fournies, dites « Pas assez de données » au lieu d'estimer.
La deuxième invite fonctionne car elle spécifie le format de sortie, limite la portée et interdit les suppositions. Claude Sonnet 4 et GPT-4o sont tous deux plus performants sous cette contrainte — les tests montrent que les taux d’hallucination chutent d’environ 25% à environ 5% lorsque la requête est structurée.
Quand les bases de données surpassent les feuilles de calcul
Si vos données résident dans une base de données (PostgreSQL, MySQL, SQLite), les requêtes SQL sont plus rapides et plus précises que les téléversements CSV. Exécutez les agrégations au niveau de la base de données, puis envoyez des tables récapitulatives au modèle.
# Connexion à la base de données et exécution de la requête
import sqlite3
conn = sqlite3.connect('sales.db')
query = """
SELECT region, status, COUNT(*) as record_count, SUM(revenue) as total_revenue
FROM transactions
WHERE date >= '2025-01-01'
GROUP BY region, status
"""
df = pd.read_sql_query(query, conn)
conn.close()
# Envoyez maintenant uniquement le résultat agrégé à Claude
summary_text = df.to_string()
# Même structure d'invite qu'auparavant
client = anthropic.Anthropic()
message = client.messages.create(
model="claude-3-5-sonnet-20241022",
max_tokens=1024,
messages=[
{
"role": "user",
"content": f"""Examinez ce résumé régional. Identifiez la région avec le revenu le plus élevé et la catégorie de statut avec le taux d'achèvement le plus bas.
{summary_text}"""
}
]
)
print(message.content[0].text)
L’approche de base de données est évolutive. Vous n’êtes pas limité par le nombre de jetons ou les fenêtres de contexte du modèle. Vous exécutez le calcul coûteux (groupement, filtrage, agrégation) une seule fois au niveau de la base de données, puis vous demandez au modèle une interprétation, pas un calcul.
GPT-4o vs Claude Sonnet : Qu’est-ce qui change réellement
Les deux gèrent l’analyse CSV. Les deux hallucinent dans des conditions similaires. Mais ils échouent différemment.
GPT-4o (sorti en novembre 2024) est plus rapide pour l’extraction structurée — si vous lui demandez d’extraire des colonnes spécifiques d’un ensemble de données, il est plus cohérent. Claude Sonnet 4 est plus honnête quant à l’incertitude — si les données sont ambiguës, Claude est plus susceptible de dire « c’est peu clair » au lieu de deviner.
Pour l’analyse de données spécifiquement : utilisez Claude si votre ensemble de données contient des cas limites ou des valeurs manquantes et que vous souhaitez les détecter. Utilisez GPT-4o si vous avez besoin de vitesse sur des données propres et bien structurées et que la latence est importante.
Le coût par jeton est identique à cette échelle (environ 0,003 $ pour 5 000 jetons), le prix ne fait donc pas de différence.
Ce qu’il faut faire aujourd’hui
Prenez une feuille de calcul ou un fichier CSV que vous analysez manuellement. Chargez-le dans Python, filtrez-le à 50-200 lignes réellement pertinentes, et envoyez-le à Claude ou GPT-4o avec une invite structurée demandant 2-3 réponses spécifiques. Exécutez le script deux fois — une fois avec l’ensemble de données complet, une fois avec la version filtrée. Comparez les taux d’hallucination.
Vous verrez immédiatement le schéma. Les petits ensembles de données analysés avec des invites spécifiques n’hallucinent pas. Les téléversements volumineux et non filtrés le font. Une fois que vous aurez vu cette différence, vous n’enverrez plus jamais de données brutes à un modèle.