LLM से CSV के बारे में पूछें: तालिका नहीं, स्कीमा भेजें
कॉलम के नाम, प्रकार और 3 नमूना पंक्तियाँ भेजें, pandas की एक पंक्ति वापस पाएँ, उसे पूरी फ़ाइल पर चलाएँ। पंक्तियाँ पेस्ट करने से सस्ता, और आप संख्या जाँच सकते हैं।

इस पृष्ठ पर
आपके पास 5,000 पंक्तियों वाली एक sales.csv है और एक सवाल: अक्टूबर में सबसे ज़्यादा कौन सा उत्पाद बिका? फ़ाइल को चैट में पेस्ट न करें। मॉडल को कॉलम के नाम, उनके प्रकार और तीन नमूना पंक्तियाँ भेजें, pandas की एक पंक्ति माँगें, और उस पंक्ति को पूरी फ़ाइल पर खुद चलाएँ। मॉडल आपकी 5,000 पंक्तियाँ कभी नहीं पढ़ता, प्रॉम्प्ट छोटा रहता है, और आपको जो संख्या मिलती है वह ऐसे कोड से आती है जिसे आप दोबारा चला सकते हैं।
यह क्यों बेहतर काम करता है, प्रॉम्प्ट कैसा दिखता है, एक स्क्रिप्ट जिसे आप कॉपी कर सकते हैं, और सब कुछ पेस्ट करने वाले तरीके की तुलना में इसकी लागत क्या है।
पूरी तालिका पेस्ट करना क्यों गलत होता है#
यहाँ एक कहानी है जो आपको जानी-पहचानी लग सकती है। कोई व्यक्ति चैट में खर्चों की 200 पंक्तियाँ पेस्ट करता है और कुल योग माँगता है। जवाब आत्मविश्वास के साथ आता है, पैसे और सब कुछ के साथ। वह गलत भी है, और स्क्रीन पर कुछ भी आपको यह नहीं बताता।
मॉडल टेक्स्ट को टुकड़ों में भविष्यवाणी करता है (वे टुकड़े टोकन हैं)। 200 संख्याओं का योग 200 छोटे कदम हैं जिनमें कोई कैलकुलेटर नहीं है, और एक फिसला हुआ अंक बिल्कुल सही जवाब जैसा दिखता है। कोड अलग व्यवहार करता है: df['amount']. हर बार सभी पंक्तियाँ जोड़ता है, और दूसरी बार चलाने पर वही परिणाम देता है।
एक दूसरी समस्या है, और वह आकार की है। एक तालिका कॉन्टेक्स्ट विंडो को तेज़ी से खा जाती है, और आप हर सवाल पर हर पंक्ति के लिए भुगतान करते हैं। एक ही फ़ाइल के बारे में दस सवालों का मतलब है पूरी तालिका की दस प्रतियाँ इनपुट के रूप में भेजी जाना।
त्वरित जाँच
pandas की एक पंक्ति मॉडल से कुल योग माँगने से ज़्यादा सुरक्षित क्यों है?
उत्तर दिखाएँ
उत्तर: आपका कंप्यूटर कोड को हर पंक्ति पर चलाता है, और आप इसे दोबारा चला और जाँच सकते हैं
मॉडल फिर भी गलत पंक्ति लिख सकता है। फ़र्क यह है कि एक पंक्ति दिखाई देती है और दोहराई जा सकती है: आप उसे पढ़ते हैं, चलाते हैं, और परिणाम की कुछ पंक्तियों से हाथ से तुलना करते हैं।
तालिका नहीं, तालिका का आकार भेजें#
कोड लिखने के लिए मॉडल को आपके डेटा की ज़रूरत नहीं है। उसे यह जानना है कि तालिका कैसी दिखती है: कौन से कॉलम हैं, उनमें किस तरह के मान हैं, और एक पंक्ति कैसे लिखी जाती है। यही स्कीमा प्लस कुछ पंक्तियाँ है।
मान लें कि आपके sales.csv में चार कॉलम हैं। यह पूरा प्रॉम्प्ट है:
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.df[df['date']. जैसा जवाब अपेक्षित करें। सटीक शब्दावली हर बार अलग होती है, इसलिए चलाने से पहले पंक्ति पढ़ें।
तीन पंक्तियाँ क्यों और सिर्फ़ कॉलम के नाम क्यों नहीं? तारीख की वजह से। प्रकार कॉलम object कहता है, जिसका मतलब सिर्फ़ टेक्स्ट है। नमूना पंक्तियाँ दिखाती हैं कि तारीख 2026-10-01 के रूप में लिखी गई है, इसलिए मॉडल जानता है कि टेक्स्ट 2026-10 से मिलान करना है, 10/2026 या महीने के नाम से नहीं। ज़्यादातर गलत pandas पंक्तियाँ उस फ़ॉर्मेट का अनुमान लगाने से आती हैं जो तालिका में कभी था ही नहीं।

स्क्रिप्ट: पूछें, पंक्ति पढ़ें, चलाएँ#
नीचे दी गई स्क्रिप्ट आपकी फ़ाइल से वह प्रॉम्प्ट बनाती है, ताकि आपको स्कीमा हाथ से टाइप न करना पड़े। यह OpenAI Python SDK के ज़रिए CheapTokens API को कॉल करती है: बेस URL https:/, मॉडल आईडी deepseek-। कुंजी को एनवायरनमेंट वेरिएबल में रखें, फ़ाइल में नहीं।
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}))आखिरी ब्लॉक वह हिस्सा है जिसे शुरुआती लोग छोड़ देते हैं। eval मॉडल जो भी टेक्स्ट लिखता है उसे आपकी मशीन पर चलाता है, इसलिए स्क्रिप्ट import या __ वाली पंक्तियों और कटे हुए जवाबों (stop के अलावा finish_reason; देखें जवाब बीच में क्यों रुकता है) को अस्वीकार करती है। और आप फिर भी पहले छपी हुई पंक्ति पढ़ते हैं। अगर वह फ़ाइलों, नेटवर्क या किसी ऐसी चीज़ को छूती है जिसके बारे में आपने नहीं पूछा, तो उसे न चलाएँ।
पहला रन तीन चीज़ें छापता है: मॉडल की पंक्ति, इस एक अनुरोध के टोकन गिनती, और जवाब। टोकन गिनती अगले भाग के लिए आपका मीटर है।
लागत: सब कुछ पेस्ट करना बनाम स्कीमा + 3 पंक्तियाँ#
तुलना करने के लिए, हमें एक पंक्ति का आकार चाहिए। मान लें कि 2026- जैसी एक पंक्ति में लगभग 20 टोकन लगते हैं। यह एक अनुमान है: यह मॉडल के टोकनाइज़र और आपके कॉलम पर निर्भर करता है, और भेजने से पहले टोकन गिनना आपकी असली संख्या दिखाता है। 20 टोकन प्रति पंक्ति के साथ, 5,000 पंक्तियाँ 5,000 × 20 = 100,000 इनपुट टोकन हैं। स्कीमा-और-तीन-पंक्तियाँ प्रॉम्प्ट निर्देशों सहित लगभग 300 टोकन है। जवाब दोनों मामलों में छोटा है, मान लें 60 टोकन, इसलिए फ़र्क पूरी तरह इनपुट पक्ष पर है, वह जो आपकी तालिका के साथ बढ़ता है (इनपुट बनाम आउटपुट टोकन में अधिक)।
दोनों संख्याएँ डॉलर में छोटी हैं, और यह ईमानदार है: एक सस्ता मॉडल फ़िज़ूलखर्च तरीके को भी किफ़ायती बना देता है। फ़र्क वह है जो बढ़ता है। दिन में 20 सवाल पूछें और सब-कुछ-पेस्ट करने वाला प्रॉम्प्ट 20 बार भेजा जाता है। तालिका दोगुनी करें और उसकी लागत दोगुनी हो जाती है, जबकि स्कीमा प्रॉम्प्ट हिलता नहीं। और एक सख़्त दीवार है: 380K-टोकन कॉन्टेक्स्ट विंडो के साथ, 380,000 ÷ 20 = 19,000 पंक्तियाँ सबसे ज़्यादा हैं जो आप कभी पेस्ट कर सकते हैं, जवाब के लिए कोई जगह छोड़ने से पहले। 50,000-पंक्ति का एक्सपोर्ट बस फ़िट नहीं होता। स्कीमा प्रॉम्प्ट हो जाता है, तालिका का आकार जो भी हो।
अपनी तालिका डालें और दैनिक लागत देखें:
लागत कैलकुलेटर
आपकी तालिका पूरी पेस्ट की गई: दिन में 20 सवाल
प्रति अनुरोध इनपुट टोकन: 1,00,000 · प्रति अनुरोध आउटपुट टोकन: 60 · प्रति दिन अनुरोध: 20
| मॉडल | प्रति दिन | प्रति माह |
|---|---|---|
| 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 |
स्कीमा तरीका देखने के लिए in को 300 में बदलें। CheapTokens पर DeepSeek-V4-Flash की किसी भी घंटे एक ही कीमत है, कोई पीक-टाइम अधिभार नहीं, और एक बैलेंस हर मॉडल को कवर करता है, इसलिए आप मॉडल आईडी को zai- (390K कॉन्टेक्स्ट) से बदल सकते हैं बिना दूसरे खाते के। मौजूदा कीमतें मूल्य पृष्ठ पर हैं।
संख्या पर भरोसा करने से पहले उसे जाँचें#
लूप हमेशा एक जैसा है। इसे हर बार करें, और गलत जवाब चरण चार पर पकड़ा जाता है, किसी रिपोर्ट में नहीं।
क्रम में लगाएँ
लूप को क्रम में रखें
आइटम खींचें या तीरों का उपयोग करें
- तालिका का वर्णन करें: कॉलम प्रकार और 3 नमूना पंक्तियाँ
- pandas की एक पंक्ति माँगें, और कुछ नहीं
- पंक्ति पढ़ें, फिर उसे पूरी फ़ाइल पर चलाएँ
- कुछ पंक्तियों पर परिणाम को हाथ से जाँचें

