العودة إلى المدونة

الذكاء الاصطناعي للمبتدئيندليل

اسأل LLM عن ملف CSV: أرسل المخطط، لا الجدول

أرسل أسماء الأعمدة وأنواعها و3 صفوف عينة، واحصل على سطر pandas واحد، وشغّله على الملف الكامل. أرخص من لصق الصفوف، ويمكنك التحقق من الرقم.

بواسطة CheapTokens Teamنُشر في 6 دقيقة قراءة

أسطر كود تقرأ ملف CSV، وتأخذ أنواع أعمدته وثلاثة صفوف، وتطلب سطر pandas واحدًا
في هذه الصفحة
  1. لماذا يفشل لصق الجدول كاملًا
  2. أرسل شكل الجدول، لا الجدول
  3. السكربت: اسأل، اقرأ السطر، شغّله
  4. كم يكلف: لصق كل شيء مقابل المخطط + 3 صفوف
  5. تحقق من الرقم قبل أن تثق به
  6. إذا لم ينجح الأمر

لديك sales.csv يحتوي على 5,000 صف وسؤال واحد: أي منتج بيع أكثر في أكتوبر؟ لا تلصق الملف في محادثة. أرسل إلى النموذج أسماء الأعمدة وأنواعها وثلاثة صفوف عينة، واطلب سطرًا واحدًا من pandas، ثم شغّل ذلك السطر على الملف الكامل بنفسك. النموذج لا يقرأ أبدًا صفوفك الـ 5,000، ويبقى الطلب صغيرًا جدًا، والرقم الذي تحصل عليه يأتي من كود يمكنك إعادة تشغيله.

إليك لماذا ينجح ذلك بشكل أفضل، وكيف يبدو الطلب، وسكربتًا يمكنك نسخه، وتكلفته مقارنةً بطريقة لصق كل شيء.

لماذا يفشل لصق الجدول كاملًا#

إليك قصة قد تعرفها. يلصق شخص ما 200 صف من المصروفات في محادثة ويطلب الإجمالي. تأتي الإجابة واثقة، مع الكسور وكل شيء. وهي أيضًا خاطئة، ولا شيء على الشاشة يخبرك بذلك.

يتنبأ النموذج بالنص قطعةً قطعة (تلك القطع هي tokens). مجموع 200 رقم هو 200 خطوة صغيرة بدون آلة حاسبة بالداخل، ورقم واحد منزلق يبدو تمامًا كإجابة صحيحة. الكود يتصرف بشكل مختلف: df['amount'].sum() يجمع كل الصفوف، في كل مرة، ويعطي نفس النتيجة عند التشغيل الثاني.

هناك مشكلة ثانية، وهي تتعلق بالحجم. الجدول يستهلك نافذة السياق بسرعة، وتدفع مقابل كل صف في كل سؤال. عشرة أسئلة عن نفس الملف تعني عشر نسخ من الجدول كاملًا تُرسل كمدخل.

فحص سريع

لماذا يعتبر سطر pandas أكثر أمانًا من طلب الإجمالي من النموذج؟

إظهار الإجابة

الإجابة: حاسوبك يشغّل الكود على كل صف، ويمكنك إعادة التشغيل والتحقق

لا يزال بإمكان النموذج كتابة سطر خاطئ. الفرق هو أن السطر مرئي وقابل للتكرار: تقرأه، وتشغّله، وتقارن النتيجة ببعض الصفوف يدويًا.

أرسل شكل الجدول، لا الجدول#

لا يحتاج النموذج إلى بياناتك لكتابة الكود. يحتاج إلى معرفة شكل الجدول: ما الأعمدة الموجودة، ونوع القيم التي تحملها، وكيف يُكتب الصف. هذا هو المخطط بالإضافة إلى بضعة صفوف.

لنفترض أن sales.csv لديك أربعة أعمدة. هذا هو الطلب كاملًا:

text
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'].str.startswith('2026-10')].groupby('product')['units'].sum().idxmax(). تختلف الصياغة الدقيقة من تشغيل لآخر، لذا اقرأ السطر قبل تشغيله.

لماذا ثلاثة صفوف وليس أسماء الأعمدة فقط؟ بسبب التاريخ. عمود النوع يقول object، وهذا يعني نصًا فقط. صفوف العينة تُظهر أن التاريخ مكتوب 2026-10-01، لذا يعرف النموذج أن يطابق على النص 2026-10، وليس على 10/2026 أو اسم الشهر. معظم أسطر pandas الخاطئة تأتي من تخمين تنسيق لم يكن موجودًا في الجدول أبدًا.

لصق كل صف مقابل إرسال المخطط وثلاثة صفوف
نفس السؤال: الطلب الأيسر ينمو مع الجدول، والطلب الأيمن يبقى بنفس الحجم

السكربت: اسأل، اقرأ السطر، شغّله#

السكربت أدناه يبني ذلك الطلب من ملفك، حتى لا تكتب المخطط يدويًا. يستدعي CheapTokens API عبر OpenAI Python SDK: عنوان URL الأساسي https://api.cheaptokens.dev/v1، معرف النموذج deepseek-ai/DeepSeek-V4-Flash-0731. احتفظ بالمفتاح في متغير بيئة، وليس في الملف.

python
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؛ انظر لماذا تتوقف الإجابة في منتصف الجملة). وما زلت تقرأ السطر المطبوع أولًا. إذا لمس ملفات أو الشبكة أو أي شيء لم تسأل عنه، فلا تشغّله.

التشغيل الأول يطبع ثلاثة أشياء: سطر النموذج، وعدد الرموز لهذا الطلب الواحد، والإجابة. عدد الرموز هو مقياسك للقسم التالي.

