DeepSeek V4 FlashとGPT-4oを同条件で比較する方法 — 速度・料金・品質をPythonで測る
Discussion
DeepSeek V4 FlashがGPT-4o級かどうかは、タイトルや単発プロンプトでは判断できません。本記事では同じAPI、同じ3タスク、同じ実行回数で両モデルを呼び出し、成功率、中央値・P95レイテンシ、トークン数、推定料金を測定します。品質は回答を匿名化して別途採点します。
「無料」「GPT-4o級」を先に結論にしない
元の企画では「無料でGPT-4o級の性能を試す」というテーマでした。しかし、2026年7月23日時点で確認できるCometAPIルートは従量課金です。また、品質はタスクによって変わるため、GPT-4o級という結論には再現可能なデータが必要です。
そこで、本記事では次の問いに分解します。
- APIリクエストは安定して成功するか
- エンドツーエンドの応答時間はどの程度か
- 入出力トークン数と推定料金はいくらか
- 実際のタスク品質は合格基準を満たすか
比較条件
| 項目 | 設定 |
|---|---|
| API | CometAPI OpenAI互換エンドポイント |
| モデル |
deepseek-v4-flash / gpt-4o
|
| タスク | JSON抽出、Python修正、制約付き推論 |
| 実行回数 | 各タスク5回(変更可能) |
| 実行順 | ランダム |
| temperature | 0 |
| リトライ | 0(失敗を隠さないため) |
| 速度 | クライアント側の全応答時間 |
| 品質 | モデル名を隠して合否判定 |
ここで測るのは全応答時間です。ストリーミング時のTime to First Tokenとは異なります。
2026年7月23日時点のルート料金
CometAPIモデル一覧で確認できたテキスト料金は次のとおりです。
| モデル | 入力 / 1M tokens | 出力 / 1M tokens |
|---|---|---|
| DeepSeek V4 Flash | $0.15 | $0.30 |
| GPT-4o | $2.50 | $10.00 |
GPT-4oの入力単価はFlashの約16.7倍、出力単価は約33.3倍です。これは単価の比較であり、品質や成功1件あたりのコストを表すものではありません。
環境
- OS: macOS 15 / Ubuntu 24.04
- Python: 3.12
- ライブラリ:
openai1.x系 - APIキー: 環境変数
COMETAPI_KEY
1. セットアップ
python3 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade openai
export COMETAPI_KEY="your_api_key_here"
export DEEPSEEK_MODEL_ID="deepseek-v4-flash"
export GPT4O_MODEL_ID="gpt-4o"
モデルIDと料金は実行前にモデル一覧で再確認してください。
2. ベンチマークコード
compare_models.pyを作成します。
import json
import math
import os
import random
import statistics
import time
from pathlib import Path
from openai import OpenAI
def required(name: str) -> str:
value = os.environ.get(name)
if not value:
raise RuntimeError(f"環境変数{name}を設定してください。")
return value
def percentile(values: list[float], fraction: float) -> float:
ordered = sorted(values)
index = max(0, math.ceil(fraction * len(ordered)) - 1)
return ordered[index]
runs = int(os.environ.get("BENCHMARK_RUNS", "5"))
if runs < 3:
raise RuntimeError("BENCHMARK_RUNSは3以上にしてください。")
# 2026-07-23時点のCometAPIモデル一覧。実行前に更新してください。
models = [
{
"label": "DeepSeek V4 Flash",
"id": os.environ.get("DEEPSEEK_MODEL_ID", "deepseek-v4-flash"),
"input_usd_per_m": 0.15,
"output_usd_per_m": 0.30,
},
{
"label": "GPT-4o",
"id": os.environ.get("GPT4O_MODEL_ID", "gpt-4o"),
"input_usd_per_m": 2.50,
"output_usd_per_m": 10.00,
},
]
tasks = [
{
"id": "json_extract",
"prompt": (
"JSONオブジェクトだけを返してください。必須キーはcustomer、plan、"
"renewal_date、riskです。入力: Northwind LabsはProプラン。"
"更新日は2026-09-30。2回のエクスポート失敗が更新リスクです。"
),
"check": "JSONとして読み込め、4項目が入力と一致すること",
},
{
"id": "code_fix",
"prompt": (
"次のPython関数のmutable default引数を修正し、修正版と2文の説明を"
"返してください。\n\ndef add_item(item, bucket=[]):\n"
" bucket.append(item)\n return bucket"
),
"check": "デフォルトをNoneにし、関数内でリストを作成すること",
},
{
"id": "reasoning",
"prompt": (
"バッチ処理は毎分120件です。600件ごとに30秒停止します。"
"開始時は停止せず、1,800件を完了する時間を分単位で計算してください。"
"最後の600件後の停止を含めるか、前提も明記してください。"
),
"check": "最終停止の扱いを明記し、その前提と計算が一致すること",
},
]
client = OpenAI(
api_key=required("COMETAPI_KEY"),
base_url="https://api.cometapi.com/v1",
timeout=120.0,
max_retries=0,
)
records = []
for run in range(1, runs + 1):
work = [(model, task) for task in tasks for model in models]
random.shuffle(work)
for model, task in work:
started = time.perf_counter()
record = {
"run": run,
"model": model["label"],
"model_id": model["id"],
"task": task["id"],
"quality_check": task["check"],
}
try:
response = client.chat.completions.create(
model=model["id"],
messages=[{"role": "user", "content": task["prompt"]}],
temperature=0,
max_completion_tokens=800,
)
elapsed = time.perf_counter() - started
usage = response.usage
input_tokens = usage.prompt_tokens if usage else 0
output_tokens = usage.completion_tokens if usage else 0
estimated_cost = (
input_tokens * model["input_usd_per_m"] / 1_000_000
+ output_tokens * model["output_usd_per_m"] / 1_000_000
)
record.update(
{
"ok": True,
"elapsed_seconds": elapsed,
"input_tokens": input_tokens,
"output_tokens": output_tokens,
"estimated_cost_usd": estimated_cost,
"output": response.choices[0].message.content or "",
}
)
except Exception as exc:
record.update(
{
"ok": False,
"elapsed_seconds": time.perf_counter() - started,
"error_type": type(exc).__name__,
}
)
records.append(record)
print(
f"run={run} model={model['label']} task={task['id']} "
f"ok={record['ok']} seconds={record['elapsed_seconds']:.2f}"
)
Path("comparison_results.json").write_text(
json.dumps(records, ensure_ascii=False, indent=2),
encoding="utf-8",
)
print("\n| Model | Success | Median latency | P95 latency | Total cost |")
print("|---|---:|---:|---:|---:|")
for model in models:
rows = [row for row in records if row["model"] == model["label"]]
successful = [row for row in rows if row["ok"]]
if not successful:
print(f"| {model['label']} | 0/{len(rows)} | n/a | n/a | n/a |")
continue
latencies = [row["elapsed_seconds"] for row in successful]
total_cost = sum(row["estimated_cost_usd"] for row in successful)
print(
f"| {model['label']} | {len(successful)}/{len(rows)} "
f"| {statistics.median(latencies):.2f}s "
f"| {percentile(latencies, 0.95):.2f}s "
f"| ${total_cost:.6f} |"
)
print("\n回答全文はcomparison_results.jsonへ保存しました。")
実行します。
python compare_models.py
実行回数を20回へ増やす場合:
BENCHMARK_RUNS=20 python compare_models.py
3. 品質を採点する
速度と料金だけでは、GPT-4o級かどうかを判断できません。comparison_results.jsonからモデル名を隠し、quality_checkに沿って合否を付けます。
品質合格率 = 合格した回答数 / 成功したAPIリクエスト数
合格1件あたりのコスト = 全リクエストの料金 / 合格した回答数
JSONが構文的に正しくても、内容が間違っていれば不合格です。コードはテストを実行し、推論問題は前提と計算の一貫性を確認します。
4. 公開時に記録する情報
再現可能な比較にするため、結果と一緒に次を公開します。
- 実行日時とクライアント地域
- 正確なモデルID
- SDKバージョン
- 各タスクのプロンプト
- モデルごとの実行回数
- 成功数と失敗数
- 中央値とP95レイテンシ
- 入出力トークン数
- 採点ルールと品質合格率
- 実行日に確認した料金
1回の実行結果や、異なるプロンプトで得た速度は比較データとして不十分です。
5. この比較で分かること・分からないこと
分かること:
- 3つの公開タスクに対するAPIの成功率
- クライアントから見た全応答時間
- トークン使用量と概算料金
- 定義した採点基準での品質
分からないこと:
- すべての日本語タスクでの優劣
- ストリーミングのTime to First Token
- 高並列時のスループット
- 画像、音声、ツール呼び出しの性能
- 他の地域・時刻・プロバイダーでの結果
必要なユースケースごとにタスクを追加してください。
まとめ
- DeepSeek V4 FlashとGPT-4oは同じ条件で比較します。
- 「無料」「GPT-4o級」は実測前の結論にしません。
- 速度は中央値とP95、料金は入出力を分けて計算します。
- 品質はモデル名を隠し、タスク別の基準で採点します。
- 最終判断には「合格1件あたりのコスト」を使います。