चरण चार सस्ता है। फ़ाइल को मुट्ठी भर पंक्तियों तक फ़िल्टर करें (df[df['product'] == 'Cocoa'].), उन्हें अपने दिमाग़ में या स्प्रेडशीट में जोड़ें, और तुलना करें। अगर मॉडल की पंक्ति गलत है, तो आमतौर पर यह स्पष्ट रूप से गलत होती है: इसने units को जोड़ने के बजाय पंक्तियाँ गिनीं, या इसने गलत महीना चुना।
इस जैसी और आदतों के लिए, देखें AI चीज़ें क्यों बनाता है और 4 प्रॉम्प्ट आदतें जो इसे कम करती हैं।
अगर यह काम न करे#
KeyError: 'Date'। मॉडल ने अलग बड़े अक्षरों के साथ एक कॉलम नाम लिखा। असली हेडर पंक्ति को प्रॉम्प्ट में पेस्ट करें, जो तीन नमूना पंक्तियाँ पहले से करती हैं, और जोड़ें "कॉलम के नाम बिल्कुल वैसे ही इस्तेमाल करें जैसे दिखाए गए हैं"।- जवाब में कोड से पहले एक वाक्य है। आपका
evalएकSyntaxErrorके साथ विफल होता है। प्रॉम्प्ट के अंत में "pandas कोड की एक पंक्ति, कोई स्पष्टीकरण नहीं" दोहराएँ, आखिरी निर्देश सबसे ज़्यादा मायने रखता है। - जवाब एक तालिका है, संख्या नहीं। बताएँ कि आप कौन सा आकार चाहते हैं: "एक एकल संख्या लौटाएँ" या "अवरोही क्रम में क्रमबद्ध एक Series लौटाएँ"।
- तारीखें गलत आती हैं। नमूना पंक्तियाँ असली फ़ॉर्मेट दिखाती हैं। अगर आपकी तारीखें
14/10/2026हैं, तो मॉडल को वह देखना चाहिए; प्रॉम्प्ट मेंpd.जोड़ें कि आप तारीखें कैसे पढ़ना चाहते हैं।to_ datetime(df['date'], dayfirst=True) finish_reasonlengthहै। जवाबmax_tokensसे कट गया। एक पंक्ति 500 टोकन में फ़िट हो जाती है, इसलिए प्रॉम्प्ट जाँचें: मॉडल शायद लंबाई में समझा रहा है।
आपके पहले अनुरोध का पूरा सेटअप, कुंजी से जवाब तक, CheapTokens डॉक्स में है।



