IA pour débutantsGuide
Interroger un LLM sur un CSV : envoyez le schéma, pas la table
Envoyez les noms de colonnes, les types et 3 lignes d'exemple, récupérez une ligne pandas, exécutez-la sur le fichier complet. Moins cher que coller les lignes, et vous pouvez vérifier le nombre.

Sur cette page
Vous avez un sales.csv de 5 000 lignes et une seule question : quel produit s'est le plus vendu en octobre ? Ne collez pas le fichier dans un chat. Envoyez au modèle les noms des colonnes, leurs types et trois lignes d'exemple, demandez une ligne de pandas, et exécutez cette ligne vous-même sur le fichier complet. Le modèle ne lit jamais vos 5 000 lignes, le prompt reste minuscule, et le nombre que vous obtenez provient d'un code que vous pouvez réexécuter.
Voici pourquoi ça marche mieux, à quoi ressemble le prompt, un script que vous pouvez copier, et ce que ça coûte face à la méthode du tout-coller.
Pourquoi coller toute la table ne marche pas#
Voici une histoire que vous reconnaîtrez peut-être. Quelqu'un colle 200 lignes de dépenses dans un chat et demande le total. La réponse revient avec assurance, avec les centimes et tout. Elle est aussi fausse, et rien à l'écran ne vous le signale.
Le modèle prédit le texte morceau par morceau (ces morceaux sont des tokens). Une somme de 200 nombres, c'est 200 petites étapes sans calculatrice à l'intérieur, et un chiffre qui glisse ressemble exactement à une bonne réponse. Le code se comporte autrement : df['amount']. additionne toutes les lignes, à chaque fois, et donne le même résultat au second passage.
Il y a un second problème, et il concerne la taille. Une table dévore vite la fenêtre de contexte, et vous payez pour chaque ligne à chaque question. Dix questions sur le même fichier, c'est dix copies de toute la table envoyées en entrée.
Vérification rapide
Pourquoi une ligne pandas est-elle plus sûre que demander le total au modèle ?
Afficher la réponse
Réponse: Votre ordinateur exécute le code sur chaque ligne, et vous pouvez le réexécuter et le vérifier
Le modèle peut quand même écrire une ligne fausse. La différence, c'est qu'une ligne est visible et reproductible : vous la lisez, vous l'exécutez, et vous comparez le résultat avec quelques lignes à la main.
Envoyez la forme de la table, pas la table#
Le modèle n'a pas besoin de vos données pour écrire le code. Il a besoin de savoir à quoi ressemble la table : quelles colonnes existent, quel type de valeurs elles contiennent, et comment une ligne est écrite. C'est le schéma plus quelques lignes.
Disons que votre sales.csv a quatre colonnes. Voici le prompt complet :
A pandas DataFrame named df has these columns and types:
date object
product object
units int64
price float64
First 3 rows (CSV):
date,product,units,price
2026-10-01,Oat latte mix,12,4.50
2026-10-01,Cocoa,7,3.20
2026-10-02,Oat latte mix,9,4.50
Question: Which product sold the most units in October 2026?
Reply with ONE line of pandas code that computes the answer from df.
No explanation, no markdown, no imports.Attendez-vous à une réponse de la forme df[df['date'].. La formulation exacte varie d'un passage à l'autre, alors lisez la ligne avant de l'exécuter.
Pourquoi trois lignes et pas seulement les noms de colonnes ? À cause de la date. La colonne de type indique object, ce qui signifie seulement du texte. Les lignes d'exemple montrent que la date est écrite 2026-10-01, donc le modèle sait qu'il faut faire correspondre le texte 2026-10, et non 10/2026 ou un nom de mois. La plupart des lignes pandas fausses viennent d'un format deviné que la table n'a jamais eu.

Le script : demander, lire la ligne, l'exécuter#
Le script ci-dessous construit ce prompt à partir de votre fichier, pour que vous n'ayez pas à taper le schéma à la main. Il appelle l'API CheapTokens via le SDK Python OpenAI : URL de base https:/, identifiant de modèle deepseek-. Gardez la clé dans une variable d'environnement, pas dans le fichier.
import os
import pandas as pd
from openai import OpenAI
client = OpenAI(
base_url="https://api.cheaptokens.dev/v1",
api_key=os.environ["CHEAPTOKENS_API_KEY"],
)
df = pd.read_csv("sales.csv") # for .xlsx: pd.read_excel("sales.xlsx")
schema = df.dtypes.to_string()
sample = df.head(3).to_csv(index=False)
question = "Which product sold the most units in October 2026?"
prompt = f"""A pandas DataFrame named df has these columns and types:
{schema}
First 3 rows (CSV):
{sample}
Question: {question}
Reply with ONE line of pandas code that computes the answer from df.
No explanation, no markdown, no imports."""
resp = client.chat.completions.create(
model="deepseek-ai/DeepSeek-V4-Flash-0731",
messages=[{"role": "user", "content": prompt}],
max_tokens=500,
)
text = resp.choices[0].message.content.strip()
code = text.removeprefix("```python").removeprefix("```").removesuffix("```").strip()
print("Model's line:", code)
print("Tokens in/out:", resp.usage.prompt_tokens, resp.usage.completion_tokens)
if resp.choices[0].finish_reason != "stop" or "import" in code or "__" in code:
raise SystemExit("Not running this one. Read the line above and decide.")
print("Answer:", eval(code, {"df": df, "pd": pd}))Le dernier bloc est la partie que les débutants sautent. eval exécute le texte écrit par le modèle, sur votre machine, donc le script refuse les lignes contenant import ou __ et les réponses tronquées (finish_reason différent de stop ; voir pourquoi une réponse s'arrête en milieu de phrase). Et vous lisez toujours d'abord la ligne affichée. Si elle touche à des fichiers, au réseau ou à quoi que ce soit que vous n'avez pas demandé, ne l'exécutez pas.
Le premier passage affiche trois choses : la ligne du modèle, les comptes de tokens pour cette requête, et la réponse. Les comptes de tokens sont votre compteur pour la section suivante.
Ce que ça coûte : tout coller face à schéma + 3 lignes#
Pour comparer, il nous faut une taille pour une ligne. Disons qu'une ligne comme 2026- prend environ 20 tokens. C'est une hypothèse : cela dépend du tokenizer du modèle et de vos colonnes, et compter les tokens avant l'envoi donne votre chiffre réel. Avec 20 tokens par ligne, 5 000 lignes font 5 000 × 20 = 100 000 tokens d'entrée. Le prompt schéma-et-trois-lignes fait environ 300 tokens, instructions comprises. La réponse est courte dans les deux cas, disons 60 tokens, donc la différence se situe entièrement du côté de l'entrée, celui qui grandit avec votre table (voir plus dans tokens d'entrée vs de sortie).
Les deux nombres sont petits en dollars, et c'est honnête : un modèle bon marché rend même la méthode gaspilleuse abordable. C'est l'écart qui grandit. Posez 20 questions par jour et le prompt tout-coller est envoyé 20 fois. Doublez la table et son coût double, tandis que le prompt schéma ne bouge pas. Et il y a un mur : avec une fenêtre de contexte de 380K tokens, 380 000 ÷ 20 = 19 000 lignes est le maximum que vous pourriez jamais coller, avant même de laisser de la place à la réponse. Un export de 50 000 lignes ne rentre tout simplement pas. Le prompt schéma, si, quelle que soit la taille de la table.
Branchez votre propre table et voyez le coût quotidien :
Calculateur de coût
Votre table collée en entier : 20 questions par jour
Tokens d'entrée par requête: 100 000 · Tokens de sortie par requête: 60 · Requêtes par jour: 20
| Modèle | Par jour | Par mois |
|---|---|---|
| GLM-5.3-Flash$0.02$0.04 | $0.04 | $1.20 |
| DeepSeek-V4-Flash$0.015$0.10 | $0.0301 | $0.904 |
| MiniMax-M2.7$0.05$0.15 | $0.10 | $3.01 |
Changez in en 300 pour voir la méthode schéma. DeepSeek-V4-Flash sur CheapTokens a un seul prix à toute heure, sans surcoût aux heures de pointe, et un seul solde couvre tous les modèles, donc vous pouvez remplacer l'identifiant de modèle par zai- (contexte de 390K) sans second compte. Les prix actuels sont sur la page de tarifs.
Vérifiez le nombre avant de lui faire confiance#
La boucle est toujours la même. Faites-la à chaque fois, et une mauvaise réponse sera attrapée à l'étape quatre plutôt que dans un rapport.
Remettre en ordre
Remettez la boucle dans l'ordre
Faites glisser les éléments ou utilisez les flèches
- Décrire la table : types de colonnes et 3 lignes d'exemple
- Demander une ligne pandas, rien d'autre
- Lire la ligne, puis l'exécuter sur le fichier complet
- Vérifier le résultat à la main sur quelques lignes

L'étape quatre est peu coûteuse. Filtrez le fichier jusqu'à quelques lignes (df[df['product'] == 'Cocoa'].), additionnez-les de tête ou dans un tableur, et comparez. Si la ligne du modèle est fausse, elle l'est généralement de façon évidente : elle a compté les lignes au lieu de sommer units, ou elle a choisi le mauvais mois.
Pour d'autres habitudes comme celle-ci, voir pourquoi l'IA invente des choses et 4 habitudes de prompt qui réduisent cela.
Si ça ne marche pas#
KeyError: 'Date'. Le modèle a écrit un nom de colonne avec une casse différente. Collez la vraie ligne d'en-tête dans le prompt, ce que font déjà les trois lignes d'exemple, et ajoutez « utilisez les noms de colonnes exactement comme indiqué ».- La réponse contient une phrase avant le code. Votre
evaléchoue avec unSyntaxError. Répétez « UNE ligne de code pandas, sans explication » à la fin du prompt, la dernière instruction compte le plus. - La réponse est une table, pas un nombre. Dites quelle forme vous voulez : « renvoie un seul nombre » ou « renvoie une Series triée par ordre décroissant ».
- Les dates sortent fausses. Les lignes d'exemple montrent le vrai format. Si vos dates sont
14/10/2026, le modèle doit le voir ; ajoutezpd.au prompt comme façon de lire les dates.to_ datetime(df['date'], dayfirst=True) finish_reasonestlength. La réponse a été coupée parmax_tokens. Une seule ligne tient en 500 tokens, donc vérifiez le prompt : le modèle explique peut-être longuement.
La configuration complète pour votre première requête, de la clé à la réponse, se trouve dans la documentation CheapTokens.



