AI エージェント評価ベンチ「EdgeBench」分析
ByteDance Seed が公開した EdgeBench は、AI エージェントの多様なタスクカテゴリや実行環境における評価を可能にする実践的なベンチマークであり、スケーリング法則の解析と正規化スコアの算出手法を提供する。
キーポイント
EdgeBench の包括的評価枠組み
多様なタスクカテゴリ、ランタイム環境、インタラクション時間予算を考慮した、AI エージェントの高度な評価基準を提供する。
データ解析とスコアリング手法
Hugging Face からのデータ取得から始まり、タスクレベルの結果整形、モデル名の標準化、そして対数シグモイド曲線によるスケーリング法則のフィットまでを含む完全なパイプラインを提示する。
パフォーマンス比較と改善分析
異なる時間予算における複数モデル(Claude, GPT, GLM など)のパフォーマンス比較を行い、カテゴリ別スコアの向上度合いや劇的な進歩を示すタスクを特定する。
SForge による正規化プロセス
生評価出力を正規化されたベンチマークスコアへ変換するための SForge rescale 関数の仕組みと、その効果について詳述している。
タスク仕様の構造化と読み込み
コードはJSON形式のタスク仕様を解析し、カテゴリ、ランタイム環境(base_image)、インターネットアクセスの有無、評価ロジックなどの重要なメタデータを抽出してデータフレームに格納します。
ベンチマークの分類と統計分析
カテゴリ別、実行環境別、リスケール手法別のタスク数をカウントし、視覚化することでベンチマーク全体の構成や特徴を把握しています。
個々のタスクの詳細な解剖
代表的な1つのタスクを選択してその詳細(評価パーサー、リスケール設定、エージェントへのクエリなど)を確認し、評価がどのように定義されているかを具体的に見ています。
重要な引用
EdgeBench as a practical benchmark for evaluating advanced AI agents across diverse task categories, runtime environments, and interaction-time budgets.
We then fit log-sigmoid scaling curves, measure category-level score improvements, inspect the tasks with the largest gains...
study how SForge rescale functions transform raw evaluation outputs into normalized benchmark scores.
"We parse every task specification into a structured table containing its category, runtime image, internet access, submission paths, judge configuration, and agent query."
"We summarize the benchmark taxonomy by counting tasks across categories, execution environments, rescaling methods, and game modes."
"We read the repository README and extract its Markdown tables into structured Python records."
影響分析・編集コメントを表示
影響分析
この記事は、AI エージェントの評価において「時間制約」や「環境依存性」といった実世界の複雑さをどう扱うかという重要な課題に対し、具体的なデータ解析手法とツールを提供している。特に、スケーリング法則の定量的分析と正規化スコアの算出プロセスを公開することで、研究コミュニティや開発者がより公平かつ厳密にモデル性能を比較・評価できる基盤を強化する。
編集コメント
EdgeBench は、AI エージェントの評価基準を「静的な正解率」から「動的なタスク遂行能力」へとシフトさせる重要なステップを示唆しています。特に、時間予算や環境制約を考慮した評価フレームワークは、実世界での AI 導入におけるボトルネック解析に直結する価値があります。
本チュートリアルでは、多様なタスクカテゴリ、ランタイム環境、およびインタラクション時間制約にわたって高度な AI エージェントを評価するための実践的なベンチマーク「EdgeBench」を取り上げます。
まずは Hugging Face からデータセットのスナップショットをダウンロードし、公開されたタ仕様の解析を行います。さらに、ベンチマークの分類体系、実行設定、インターネット接続の有無判定基準、採点ロジック、そしてスコアリングメタデータを詳しく確認していきます。
次に、リポジトリの README ファイルからリーダーボードデータを直接抽出し、モデル名を統一します。タスクレベルの結果を分析可能な形式に整形した上で、複数の時間制約におけるパフォーマンスを比較検討します。
最後に、対数シグモイド関数を用いたスケーリング曲線のフィッティングを行い、カテゴリ別のスコア改善度を測定します。また、最も大きな進歩が見られたタスクの具体例を検証し、SForge のリスケール関数がどのようにして生データの評価結果を正規化されたベンチマークスコアへと変換するかを解説します。
!pip -q install "huggingface_hub>=0.23" pandas numpy scipy matplotlib pyyaml
import os, glob, json, textwrap, warnings
import numpy as np, pandas as pd
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
from huggingface_hub import snapshot_download
warnings.filterwarnings("ignore")
pd.set_option("display.max_colwidth", 90)
pd.set_option("display.width", 160)
REPO_ID = "ByteDance-Seed/EdgeBench"
TIME_BUDGETS = [2, 4, 6, 8, 10, 12]
MODELS = ["Claude Opus 4.8", "GPT-5.5", "GPT-5.4", "GLM-5.1", "DS-V4-Pro"]
def banner(t):
print("\n" + "=" * 78 + f"\n {t}\n" + "=" * 78)
def canon_model(name):
n = name.lower()
if "opus" in n:
return "Claude Opus 4.8"
if "5.5" in n:
return "GPT-5.5"
if "5.4" in n:
return "GPT-5.4"
if "glm" in n:
return "GLM-5.1"
if "ds-v4" in n or "deepseek" in n:
return "DS-V4-Pro"
return name
banner("1. DOWNLOADING DATASET SNAPSHOT")
local_dir = snapshot_download(repo_id=REPO_ID, repo_type="dataset")
print("Snapshot cached at:", local_dir)
必要な Python ライブラリのインストールと解析ツールの読み込み、そしてノートブックの表示設定を完了しました。データセットのリポジトリ名や、タスクに割り当てる時間予算、評価対象となるモデルの一覧、さらに出力フォーマットを整えるためのヘルパー関数も定義しています。最後に、Hugging Face から EdgeBench データセットのスナップショット全体をダウンロードし、以降の処理で参照できるようローカルキャッシュへのパスを取得します。
Copy CodeCopiedUse a different Browser
- タスク仕様の読み込み
タスクの定義を平坦化し、必要な情報を抽出する関数 flatten_task を定義します。この関数は、作業内容(work)と評価者(judge)の設定から、タスク ID、名前、カテゴリ、ベース画像、インターネット接続の有無、ゲームモード、作業ディレクトリ、提出回数、提出パスのリスト、パーサーの種類、スコア方向、選択基準、評価タイムアウト、再スケーリングの種類と詳細、そしてエージェントへのクエリなどを抽出して辞書形式で返します。
次に、指定されたディレクトリ内のすべての JSON ファイルを順に読み込みます。各ファイルを開いてタスク情報を取得し、リスト records に追加していきます。読み込みに失敗した場合は、エラーメッセージと共にスキップされます。最後に、取得したデータを DataFrame として整形し、タスク ID が欠落している行を削除して初期化します。
読み込まれたタ仕様の総数と、カテゴリ、ベース画像、インターネット接続の有無、再スケーリングの種類に関する主要な情報のサマリーが出力されます。
- ベンチマークの分類体系
各カテゴリに属するタスクの数、使用されているランタイム環境(ベース画像)の分布、評価者の再スケーリング手法の種類、そしてインターネット接続やゲームモードを必要とするタスクの総数が表示されます。また、カテゴリ別のリリースされたタスク数と、ランタイム環境ごとのタスク数を示す棒グラフが描画され、視覚的にベンチマークの構成を確認できます。
3b. 1 つのタスクの詳細分析
リストの最初のタスクを例に挙げて、その ID、カテゴリ、ベース画像、評価者のパーサー設定、再スケーリングの種類と詳細情報を表示します。さらに、エージェントに対して送信されるクエリの先頭部分(800 文字まで)が整形されて出力されます。
各タスク仕様は、カテゴリ、ランタイムイメージ、インターネットアクセス権限、提出パス、ジャッジ設定、エージェントクエリを含む構造化テーブルに解析されます。ベンチマークの分類体系については、カテゴリ別、実行環境別、再スケーリング手法別、ゲームモード別のタスク数を集計して要約します。さらにこれらの分布を可視化し、代表的なタスクを 1 つ選定して、EdgeBench の評価がどのように定義されているかを検証します。
Copy CodeCopiedUse a different Browser
- リーダーボードの分析
リーダーボードを解析するために、まずローカルディレクトリ内の README.md ファイルを読み込みます。このファイルには、各モデルのパフォーマンスデータがテーブル形式で格納されています。
読み込んだテキストからテーブルデータを抽出する関数を実装します。ここでは、アンダースコアやアスタリスクなどの特殊文字を適切に処理し、数値として解釈できるかを確認するロジックを含めています。特に、空欄やダッシュ(—, -)が含まれるセルは欠損値として扱います。
抽出されたテーブルデータから、タスク名、カテゴリ、モデル名、そして各時間予算(タイムバジェット)ごとのスコアを整理します。元の表形式のデータを、分析しやすい縦型(ロングフォーマット)に変換する処理を行います。これにより、各モデルが特定のタスクで、異なる制限時間下でどれだけのスコアを出したかが一目でわかるようになります。
変換されたデータから DataFrame を作成し、解析対象となったタスク数、モデル数、そして時間予算の組み合わせによる総セル数を出力します。これで、リーダーボードに収録されているデータの規模感を把握できます。
さらに、特定のサブセット(51 タスク)に絞った集計結果も抽出します。これは、モデル名の列と「@2h」などのラベルが含まれるテーブルを特定し、各モデルの平均スコアや主要な指標を集約するために使用されます。最終的に、この集計データが空でない場合、その内容を画面に表示して確認します。
リポジトリの README を読み込み、記載されている Markdown テーブルを構造化された Python のレコードに変換します。タスクレベルのリーダーボードからは、タスク名、カテゴリ、モデル名、インタラクション時間、スコア値を含む整理済みのデータセットを作成しました。また、51 タスクにわたる集計リーダーボードテーブルも解析し、README に記載された要約内容と、こちらで計算したタスクレベルの結果との比較を行います。
Copy CodeCopiedUse a different Browser
- ロジスティックシグモイドの規模法則(タスク別平均に適合→堅牢性あり)
このコードは、インタラクション時間と評価スコアの関係をロジスティックシグモイド関数でモデル化し、そのフィット度を可視化する処理を行っています。まず、log_sigmoid 関数が定義され、パラメータ lo(下限)、hi(上限)、k(傾き)、t0(中心点)を用いて、対数スケールの時間 t に応じたスコアを計算します。また、r2 関数は決定係数を算出するもので、予測値と実測値の乖離度を評価するために使用されます。
次に、データ集計処理が行われます。各モデルと所要時間の組み合わせにおけるタスク別平均スコアを集約し、agg という DataFrame に格納します。この結果を出力することで、モデルごとの時間経過に伴う性能推移を確認できます。
可視化パートでは、Matplotlib を用いてグラフが描画されます。横軸に「インタラクション時間(時間)」、縦軸に「EdgeBench スコア(51 タスクの平均)」を設定し、各モデルのパフォーマンス曲線を描きます。curve_fit 関数を用いてロジスティックシグモイド曲線をデータにフィットさせ、決定係数 R² を算出して凡例に表示します。もしフィット処理が失敗した場合でも、エラーを出力して処理を継続するよう設計されています。
さらに、特定のモデル(ここではリストの先頭にあるモデル)における、2 時間から 12 時間への時間延長によるスコア向上率(uplift)をカテゴリ別に分析しています。これにより、どのタスクカテゴリで時間の投入が最も効果的かを特定できます。
最後に、最も大きな改善が見られた上位 5 つのタスクに焦点を当て、その学習曲線(時間経過に伴うスコアの変化)をプロットします。各タスクの名前を凡例に表示し、モデルごとの個別の学習挙動を詳細に比較・分析することが可能です。
これらの処理を通じて、AI エージェントが時間をかけることでどの程度性能が向上するか、またその傾向がタスクやカテゴリによってどう異なるかを定量的かつ視覚的に把握できます。
各モデルについて、インタラクション時間の予算ごとに平均スコアを算出し、得られた軌跡に対して対数シグモイドの拡張曲線を適合させます。各適合の良否は決定係数を用いて評価し、観測されたスコアと適合曲線の両方を可視化します。その後、カテゴリレベルでのスコア向上量を測定し、より長いインタラクション時間によって最も恩恵を受ける個々のタスクをプロットします。
- SForge スコアリングの「リスケール」関数
まず、線形リスケールを行う関数 rescale_linear を定義します。この関数は、入力値を指定された下限と上限の間でクリップし、0 から 100 の範囲にスケーリングして返します。
次に、「linear(線形)」および「piecewise_max(区間最大)」の各リスケール種別について処理を行います。対象となるデータフレームから該当する行を抽出し、もし空の場合はスキップします。取得した最初の行からタスク ID とパラメータ情報を表示します。
リスケール種別が「linear」で、かつパラメータに下限(lower)と上限(upper)が含まれている場合、その範囲の端点と中央値に対して変換後のスコアを計算・出力します。一方、それ以外の場合は、ベースライン、上位 30% のランク、最上位ランク、スーパーアンカーという 4 つの基準点を定義し、それぞれが 0.0、70.0、99.0、100.0 にマッピングされるよう線形補間(np.interp)を用いて計算結果を表示します。
処理完了後、「DONE」と表示し、SForge の 2 コンテナ型ハーンネスを実行して本格的な評価を行うための URL を出力します。詳細は GitHub リポジトリおよび公式ドキュメントをご確認ください。
https://github.com/ByteDance-Seed/EdgeBench | https://bytedance-seed.github.io/EdgeBench/
SForge の採点システムで使用されているスコア再スケーリング設定を確認し、線形正規化の計算式を実装しました。これにより、線形設定と分割線形設定の両方において、生得られたスコアがどのようにベンチマーク用の正規化スコアに変換されるかを具体的に示しています。最後に、完全な評価を実行するために必要な公式の EdgeBench および SForge のリソースを出力してチュートリアルを終了します。
結論として、EdgeBench の構造と報告された結果を理解するための包括的な分析ワークフローを構築しました。単にリーダーボードを見るだけでなく、タスク仕様、ランタイム設定、採点ルール、モデルの性能、そしてインタラクション時間のスケーリングを一つの再現可能な Colab パイプラインで結びつけることで、より深い洞察を得られるようにしました。また、追加のインタラクション時間がどの程度で最大の性能向上をもたらすかを特定し、異なるモデルが公開されたベンチマークタスク上でどのようにスケールするかを可視化しました。これは、EdgeBench の結果を解釈し、エージェントの能力を比較し、完全な SForge 実行ハーネスを用いたより深い評価に備えるための、技術的に裏付けられた基盤を提供するものです。
フルコードはこちらで確認できます。Twitter でフォローも歓迎します。また、15 万人以上の ML 関連ユーザーが集まる SubReddit に参加したり、ニュースレターを購読したりするのもお忘れなく。あ、Telegram も使っていますか?今なら Telegram でも私たちに参加できるようになりました。
GitHub リポジトリや Hugging Face ページ、製品リリース、ウェビナーなどのプロモーションをご希望の場合は、ぜひパートナーシップについてご連絡ください。
「Research-Grade EdgeBench Analysis: AI Agent Benchmarking, Leaderboard Analytics, Scaling Laws, and Evaluation Metrics」は、MarkTechPost で最初に公開されました。
この分析では、AI エージェントのベンチマーク評価やリーダーボードの解析、スケーリング則、そして評価指標について詳しく解説します。EdgeBench は、最新の AI エージェント技術が実際にどの程度機能するかを測定するための重要な枠組みを提供しています。
研究者や開発者は、これらの指標を通じて自らのモデルのパフォーマンスを客観的に比較し、改善点を見出すことができます。特にスケーリング則の理解は、リソース配分や将来の技術ロードマップ策定において不可欠です。
評価基準の透明性と再現性を高めることで、AI エージェント分野全体の発展を加速させることが期待されています。今後のアップデートでも、新たなベンチマーク手法やデータセットの追加が予定されています。
原文を表示
In this tutorial, we explore EdgeBench as a practical benchmark for evaluating advanced AI agents across diverse task categories, runtime environments, and interaction-time budgets. We begin by downloading the dataset snapshot from Hugging Face, parsing the released task specifications, and examining the benchmark taxonomy, execution settings, internet requirements, judging logic, and scoring metadata. We then extract the leaderboard data directly from the repository README, standardize model names, reshape task-level results into an analysis-ready format, and compare performance across multiple time budgets. Finally, we fit log-sigmoid scaling curves, measure category-level score improvements, inspect the tasks with the largest gains, and study how SForge rescale functions transform raw evaluation outputs into normalized benchmark scores.
Copy CodeCopiedUse a different Browser
!pip -q install "huggingface_hub>=0.23" pandas numpy scipy matplotlib pyyaml
import os, glob, json, textwrap, warnings
import numpy as np, pandas as pd
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
from huggingface_hub import snapshot_download
warnings.filterwarnings("ignore")
pd.set_option("display.max_colwidth", 90)
pd.set_option("display.width", 160)
REPO_ID = "ByteDance-Seed/EdgeBench"
TIME_BUDGETS = [2, 4, 6, 8, 10, 12]
MODELS = ["Claude Opus 4.8", "GPT-5.5", "GPT-5.4", "GLM-5.1", "DS-V4-Pro"]
def banner(t):
print("\n" + "=" * 78 + f"\n {t}\n" + "=" * 78)
def canon_model(name):
n = name.lower()
if "opus" in n:
return "Claude Opus 4.8"
if "5.5" in n:
return "GPT-5.5"
if "5.4" in n:
return "GPT-5.4"
if "glm" in n:
return "GLM-5.1"
if "ds-v4" in n or "deepseek" in n:
return "DS-V4-Pro"
return name
banner("1. DOWNLOADING DATASET SNAPSHOT")
local_dir = snapshot_download(repo_id=REPO_ID, repo_type="dataset")
print("Snapshot cached at:", local_dir)
We install the required Python libraries, import the analytical tools, and configure the notebook display settings. We define the dataset repository, interaction-time budgets, model names, and helper functions to format output and standardize model labels. We then download the complete EdgeBench dataset snapshot from Hugging Face and store its local cache path for the remainder of the workflow.
Copy CodeCopiedUse a different Browser
banner("2. LOADING TASK SPECIFICATIONS")
def flatten_task(d):
work, judge = d.get("work", {}) or {}, d.get("judge", {}) or {}
rescale = judge.get("rescale", {}) or {}
return {
"task_id": d.get("task_id"),
"name": d.get("name"),
"category": d.get("category"),
"base_image": d.get("base_image"),
"internet": d.get("internet"),
"game_mode": d.get("game_mode", False),
"cwd": d.get("cwd"),
"n_submit": len(d.get("submit_paths", []) or []),
"submit_paths": ", ".join(d.get("submit_paths", []) or []) or "(interactive)",
"parser": judge.get("parser") or "(game)",
"score_dir": judge.get("score_direction", "n/a"),
"selection": judge.get("selection"),
"eval_timeout": judge.get("eval_timeout"),
"rescale_kind": rescale.get("kind"),
"rescale": rescale,
"agent_query": work.get("agent_query", "")
}
records = []
for fp in sorted(glob.glob(os.path.join(local_dir, "*.json"))):
try:
with open(fp) as f:
records.append(flatten_task(json.load(f)))
except Exception as e:
print(" ! skipped", os.path.basename(fp), "->", e)
df = pd.DataFrame(records).dropna(subset=["task_id"]).reset_index(drop=True)
print(f"Loaded {len(df)} task specifications.\n")
print(df[["task_id", "category", "base_image", "internet", "rescale_kind"]].head(10).to_string(index=False))
banner("3. BENCHMARK TAXONOMY")
print("Tasks per category:\n", df["category"].value_counts().to_string(), "\n")
print("Runtime (base_image):\n", df["base_image"].value_counts().to_string(), "\n")
print("Judge rescale kinds:\n", df["rescale_kind"].value_counts(dropna=False).to_string(), "\n")
print(f"Tasks needing internet: {int(df['internet'].sum())} | game_mode tasks: {int(df['game_mode'].sum())}")
fig, ax = plt.subplots(1, 2, figsize=(13, 4.2))
df["category"].value_counts().plot.barh(ax=ax[0], color="#4C78A8")
ax[0].set_title("Released tasks per category (51)")
ax[0].invert_yaxis()
df["base_image"].value_counts().plot.bar(ax=ax[1], color="#F58518")
ax[1].set_title("Runtime environment")
ax[1].tick_params(axis="x", rotation=45)
plt.tight_layout()
plt.show()
banner("3b. ANATOMY OF ONE TASK")
s = df.iloc[0]
print(f"task_id: {s.task_id} | category: {s.category} | base_image: {s.base_image}")
print(f"judge parser: {s.parser} | rescale: {s.rescale_kind} -> {s.rescale}")
print("\n--- agent_query (truncated) ---")
print(textwrap.fill(s.agent_query[:800], width=96))
We parse every task specification into a structured table containing its category, runtime image, internet access, submission paths, judge configuration, and agent query. We summarize the benchmark taxonomy by counting tasks across categories, execution environments, rescaling methods, and game modes. We also visualize these distributions and inspect one representative task to understand how an EdgeBench evaluation is defined.
Copy CodeCopiedUse a different Browser
banner("4. PARSING THE LEADERBOARD")
readme = open(os.path.join(local_dir, "README.md"), encoding="utf-8").read()
def unescape(x):
return x.replace("\\_", "_").replace("\\", "").replace("*", "").strip()
def to_float(x):
x = x.replace("*", "").strip()
return np.nan if x in ("", "—", "-") else float(x)
def extract_md_tables(md):
tables, cur = [], []
for ln in md.splitlines():
s = ln.strip()
if s.startswith("|"):
cur.append([unescape(c) for c in s.strip("|").split("|")])
elif cur:
tables.append(cur)
cur = []
if cur:
tables.append(cur)
return [[r for r in t if not all(set(c) <= set("-: ") for c in r)] for t in tables if t]
tables = extract_md_tables(readme)
def parse_series(cell):
parts = cell.split("/")
if len(parts) != len(TIME_BUDGETS):
return None
try:
return [to_float(p) for p in parts]
except ValueError:
return None
long_rows = []
for tbl in tables:
head = tbl[0]
if head and head[0].lower() == "task" and any("categ" in h.lower() for h in head):
model_cols = [canon_model(m) for m in head[2:]]
for row in tbl[1:]:
if len(row) != len(head):
continue
for mname, cell in zip(model_cols, row[2:]):
series = parse_series(cell)
if series is None:
continue
for t, sc in zip(TIME_BUDGETS, series):
long_rows.append({
"task": row[0],
"category": row[1],
"model": mname,
"hours": t,
"score": sc
})
scores = pd.DataFrame(long_rows)
print(
f"Parsed {scores['task'].nunique()} tasks x "
f"{scores['model'].nunique()} models x "
f"{len(TIME_BUDGETS)} budgets = {len(scores)} cells."
)
agg_time, groups, cur = [], [], []
for tbl in tables:
head = tbl[0]
if head and "model" in head[0].lower() and any("@2h" in h for h in head):
cols = head[1:]
for row in tbl[1:]:
if len(row) == len(head):
rec = {"model": canon_model(row[0])}
rec.update({c: to_float(v) for c, v in zip(cols, row[1:])})
cur.append(rec)
groups.append(cur)
cur = []
agg51 = pd.DataFrame(groups[1] if len(groups) > 1 else (groups[0] if groups else []))
if not agg51.empty:
print("\nREADME aggregate (51-task subset):")
print(agg51.to_string(index=False))
We read the repository README and extract its Markdown tables into structured Python records. We convert the task-level leaderboard into a tidy dataset containing task, category, model, interaction time, and score values. We also parse the aggregate 51-task leaderboard table to compare the README summary with our task-level calculations.
Copy CodeCopiedUse a different Browser
banner("5. LOG-SIGMOID SCALING LAW (fit on per-task means -> robust)")
def log_sigmoid(t, lo, hi, k, t0):
return lo + (hi - lo) / (1.0 + np.exp(-k * (np.log(t) - np.log(t0))))
def r2(y, yhat):
ssr = np.nansum((y - yhat) ** 2)
sst = np.nansum((y - np.nanmean(y)) ** 2)
return 1 - ssr / sst if sst > 0 else np.nan
agg = (
scores.groupby(["model", "hours"])["score"]
.mean()
.unstack("hours")
.reindex(index=MODELS)[TIME_BUDGETS]
)
print("Per-task mean by model & hour:\n", agg.round(2).to_string(), "\n")
t_h = np.array(TIME_BUDGETS, float)
t_dense = np.linspace(2, 12, 200)
fig, ax = plt.subplots(figsize=(9, 5.5))
for color, model in zip(plt.cm.tab10(np.linspace(0, 1, len(MODELS))), MODELS):
if model not in agg.index:
continue
y = agg.loc[model].values.astype(float)
try:
popt, _ = curve_fit(
log_sigmoid,
t_h,
y,
p0=[y[0], y[-1] + 1, 2.0, 4.0],
bounds=([-50, -50, 1e-2, 0.5], [200, 200, 50, 50]),
maxfev=200000,
)
rr = r2(y, log_sigmoid(t_h, *popt))
ax.plot(
t_dense,
log_sigmoid(t_dense, *popt),
color=color,
lw=2,
label=f"{model} (R²={rr:.3f})",
)
except Exception as e:
print(" fit failed for", model, e)
ax.scatter(t_h, y, color=color, s=45, zorder=3)
ax.set_xlabel("Interaction time (hours)")
ax.set_ylabel("EdgeBench score (51-task mean)")
ax.set_title("Log-sigmoid scaling of score vs. interaction time")
ax.legend(fontsize=8)
ax.grid(alpha=0.3)
plt.tight_layout()
plt.show()
piv = scores.pivot_table(
index=["task", "category"],
columns=["model", "hours"],
values="score",
aggfunc="mean",
)
top = MODELS[0]
uplift = (
piv[(top, 12)] - piv[(top, 2)]
).groupby("category").mean().sort_values(ascending=False)
print(f"\nMean 2h→12h uplift for {top}, by category:\n", uplift.round(2).to_string())
focus = (
piv[(top, 12)] - piv[(top, 2)]
).sort_values(ascending=False).head(5).index
fig, ax = plt.subplots(figsize=(9, 5))
for task, cat in focus:
ax.plot(
TIME_BUDGETS,
[piv.loc[(task, cat)][(top, h)] for h in TIME_BUDGETS],
marker="o",
label=task[:32],
)
ax.set_title(f"{top}: per-task learning trajectories (largest gains)")
ax.set_xlabel("Interaction time (hours)")
ax.set_ylabel("Task score")
ax.legend(fontsize=8)
ax.grid(alpha=0.3)
plt.tight_layout()
plt.show()
We calculate the mean score for each model at every interaction-time budget and fit a log-sigmoid scaling curve to the resulting trajectories. We evaluate the goodness of each fit using the coefficient of determination and visualize both the observed scores and fitted curves. We then measure category-level score gains and plot the individual tasks that benefit most from longer interaction time.
Copy CodeCopiedUse a different Browser
banner("6. SForge SCORING 'RESCALE' FUNCTIONS")
def rescale_linear(raw, lower, upper):
return float(np.clip((raw - lower) / (upper - lower) * 100.0, 0, 100))
for kind in ["linear", "piecewise_max"]:
ex = df[df["rescale_kind"] == kind]
if ex.empty:
continue
row = ex.iloc[0]
rs = row["rescale"]
print(f"\n[{kind}] example: {row.task_id}\n params: {rs}")
if kind == "linear" and "lower" in rs and "upper" in rs:
for raw in [rs["lower"], (rs["lower"] + rs["upper"]) / 2, rs["upper"]]:
print(
f" raw={raw:>12.2f} -> "
f"{rescale_linear(raw, rs['lower'], rs['upper']):6.2f}"
)
else:
xs = [rs["baseline"], rs["rank30"], rs["rank1"], rs["super_anchor"]]
ys = [0.0, 70.0, 99.0, 100.0]
for raw in xs:
print(
f" raw={raw:>16.1f} -> "
f"{float(np.interp(raw, xs, ys)):6.2f} (illustrative)"
)
banner("DONE")
print("Real evaluation runs via the SForge two-container harness:")
print(" https://github.com/ByteDance-Seed/EdgeBench | https://bytedance-seed.github.io/EdgeBench/")
We examine the scoring rescale configurations used by the SForge judging system and implement the linear normalization formula. We demonstrate how raw scores map to normalized benchmark scores for both linear and piecewise-style configurations. We finish the tutorial by printing the official EdgeBench and SForge resources required for running complete evaluations.
In conclusion, we built a complete analytical workflow for understanding both the structure and the reported results of EdgeBench. We moved beyond simply viewing a leaderboard by connecting task specifications, runtime configurations, scoring rules, model performance, and interaction-time scaling within a single reproducible Colab pipeline. We also identified where additional interaction time yields the greatest performance improvements and visualized how different models scale across the released benchmark tasks. It provides a technically grounded foundation for interpreting EdgeBench results, comparing agent capabilities, and preparing for deeper evaluation using the full SForge execution harness.
Check out the Full Code here. Also, feel free to follow us on Twitter and don’t forget to join our 150k+ML SubReddit and Subscribe to our Newsletter. Wait! are you on telegram? now you can join us on telegram as well.
Need to partner with us for promoting your GitHub Repo OR Hugging Face Page OR Product Release OR Webinar etc.? Connect with us
The post Research-Grade EdgeBench Analysis: AI Agent Benchmarking, Leaderboard Analytics, Scaling Laws, and Evaluation Metrics appeared first on MarkTechPost.
関連記事
今日のまとめ
AI日報で今日の重要ニュースをまとめ読み