ブログに戻る

AI入門ガイド

CSVについてLLMに尋ねる:テーブルではなくスキーマを送る

列名、型、3つのサンプル行を送り、1行のpandasを返してもらい、フルファイルで実行します。行を貼り付けるより安く、数値を確認できます。

投稿者: CheapTokens Team公開日 読了時間 8 分

CSVを読み取り、列の型と3行を取得し、1行のpandasを要求するコード行
このページの内容
  1. テーブル全体を貼り付けると失敗する理由
  2. テーブルではなくテーブルの形を送る
  3. スクリプト:尋ね、行を読み、実行する
  4. コスト:全部貼り付ける vs スキーマ+3行
  5. 信頼する前に数値を確認する
  6. うまくいかない場合

5,000行のsales.csvがあり、疑問は1つだけです。10月に最も売れた商品はどれか? ファイルをチャットに貼り付けないでください。モデルには列名、その型、3つのサンプル行を送り、1行のpandasを要求し、その行を自分でフルファイルに対して実行します。モデルは5,000行を読むことはなく、プロンプトは小さく保たれ、得られる数値は再実行可能なコードから来ます。

なぜその方がうまくいくのか、プロンプトがどのようなものか、コピーできるスクリプト、そして全部貼り付ける方法と比べてどれくらいのコストがかかるかを説明します。

テーブル全体を貼り付けると失敗する理由#

よくある話かもしれません。誰かが200行の経費をチャットに貼り付けて合計を求めます。答えは自信満々に、セント単位まで返ってきます。しかしそれは間違っており、画面上にはそれを示すものは何もありません。

モデルはテキストを断片的に予測します(その断片はトークンです)。200個の数値の合計は200の小さなステップで、内部に計算機はなく、1桁のずれが正解と全く同じに見えます。コードは違います。df['amount'].sum()は毎回すべての行を加算し、2回目の実行でも同じ結果を返します。

2つ目の問題はサイズです。テーブルはコンテキストウィンドウを急速に消費し、質問のたびにすべての行に対して料金を支払います。同じファイルについて10の質問をすると、テーブル全体のコピーが10回入力として送信されます。

クイックチェック

なぜpandasの1行はモデルに合計を尋ねるより安全なのか?

答えを表示

答え: あなたのコンピュータがすべての行に対してコードを実行し、再実行して確認できる

モデルは間違った行を書くこともあります。違いは、行が目に見え、再現可能であることです。読んで、実行し、結果を手作業で数行と比較します。

テーブルではなくテーブルの形を送る#

モデルはコードを書くのにあなたのデータを必要としません。必要なのはテーブルがどのようなものかを知ることです。どの列が存在し、どのような種類の値を持ち、行がどのように書かれているか。それがスキーマと数行です。

sales.csvに4つの列があるとします。これがプロンプト全体です:

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()のような形の返答を期待してください。正確な文言は実行ごとに異なるので、実行する前にその行を読んでください。

なぜ列名だけでなく3行なのか? それは日付のためです。型列はobjectと言っていますが、これはテキストという意味だけです。サンプル行は日付が2026-10-01と書かれていることを示すので、モデルは10/2026や月名ではなく、テキスト2026-10に一致させるべきだとわかります。間違ったpandas行のほとんどは、テーブルになかった形式を推測することから来ます。

すべての行を貼り付ける場合とスキーマと3行を送る場合
同じ質問:左のプロンプトはテーブルとともに大きくなり、右は同じサイズのまま

スクリプト:尋ね、行を読み、実行する#

以下のスクリプトはそのプロンプトをファイルから構築するので、スキーマを手で入力する必要はありません。OpenAI Python SDKを通じてCheapTokens APIを呼び出します:ベースURL https://api.cheaptokens.dev/v1、モデルID 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や__を含む行や、途中で切れた回答(stop以外のfinish_reason。回答が途中で止まる理由を参照)を拒否します。そして、最初に印刷された行を読む必要があります。ファイル、ネットワーク、または尋ねていないものに触れる場合は、実行しないでください。

最初の実行では3つのことが表示されます:モデルの行、この1回のリクエストのトークン数、そして答えです。トークン数は次のセクションのメーターです。

コスト:全部貼り付ける vs スキーマ+3行#

