Bumalik sa blog

AI para sa mga baguhanGabay

Magtanong sa isang LLM tungkol sa isang CSV: ipadala ang schema, hindi ang talahanayan

Ipadala ang mga pangalan ng column, mga tipo at 3 sample na row, makakuha ng isang linya ng pandas, patakbuhin ito sa buong file. Mas mura kaysa sa pag-paste ng mga row, at masusuri mo ang numero.

Ni CheapTokens TeamNai-publish noong 8 min na pagbabasa

Mga linya ng code na nagbabasa ng CSV, kumukuha ng mga tipo ng column at tatlong row, at humihingi ng isang linya ng pandas
Sa pahinang ito
  1. Bakit mali ang pag-paste ng buong talahanayan
  2. Ipadala ang hugis ng talahanayan, hindi ang talahanayan
  3. Ang script: magtanong, basahin ang linya, patakbuhin ito
  4. Magkano ito: i-paste ang lahat vs schema + 3 row
  5. Suriin ang numero bago mo ito pagkatiwalaan
  6. Kung hindi ito gumana

Mayroon kang sales.csv na may 5,000 row at isang tanong: aling produkto ang pinakamalaki ang benta noong Oktubre? Huwag i-paste ang file sa chat. Ipadala sa modelo ang mga pangalan ng column, ang kanilang mga tipo at tatlong sample na row, humingi ng isang linya ng pandas, at patakbuhin ang linyang iyon sa buong file nang mag-isa. Hindi kailanman binabasa ng modelo ang iyong 5,000 row, nananatiling maliit ang prompt, at ang numerong makukuha mo ay mula sa code na maaari mong patakbuhin muli.

Narito kung bakit mas mahusay iyon, ano ang hitsura ng prompt, isang script na maaari mong kopyahin, at kung magkano ito kumpara sa paraan ng pag-paste ng lahat.

Bakit mali ang pag-paste ng buong talahanayan#

Narito ang isang kuwento na maaaring pamilyar sa iyo. May nag-paste ng 200 row ng mga gastos sa isang chat at humingi ng kabuuan. Ang sagot ay bumalik nang may kumpiyansa, may sentimo at lahat. Mali rin ito, at walang nakasaad sa screen na nagsasabi nito.

Hinuhulaan ng modelo ang teksto nang paisa-isa (ang mga pirasong iyon ay tokens). Ang kabuuan ng 200 numero ay 200 maliit na hakbang na walang calculator sa loob, at ang isang nadulas na digit ay mukhang eksaktong tamang sagot. Iba ang kilos ng code: idinadagdag ng df['amount'].sum() ang lahat ng row, sa bawat pagkakataon, at pareho ang resulta sa ikalawang pagtakbo.

May pangalawang problema, at tungkol ito sa laki. Mabilis na nauubos ng talahanayan ang context window, at nagbabayad ka para sa bawat row sa bawat tanong. Sampung tanong tungkol sa parehong file ay nangangahulugang sampung kopya ng buong talahanayan ang ipinapadala bilang input.

Mabilisang pagsusuri

Bakit mas ligtas ang isang linya ng pandas kaysa humingi ng kabuuan sa modelo?

Ipakita ang sagot

Sagot: Pinapatakbo ng iyong computer ang code sa bawat row, at maaari mong patakbuhin muli at suriin ito

Maaari pa ring magsulat ang modelo ng maling linya. Ang pagkakaiba ay ang isang linya ay nakikita at nauulit: binabasa mo ito, pinapatakbo, at inihahambing ang resulta sa ilang row sa pamamagitan ng kamay.

Ipadala ang hugis ng talahanayan, hindi ang talahanayan#

Hindi kailangan ng modelo ang iyong data para magsulat ng code. Kailangan nitong malaman kung ano ang hitsura ng talahanayan: aling mga column ang umiiral, anong uri ng mga halaga ang nilalaman nila, at paano isinusulat ang isang row. Iyon ang schema kasama ang ilang row.

Sabihin nating ang iyong sales.csv ay may apat na column. Ito ang buong prompt:

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.

