@milaexplore

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

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級という結論には再現可能なデータが必要です。

そこで、本記事では次の問いに分解します。

  1. APIリクエストは安定して成功するか
  2. エンドツーエンドの応答時間はどの程度か
  3. 入出力トークン数と推定料金はいくらか
  4. 実際のタスク品質は合格基準を満たすか

比較条件

項目 設定
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
  • ライブラリ: openai 1.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件あたりのコスト」を使います。
0 likes

Your answer might help someone💌