একটি CSV সম্পর্কে LLM-কে জিজ্ঞাসা করুন: টেবিল নয়, স্কিমা পাঠান
কলামের নাম, ধরন এবং ৩টি নমুনা সারি পাঠান, একটি pandas লাইন ফেরত পান, সম্পূর্ণ ফাইলে চালান। সারি পেস্ট করার চেয়ে সস্তা, এবং আপনি সংখ্যাটি যাচাই করতে পারেন।

এই পৃষ্ঠায়
আপনার কাছে sales.csv আছে যাতে ৫,০০০ সারি এবং একটি প্রশ্ন: অক্টোবরে কোন পণ্যটি সবচেয়ে বেশি বিক্রি হয়েছে? ফাইলটি চ্যাটে পেস্ট করবেন না। মডেলকে কলামের নাম, তাদের ধরন এবং তিনটি নমুনা সারি পাঠান, এক লাইন pandas কোড চান, এবং সেই লাইনটি নিজেই সম্পূর্ণ ফাইলে চালান। মডেল কখনো আপনার ৫,০০০ সারি পড়ে না, প্রম্পট ছোট থাকে, এবং আপনি যে সংখ্যা পান তা এমন কোড থেকে আসে যা আপনি আবার চালাতে পারেন।
এটি কেন ভালো কাজ করে, প্রম্পট কেমন দেখায়, একটি স্ক্রিপ্ট যা আপনি কপি করতে পারেন, এবং সবকিছু পেস্ট করার পদ্ধতির তুলনায় এর খরচ কত, তা এখানে দেওয়া হলো।
কেন পুরো টেবিল পেস্ট করা ভুল হয়#
এখানে একটি গল্প আছে যা আপনি চিনতে পারেন। কেউ চ্যাটে ২০০ সারির খরচ পেস্ট করে মোট যোগফল চায়। উত্তরটি আত্মবিশ্বাসের সাথে আসে, সেন্টসহ সবকিছু। এটিও ভুল, এবং স্ক্রিনে কিছুই আপনাকে তা বলে না।
মডেল টেক্সট টুকরো টুকরো করে পূর্বানুমান করে (সেই টুকরোগুলো টোকেন)। ২০০টি সংখ্যার যোগফল হলো ২০০টি ছোট ধাপ, ভিতরে কোনো ক্যালকুলেটর নেই, এবং একটি ভুল ডিজিট ঠিক সঠিক উত্তরের মতো দেখায়। কোড ভিন্নভাবে আচরণ করে: 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 বা __ সহ লাইন এবং কাটা উত্তর (finish_reason যা stop নয়; দেখুন কেন একটি উত্তর মাঝপথে থেমে যায়) প্রত্যাখ্যান করে। এবং আপনি এখনও প্রথমে প্রিন্ট করা লাইনটি পড়েন। যদি এটি ফাইল, নেটওয়ার্ক বা আপনি যা জিজ্ঞাসা করেননি এমন কিছু স্পর্শ করে, তবে চালাবেন না।
প্রথম রান তিনটি জিনিস প্রিন্ট করে: মডেলের লাইন, এই একটি অনুরোধের টোকেন গণনা, এবং উত্তর। টোকেন গণনাগুলি পরবর্তী বিভাগের জন্য আপনার মিটার।
খরচ কত: সবকিছু পেস্ট করা বনাম স্কিমা + ৩ সারি#
তুলনা করার জন্য, আমাদের একটি সারির আকার দরকার। ধরুন 2026--এর মতো একটি সারি প্রায় ২০ টোকেন নেয়। এটি একটি অনুমান: এটি মডেলের টোকেনাইজার এবং আপনার কলামের উপর নির্ভর করে, এবং পাঠানোর আগে টোকেন গণনা আপনার প্রকৃত সংখ্যা দেখায়। প্রতি সারিতে ২০ টোকেনে, ৫,০০০ সারি হলো ৫,০০০ × ২০ = ১০০,০০০ ইনপুট টোকেন। স্কিমা-এবং-তিন-সারি প্রম্পট প্রায় ৩০০ টোকেন, নির্দেশাবলীসহ। উত্তর উভয় ক্ষেত্রেই ছোট, ধরুন ৬০ টোকেন, তাই পার্থক্যটি সম্পূর্ণভাবে ইনপুট দিকে থাকে, যেটি আপনার টেবিলের সাথে বাড়ে (ইনপুট বনাম আউটপুট টোকেন-এ আরও)।
উভয় সংখ্যাই ডলারে ছোট, এবং এটি সৎ: একটি সস্তা মডেল এমনকি অপচয়মূলক পদ্ধতিকেও সাশ্রয়ী করে তোলে। ব্যবধানটাই বাড়ে। দিনে ২০টি প্রশ্ন করুন এবং সবকিছু-পেস্ট-করা প্রম্পট ২০ বার পাঠানো হয়। টেবিল দ্বিগুণ করুন এবং এর খরচ দ্বিগুণ হয়, যখন স্কিমা প্রম্পট নড়ে না। এবং একটি কঠিন সীমা আছে: ৩৮০K-টোকেন কনটেক্সট উইন্ডো সহ, ৩৮০,০০০ ÷ ২০ = ১৯,০০০ সারি হলো সর্বোচ্চ যা আপনি কখনো পেস্ট করতে পারেন, উত্তরের জন্য কোনো জায়গা ছাড়ার আগে। একটি ৫০,০০০-সারির এক্সপোর্ট সহজভাবে ফিট করে না। স্কিমা প্রম্পট ফিট করে, টেবিলের আকার যাই হোক।
আপনার নিজের টেবিল প্লাগ করুন এবং দৈনিক খরচ দেখুন:
খরচ ক্যালকুলেটর
আপনার টেবিল সম্পূর্ণ পেস্ট করা: দিনে ২০টি প্রশ্ন
প্রতি অনুরোধে ইনপুট টোকেন: ১,০০,০০০ · প্রতি অনুরোধে আউটপুট টোকেন: ৬০ · প্রতিদিন অনুরোধ: ২০
| মডেল | প্রতিদিন | প্রতি মাসে |
|---|---|---|
| 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 কে ৩০০-এ পরিবর্তন করুন। CheapTokens-এ DeepSeek-V4-Flash-এর যেকোনো সময়ে একই দাম, পিক-টাইম সারচার্জ নেই, এবং একটি ব্যালেন্স সব মডেল কভার করে, তাই আপনি দ্বিতীয় অ্যাকাউন্ট ছাড়াই মডেল আইডি zai- (৩৯০K কনটেক্সট) দিয়ে বদলাতে পারেন। বর্তমান দাম মূল্য পৃষ্ঠা-এ আছে।
সংখ্যাটি বিশ্বাস করার আগে যাচাই করুন#
লুপটি সর্বদা একই। প্রতিবার এটি করুন, এবং একটি ভুল উত্তর চতুর্থ ধাপে ধরা পড়ে, রিপোর্টে নয়।
ক্রমে সাজান
লুপটি ক্রমানুসারে সাজান
আইটেমগুলো ড্র্যাগ করুন বা তীর ব্যবহার করুন
- টেবিল বর্ণনা করুন: কলামের ধরন এবং ৩টি নমুনা সারি
- একটি pandas লাইন চান, আর কিছু নয়
- লাইনটি পড়ুন, তারপর সম্পূর্ণ ফাইলে চালান
- কয়েকটি সারিতে হাতে ফলাফল যাচাই করুন