Asahan ang isang tugon na hugis df[df['date'].str.startswith('2026-10')].groupby('product')['units'].sum().idxmax(). Nag-iiba ang eksaktong pananalita sa bawat pagtakbo, kaya basahin ang linya bago mo ito patakbuhin.

Bakit tatlong row at hindi lamang ang mga pangalan ng column? Dahil sa petsa. Sinasabi ng column ng tipo na object, na ang ibig sabihin lang ay teksto. Ipinapakita ng mga sample na row na ang petsa ay isinusulat na 2026-10-01, kaya alam ng modelo na tumugma sa tekstong 2026-10, hindi sa 10/2026 o sa pangalan ng buwan. Karamihan sa mga maling linya ng pandas ay nagmumula sa paghula ng format na hindi kailanman naging ganito ang talahanayan.

Pag-paste ng bawat row kumpara sa pagpapadala ng schema at tatlong row
Ang parehong tanong: lumalaki ang kaliwang prompt kasabay ng talahanayan, ang kanan ay nananatiling pareho ang laki

Ang script: magtanong, basahin ang linya, patakbuhin ito#

Binubuo ng script sa ibaba ang prompt na iyon mula sa iyong file, para hindi mo kailangang i-type ang schema nang manu-mano. Tinatawag nito ang CheapTokens API sa pamamagitan ng OpenAI Python SDK: base URL https://api.cheaptokens.dev/v1, model id deepseek-ai/DeepSeek-V4-Flash-0731. Itago ang key sa isang environment variable, hindi sa file.

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}))

Ang huling bloke ay ang bahaging nilalaktawan ng mga baguhan. Pinapatakbo ng eval ang anumang tekstong isinulat ng modelo, sa iyong makina, kaya tinatanggihan ng script ang mga linyang may import o __ at ang mga sagot na naputol (finish_reason maliban sa stop; tingnan ang bakit napuputol ang isang sagot sa gitna ng pangungusap). At binabasa mo pa rin muna ang naka-print na linya. Kung may hinahawakan itong file, network o anumang bagay na hindi mo hiniling, huwag itong patakbuhin.

Sa unang pagtakbo, tatlong bagay ang ipi-print: ang linya ng modelo, ang mga bilang ng token para sa isang request na ito, at ang sagot. Ang mga bilang ng token ang iyong metro para sa susunod na seksyon.

Magkano ito: i-paste ang lahat vs schema + 3 row#

Para ihambing, kailangan natin ng laki para sa isang row. Sabihin nating ang isang row na tulad ng 2026-10-01,Oat latte mix,12,4.50 ay tumatagal ng mga 20 token. Iyon ay isang palagay: nakadepende ito sa tokenizer ng modelo at sa iyong mga column, at ang pagbilang ng token bago ka magpadala ay nagpapakita ng iyong tunay na numero. Sa 20 token bawat row, ang 5,000 row ay 5,000 × 20 = 100,000 input token. Ang prompt na schema-at-tatlong-row ay humigit-kumulang 300 token, kasama ang mga tagubilin. Maikli ang sagot sa parehong kaso, sabihin nating 60 token, kaya ang pagkakaiba ay nasa panig ng input, ang isa na lumalaki kasabay ng iyong talahanayan (higit pa tungkol diyan sa input vs output token).

Isang tanong tungkol sa 5,000-row na talahanayan sa DeepSeek-V4-Flash, 60 token ang sagot
  • I-paste ang lahat ng 5,000 row$0.0015
  • Schema + 3 row$0.000011

Maliit sa dolyar ang parehong numero, at tapat iyon: ginagawang abot-kaya ng murang modelo kahit ang mapag-aksayang paraan. Ang agwat ang lumalaki. Magtanong ng 20 tanong sa isang araw at ang prompt na pag-paste ng lahat ay ipinapadala ng 20 beses. Doblehin ang talahanayan at dumodoble ang gastos nito, habang hindi gumagalaw ang schema prompt. At may matigas na hangganan: sa 380K-token na context window, 380,000 ÷ 20 = 19,000 row ang pinakamaraming maaari mong i-paste, bago pa maglaan ng anumang espasyo para sa sagot. Ang 50,000-row na export ay hindi talaga kasya. Ang schema prompt ay kasya, anuman ang laki ng talahanayan.