كم يكلف: لصق كل شيء مقابل المخطط + 3 صفوف#

للمقارنة، نحتاج إلى حجم للصف. لنفترض أن صفًا مثل 2026-10-01,Oat latte mix,12,4.50 يستهلك حوالي 20 رمزًا. هذا افتراض: يعتمد على مُرمِّز النموذج وأعمدتك، وعد الرموز قبل الإرسال يُظهر رقمك الحقيقي. مع 20 رمزًا للصف، 5,000 صف هي 5,000 × 20 = 100,000 رمز إدخال. طلب المخطط وثلاثة صفوف حوالي 300 رمز، بما في ذلك التعليمات. الإجابة قصيرة في كلتا الحالتين، لنقل 60 رمزًا، لذا يقع الفرق بالكامل على جانب الإدخال، الجانب الذي ينمو مع جدولك (المزيد عن ذلك في رموز الإدخال مقابل الإخراج).

سؤال واحد عن جدول بـ 5,000 صف على DeepSeek-V4-Flash، 60 رمزًا للإجابة
  • لصق كل الصفوف الـ 5,000$0.0015
  • المخطط + 3 صفوف$0.000011

كلا الرقمين صغيران بالدولار، وهذا صادق: النموذج الرخيص يجعل حتى الطريقة المسرفة ميسورة. الفجوة هي ما ينمو. اسأل 20 سؤالًا يوميًا ويُرسل طلب لصق كل شيء 20 مرة. ضاعف الجدول وتتضاعف تكلفته، بينما طلب المخطط لا يتحرك. وهناك حائط صلب: مع نافذة سياق بـ 380K رمز، 380,000 ÷ 20 = 19,000 صف هو أقصى ما يمكنك لصقه على الإطلاق، قبل ترك أي مساحة للإجابة. تصدير بـ 50,000 صف ببساطة لا يتسع. طلب المخطط يتسع، مهما كان حجم الجدول.

أدخل جدولك الخاص وشاهد التكلفة اليومية:

حاسبة التكلفة

جدولك ملصوقًا كاملًا: 20 سؤالًا يوميًا

رموز الإدخال لكل طلب: 100,000 · رموز الإخراج لكل طلب: 60 · الطلبات يوميًا: 20

النموذجيوميًاشهريًا
GLM-5.3-Flash$0.04$1.20
DeepSeek-V4-Flash$0.0301$0.904
MiniMax-M2.7$0.10$3.01

غيّر in إلى 300 لترى طريقة المخطط. DeepSeek-V4-Flash على CheapTokens له سعر واحد في أي ساعة، بدون رسوم إضافية في وقت الذروة، ورصيد واحد يغطي كل النماذج، لذا يمكنك تبديل معرف النموذج بـ zai-org/GLM-5.3-Flash (سياق 390K) بدون حساب ثانٍ. الأسعار الحالية على صفحة الأسعار.

تحقق من الرقم قبل أن تثق به#

الحلقة دائمًا هي نفسها. افعلها في كل مرة، وتُلتقط الإجابة الخاطئة في الخطوة الرابعة بدلًا من تقرير.

رتّب بالترتيب

رتّب الحلقة

  1. صف الجدول: أنواع الأعمدة و3 صفوف عينة
  2. اطلب سطر pandas واحدًا، لا شيء آخر
  3. اقرأ السطر، ثم شغّله على الملف الكامل
  4. تحقق من النتيجة يدويًا على بضعة صفوف
الحلقة: الجدول، المخطط وثلاثة صفوف، سطر pandas واحد، رقمك
النموذج يرى الخطوة الوسطى فقط؛ الجدول الكامل لا يغادر حاسوبك أبدًا

الخطوة الرابعة رخيصة. صفِّ الملف إلى حفنة من الصفوف (df[df['product'] == 'Cocoa'].head(10))، واجمعها في رأسك أو في جدول بيانات، وقارن. إذا كان سطر النموذج خاطئًا، فهو عادةً خاطئ بطريقة واضحة: عدّ الصفوف بدلًا من جمع units، أو اختار الشهر الخطأ.

لمزيد من العادات مثل هذه، انظر لماذا يختلق الذكاء الاصطناعي الأشياء و4 عادات في الطلب تقلل ذلك.

إذا لم ينجح الأمر#

  • KeyError: 'Date'. كتب النموذج اسم عمود بأحرف كبيرة مختلفة. الصق صف الترويسة الحقيقي في الطلب، وهو ما تفعله صفوف العينة الثلاثة بالفعل، وأضف "استخدم أسماء الأعمدة تمامًا كما هي معروضة".
  • الرد يحتوي على جملة قبل الكود. يفشل eval لديك مع SyntaxError. كرر "سطر واحد من كود pandas، بدون شرح" في نهاية الطلب، فالتعليمة الأخيرة هي الأكثر وزنًا.
  • الإجابة جدول، وليس رقمًا. قل الشكل الذي تريده: "أعد رقمًا واحدًا" أو "أعد Series مرتبة تنازليًا".
  • التواريخ تخرج خاطئة. صفوف العينة تُظهر التنسيق الحقيقي. إذا كانت تواريخك 14/10/2026، يحتاج النموذج إلى رؤية ذلك؛ أضف pd.to_datetime(df['date'], dayfirst=True) إلى الطلب كطريقة تريد قراءة التواريخ بها.
  • finish_reason هو length. قُطع الرد بواسطة max_tokens. سطر واحد يتسع في 500 رمز، لذا تحقق من الطلب: قد يكون النموذج يشرح بإسهاب.

الإعداد الكامل لطلبك الأول، من المفتاح إلى الاستجابة، في وثائق CheapTokens.