চতুর্থ ধাপ সস্তা। ফাইলটি কয়েকটি সারিতে ফিল্টার করুন (df[df['product'] == 'Cocoa'].), সেগুলি মাথায় বা স্প্রেডশিটে যোগ করুন, এবং তুলনা করুন। যদি মডেলের লাইন ভুল হয়, এটি সাধারণত স্পষ্টভাবে ভুল হয়: এটি units যোগ করার পরিবর্তে সারি গণনা করেছে, বা ভুল মাস বেছে নিয়েছে।
এই ধরনের আরও অভ্যাসের জন্য, দেখুন কেন AI জিনিস বানায় এবং ৪টি প্রম্পট অভ্যাস যা এটি কমায়।
যদি এটি কাজ না করে#
KeyError: 'Date'। মডেল ভিন্ন বড় হাতের অক্ষরে একটি কলামের নাম লিখেছে। প্রকৃত হেডার সারি প্রম্পটে পেস্ট করুন, যা তিনটি নমুনা সারি ইতিমধ্যে করে, এবং যোগ করুন "কলামের নামগুলি ঠিক যেমন দেখানো হয়েছে তা ব্যবহার করুন"।- উত্তরে কোডের আগে একটি বাক্য আছে। আপনার
evalএকটিSyntaxErrorদিয়ে ব্যর্থ হয়। প্রম্পটের শেষে "পandas কোডের এক লাইন, কোনো ব্যাখ্যা নয়" পুনরাবৃত্তি করুন, শেষ নির্দেশটি সবচেয়ে বেশি গণনা করা হয়। - উত্তরটি একটি সংখ্যা নয়, একটি টেবিল। আপনি কী আকার চান তা বলুন: "একটি একক সংখ্যা ফেরত দিন" বা "একটি Series অবরোহ ক্রমে সাজানো ফেরত দিন"।
- তারিখগুলি ভুল আসে। নমুনা সারিগুলি প্রকৃত ফরম্যাট দেখায়। যদি আপনার তারিখগুলি
14/10/2026হয়, মডেলকে তা দেখতে হবে; প্রম্পটেpd.যোগ করুন যেভাবে আপনি তারিখগুলি পড়তে চান।to_ datetime(df['date'], dayfirst=True) finish_reasonহলোlength। উত্তরটিmax_tokensদ্বারা কাটা হয়েছে। একটি একক লাইন ৫০০ টোকেনে ফিট করে, তাই প্রম্পট পরীক্ষা করুন: মডেল দীর্ঘ ব্যাখ্যা করছে।
আপনার প্রথম অনুরোধের সম্পূর্ণ সেটআপ, কী থেকে প্রতিক্রিয়া পর্যন্ত, CheapTokens ডক্স-এ আছে।