Ipasok ang iyong sariling talahanayan at tingnan ang pang-araw-araw na gastos:

Calculator ng gastos

Ang iyong talahanayan na buong na-paste: 20 tanong sa isang araw

Mga input token bawat kahilingan: 100,000 · Mga output token bawat kahilingan: 60 · Mga kahilingan bawat araw: 20

ModeloBawat arawBawat buwan
GLM-5.3-Flash$0.04$1.20
DeepSeek-V4-Flash$0.0301$0.904
MiniMax-M2.7$0.10$3.01

Palitan ang in ng 300 para makita ang paraan ng schema. Ang DeepSeek-V4-Flash sa CheapTokens ay may isang presyo sa anumang oras, walang peak-time surcharge, at isang balanse ang sumasaklaw sa bawat modelo, kaya maaari mong palitan ang model id ng zai-org/GLM-5.3-Flash (390K context) nang walang pangalawang account. Ang mga kasalukuyang presyo ay nasa pahina ng presyo.

Suriin ang numero bago mo ito pagkatiwalaan#

Palaging pareho ang loop. Gawin ito sa bawat pagkakataon, at ang maling sagot ay mahuhuli sa ika-apat na hakbang sa halip na sa isang ulat.

Ilagay sa tamang pagkakasunod-sunod

Ayusin ang loop

  1. Ilarawan ang talahanayan: mga tipo ng column at 3 sample na row
  2. Humingi ng isang linya ng pandas, wala nang iba
  3. Basahin ang linya, pagkatapos patakbuhin ito sa buong file
  4. Suriin ang resulta sa pamamagitan ng kamay sa ilang row
Ang loop: talahanayan, schema at tatlong row, isang linya ng pandas, ang iyong numero
Ang modelo ay nakakakita lamang ng gitnang hakbang; hindi kailanman lumalabas ang buong talahanayan sa iyong computer

Mura ang ika-apat na hakbang. I-filter ang file pababa sa ilang row (df[df['product'] == 'Cocoa'].head(10)), pagsamahin ang mga ito sa iyong isip o sa isang spreadsheet, at ihambing. Kung mali ang linya ng modelo, kadalasan mali ito sa halatang paraan: binilang nito ang mga row sa halip na isama ang units, o pinili nito ang maling buwan.

Para sa higit pang mga gawi na tulad nito, tingnan ang bakit nag-iimbento ang AI at 4 na gawi sa prompt na nagpapababa nito.

Kung hindi ito gumana#

  • KeyError: 'Date'. Nagsulat ang modelo ng pangalan ng column na may ibang malalaking titik. I-paste ang tunay na header row sa prompt, na ginagawa na ng tatlong sample na row, at idagdag ang "gamitin ang mga pangalan ng column nang eksakto tulad ng ipinakita".
  • May pangungusap bago ang code sa tugon. Nabigo ang iyong eval na may SyntaxError. Ulitin ang "ISANG linya ng pandas code, walang paliwanag" sa dulo ng prompt, ang huling tagubilin ang pinakamabigat.
  • Ang sagot ay isang talahanayan, hindi isang numero. Sabihin kung anong hugis ang gusto mo: "magbalik ng isang numero" o "magbalik ng Series na nakaayos pababa".
  • Mali ang mga petsa. Ipinapakita ng mga sample na row ang tunay na format. Kung ang iyong mga petsa ay 14/10/2026, kailangan itong makita ng modelo; idagdag ang pd.to_datetime(df['date'], dayfirst=True) sa prompt bilang paraan ng pagbasa mo ng mga petsa.
  • Ang finish_reason ay length. Naputol ang tugon ng max_tokens. Kasya ang isang linya sa 500 token, kaya suriin ang prompt: maaaring nagpapaliwanag nang mahaba ang modelo.

Ang buong setup para sa iyong unang request, mula sa key hanggang sa tugon, ay nasa CheapTokens docs.