比較するには、行のサイズが必要です。2026-10-01,Oat latte mix,12,4.50のような行が約20トークンかかるとします。これは仮定です:モデルのトークナイザーと列によって異なり、送信前にトークンを数えると実際の数値がわかります。1行20トークンで、5,000行は5,000 × 20 = 100,000入力トークンです。スキーマと3行のプロンプトは指示を含めて約300トークンです。答えはどちらの場合も短く、例えば60トークンなので、差は完全に入力側、つまりテーブルとともに増える側にあります(詳細は入力トークンと出力トークン)。

DeepSeek-V4-Flashで5,000行のテーブルについての1つの質問、答えは60トークン
  • 5,000行すべてを貼り付ける$0.0015
  • スキーマ+3行$0.000011

どちらの数値もドルでは小さいです。そしてそれは正直なことです:安いモデルなら無駄な方法でも手頃になります。差は増えるものです。1日に20の質問をすると、全部貼り付けるプロンプトは20回送信されます。テーブルが2倍になればコストも2倍になりますが、スキーマプロンプトは動きません。そして厳しい壁があります:380Kトークンのコンテキストウィンドウでは、380,000 ÷ 20 = 19,000行が、答えのための余裕を残す前に貼り付けられる最大行数です。50,000行のエクスポートは単純に収まりません。スキーマプロンプトはテーブルサイズに関係なく収まります。

自分のテーブルを入力して日々のコストを確認してください:

コスト計算機

テーブル全体を貼り付けた場合:1日20の質問

リクエストあたりの入力トークン数: 100,000 · リクエストあたりの出力トークン数: 60 · 1日あたりのリクエスト数: 20

モデル1日あたり1か月あたり
GLM-5.3-Flash$0.04$1.20
DeepSeek-V4-Flash$0.0301$0.904
MiniMax-M2.7$0.10$3.01

inを300に変更してスキーマ方式を確認してください。CheapTokensのDeepSeek-V4-Flashはいつでも同じ価格で、ピーク時の割増はなく、1つの残高で全てのモデルをカバーするので、2つ目のアカウントなしでモデルIDをzai-org/GLM-5.3-Flash(390Kコンテキスト)に切り替えられます。現在の価格は価格ページにあります。

信頼する前に数値を確認する#

ループは常に同じです。毎回行えば、間違った答えはレポートではなくステップ4で捕まえられます。

順番に並べる

ループを順番に並べる

  1. テーブルを説明する:列の型と3つのサンプル行
  2. 1行のpandasだけを要求する
  3. その行を読み、フルファイルで実行する
  4. 数行で手作業で結果を確認する
ループ:テーブル、スキーマと3行、1行のpandas、あなたの数値
モデルは中間ステップだけを見る。テーブル全体はあなたのコンピュータから出ない

ステップ4は安価です。ファイルを数行に絞り込み(df[df['product'] == 'Cocoa'].head(10))、頭の中やスプレッドシートで合計し、比較します。モデルの行が間違っている場合、通常は明らかな間違いです:unitsを合計する代わりに行を数えたり、間違った月を選んだりします。

このような習慣をもっと知りたい場合は、AIがなぜ作り話をするのか、そしてそれを減らす4つのプロンプト習慣をご覧ください。

うまくいかない場合#

  • KeyError: 'Date'。モデルが大文字小文字の異なる列名を書きました。実際のヘッダー行をプロンプトに貼り付けてください(3つのサンプル行はすでにそうしています)、そして「列名は示されたとおりに正確に使用する」と追加してください。
  • 返答にコードの前に文がある。evalがSyntaxErrorで失敗します。プロンプトの最後に「pandasコードを1行だけ、説明なし」を繰り返してください。最後の指示が最も重要です。
  • 答えが数値ではなくテーブル。欲しい形を指定してください:「単一の数値を返す」または「降順にソートされたSeriesを返す」。
  • 日付が間違って出る。サンプル行が実際の形式を示しています。日付が14/10/2026の場合、モデルはそれを見る必要があります。プロンプトにpd.to_datetime(df['date'], dayfirst=True)を日付の読み方として追加してください。
  • finish_reasonがlength。返答がmax_tokensで切れました。1行は500トークンに収まるので、プロンプトを確認してください:モデルが長々と説明している可能性があります。

最初のリクエストの完全な設定は、キーから応答までCheapTokensドキュメントにあります。