テスト

Main Benchに掲載されている各スコアに関する、わかりやすい説明です。同じ説明文が、各列見出しの横にある「i」をクリックすると表示されます。これらのテスト自体は、オープンソースのCrucibleForgeプロジェクト内に存在しており、このページではそれらが一般的に何を測定しているかを説明しています。各テストに公開されているサンプル問題がある場合は、該当するカードからそれらを確認できます。

これらのテストが測定するもの

合計

合計値は、コードスコアとチャットスコアの合計です。標準テストを完全にこなした場合、それぞれ10点ずつ得られるため、理論上の最高得点は20点となります。ボーナスパック(「ボーナスセット」参照)を使用するとさらにポイントが加算されるため、モデルは20点を超えるスコアを獲得することも可能です。本スイートにおいては、すべてのパックを使用した場合にコードで13点、チャットで15点まで到達できます。各行の棒グラフは、この最大可能値まで伸びており、標準セットが終わる位置にはチェックマークが付いています。無検閲テストは別タブにあり、合計値には一切加算されません。「合計」の横にある±の値は、テストケースに対してブートストラップ法を用いて求めた90%信頼区間の半分に相当します。つまり、この範囲内で2つのモデルのスコアが近い場合、統計的には同値とみなされます。

チャット

このチャット機能は、一般的なアシスタント業務ではなく、ロールプレイや相手との会話を評価するためのものです。8回の多段階セッションが実施されます。それらには、設定が豊富なロールプレイ、相手との会話、複数の声を持つキャラクター、そして共同で作られた物語などが含まれます。各セッションでは、モデルが以前に与えられた事実を覚えているか、訂正を受け入れるか、キャラクターの口調や視点を維持しているか、そして一連の執筆規則に従っているかが確認されます。別途用意された判定モデル「Gemma 4 31B (uncensored “heretic” build, Q8) on our own GPU rig」が、各ケースごとにチェックリストに基づいて返答を採点します。その他の部分については、単純なテキスト形式の規則が適用されます。質問への回答や一回限りの指示の実行は、ここでは採点対象外です。標準的な質問をすべて正しくこなした場合、チャット機能の得点は10点となります。ボーナスパックを利用すればさらに点数が加算され、このスイート全体で最大15点まで得ることが可能です。

GitHubの詳細情報

チャット:例題

オープンソースのテストセットから抜き出した、いくつかの実際のケース。簡略化してあります。

  1. 何週間にもわたって、コミュニティチャットを一貫した状態に保つ

    User (Fri 6 Nov) Evening, Hettie. Day off. I did nothing at all until two o'clock and I regret nothing. Biscuit and I sat at the window watching the park like two old men on a bench. The flat's mostly sorted now. One odd thing though. Biscuit goes out fine in the morning, but when we get back in he just flops down by the front door, and in the evening he won't go out for his walk at all. He's gone a bit off his food as well.

    採点方法: 判定モデルは、返答内容に関する12個の是非質問に答え、その横で13個のテキスト形式のルールがチェックされます。

    GitHubでこのケースをご覧ください

  2. 3人のキャラクターを演じ、それぞれ異なる声で話す

    User The door of the Lamp and Ladle bangs open on wind and rain. Daro Kessen, thirty, a river-guild assessor with a satchel of papers under his oilskin, shakes the water off his hat and looks at the three people at the table by the stove. "Evening. Daro Kessen, river guild. I'm here about your toll-ledger. I gather it went missing three nights ago? …

    採点方法: 判定モデルが、返答内容に関する10個のはい/いいえ質問に答え、その横で11個のテキスト形式のルールがチェックされます。

    GitHubでこのケースをご覧ください

  3. 複数の制約が重なった状況下で物語を共同執筆する

    User Hi! Let's write a short story together, one section per message. Ground rules for the whole piece: first person, past tense; the narrator is Wren Adair, 34, a piano tuner. …

    Several turns later

    User One more author's change, from here to the end: the Hales live on a houseboat moored on the canal, not in a flat. Don't use the word "flat" again, in any sense, and call it the boat. Earlier sections stay as they are. …

    採点方法: 判定モデルは、返答に関する5つの是非質問に答え、その横で25個のテキスト形式のルールがチェックされます。

    GitHubでこのケースをご覧ください

GitHubの詳細情報

コード

コード課題では、実際に動作するPython関数の作成、プログラムの出力結果の予測、バグの発見と修正、リポジトリ操作、ツールの利用などが求められます。解答は隠されたテストに基づいて評価されるため、得点は見た目上正しそうなコードではなく、実際に動作するコードを反映します。標準問題をすべて正しく解くとコードスコアは10点になります。ボーナスパックを利用するとさらに点数が加算され、このセットでは最大で13点まで得られます。

GitHubの詳細情報

コード:例題

オープンソースのテストセットから抜き出した、いくつかの実際のケース。簡略化してあります。

  1. カスタム設定の週末に合わせて労働日をカウントします

    def workday_intl(start, days, weekend=1, holidays=()):
        """
        Implement `def workday_intl(start, days, weekend=1,
        holidays=()):` in the spirit
        of a spreadsheet WORKDAY.INTL function, with exactly these
        rules:
    
        - Dates are strings of the exact shape `YYYY-MM-DD` (ASCII
        digits, a real
          calendar date). `start` and every holiday must be valid, else
        ValueError.
          The result is a date string of the same shape.
        - `days` is an `int` (not `bool`), else ValueError. …
        """

    採点方法: 隠し単位テスト(16グループにわたる35のチェック)

    GitHubでこのケースをご覧ください

  2. Pythonのコードが何を出力するかを正確に予測します

    # Q1: shared basket (Python 3.13) - what does it print?
    class Basket:
        items = []
        count = 0
    
        def add(self, thing):
            self.items.append(thing)
            self.count += 1
    
    a, b = Basket(), Basket()
    a.add("milk")
    b.add("eggs")
    b.add("tea")
    Basket.count = 10
    print(a.items, a.count, b.count, Basket.count, Basket().count)

    採点方法: 予測出力8件が完全に一致

    GitHubでこのケースをご覧ください

  3. 1つのバグレポートの中に、2つのバグが見つかる

    Bug report: "I have 750 g of flour, the bread recipe needs 1.25 kg, and the shopping list tells me to buy the whole 1.25 kg. Also, after I bought another 500 g and added it, the pantry shows 500 g of flour instead of 1250 g." tests/test_shopping.py::test_partial_stock fails too.

    Find the causes and fix them so the package does what README.md says.

    採点方法: 隠しユニットテスト(4グループ:convert、add、shopping、existing)

    GitHubでこのケースをご覧ください

GitHubの詳細情報

ボーナスセット

各カテゴリーにおいて、標準問題を全問正解すると10点が得られます。あるパートで90%以上のスコアを記録したモデルは、そのパート用のより難しいボーナスセットに挑戦する資格を得ます。そして、そのボーナスセットをクリアすれば次のセットが解除されます。各パックは1点として加算されるため、カテゴリーの合計点は10点まで上昇します。カテゴリーが到達できる最高得点は、10点にパック1つあたり1点を加えた値であり、新しいパックが追加されるごとにその点数も増えていきます。各行には各パックの詳細が記載されており、獲得可能な点数や「ロック中」であるかどうかが示されます。ボーナスセットこそが10点を超える唯一の方法であり、これによってランキング上位者が全員満点になることを防いでいます。

スケールはどのように拡大していくか

プログラム

プログラムはモデルに6個の課題を与えます。各課題では、日付や丸め処理、テキストのレイアウト、スケジュール設定など、注意点が盛りだくさんな説明から、正確なPython関数を作成するよう求められます。答えはサンドボックス内で隠された単体テストに対して実行され、得点はテスト群のうち合格した割合で決まります。そのため、ほぼ正しい答えでも部分的な点数が与えられるのです。

GitHubの詳細情報

プログラム:例題

オープンソースのテストセットから抜き出した、いくつかの実際のケース。簡略化してあります。

  1. 一定の幅の行にテキストを配置します

    def wrap(text, width):
        """
        Implement `def wrap(text, width):` that lays `text` out into
        lines of at most
        `width` characters and returns them as a list of strings.
    
        Rules:
    
        1. `width` must be an `int` >= 2, otherwise raise ValueError.
        2. Whitespace means exactly these four characters: space, tab,
        `\r`, `\n`.
           Every other character (including non-breaking space U+00A0)
        is part of a
           word. Words are maximal runs of non-whitespace characters.
        3. …
        """

    採点方法: 隠れているユニットテスト(15グループにわたる28のチェック)

    GitHubでこのケースをご覧ください

  2. スプレッドシートのように四捨五入します

    def sheet_round(func, number, *args):
        """
        Implement `def sheet_round(func, number, *args):` — six
        spreadsheet rounding
        functions with exact decimal arithmetic.
    
        Numbers (`number`, a multiple, a significance) are given as an
        `int` or as a
        `str` decimal: optional `-`, one or more digits, optionally `.`
        and one or more
        digits (`"-0.125"`, `"12"`, `"007.50"`). Floats, bools and other
        shapes raise
        ValueError. `digits` and `mode` are `int`s (not `bool`). …
        """

    採点方法: 隠しユニットテスト(15グループにわたる44のチェック)

    GitHubでこのケースをご覧ください

  3. 最適な全体結果となるよう、マシン間でタスクを割り当てる

    def best_plan(tasks, k, gap=0, machine_cost=0):
        """
        Implement `def best_plan(tasks, k, gap=0, machine_cost=0):` that
        returns an `int`.
    
        - `tasks` is a list of `(start, end, value)` tuples of ints with
        `start < end` and
          `value >= 1`. There are `k` identical machines (`k >= 1`).
        - A machine runs one task at a time. On the same machine, a task
        `y` may run after
          a task `x` only if `y.start >= x.end + gap` (`gap` is an int
        >= 0). …
        """

    採点方法: 隠れているユニットテスト(14グループにわたる72のチェック)

    GitHubでこのケースをご覧ください

GitHubの詳細情報

コードバンク

コードバンクでは、日常的なPythonやJavaScriptの短いコード例が示されており、これらは家庭用アプリに使われるような補助用コードです。そして、それぞれのコードが実際に何を出力するかを正確に答えるよう求められます。言語ごとに2セットあり、予測された出力結果はすべて完全一致でチェックされます。新しいコードを書くことではなく、その言語が実際にどのように振る舞うか(共通のデフォルト値、ソート順序、丸め方、真偽値など)を理解していることが評価の対象となります。スコアは、正確に予測できた出力結果の割合です。

GitHubの詳細情報

コードバンク:例題

オープンソースのテストセットから抜き出した、いくつかの実際のケース。簡略化してあります。

  1. Pythonのコードが何を出力するかを予測します

    # Q1: shared basket (Python 3.13) - what does it print?
    class Basket:
        items = []
        count = 0
    
        def add(self, thing):
            self.items.append(thing)
            self.count += 1
    
    a, b = Basket(), Basket()
    a.add("milk")
    b.add("eggs")
    b.add("tea")
    Basket.count = 10
    print(a.items, a.count, b.count, Basket.count, Basket().count)

    採点方法: 予測出力8件が完全に一致

    GitHubでこのケースをご覧ください

  2. JavaScriptのコードが何を出力するかを予測します

    // Q1: sorting quantities (Node 24 (ES module)) - what does it print?
    const qty = ["10", "9", "1", "25"];
    console.log([...qty].sort().join(","), qty.map(parseInt).join(","), qty.map(Number).sort().join(","));
    console.log([3, 20, 100].sort().join(","), [3, 20, 100].sort((a, b) => b - a).join(","));

    採点方法: 予測出力8件が完全に一致

    GitHubでこのケースをご覧ください

GitHubの詳細情報

エージェント

エージェントは、モデルに小規模な複数ファイルからなるプロジェクトに関するバグ報告を1件与えます。また、コーディングアシスタントが使用するツールとして、ファイルの一覧表示、読み込み、検索、編集、テストの実行が挙げられます。これは単一のタスク(スイート内で1番目)であるため、1回の実行でこの列が大きく変化する可能性があります。修正されたプロジェクトは、そのテストを実行することで採点されます。

GitHubの詳細情報

エージェント:例題

オープンソースのテストセットから抜き出した、いくつかの実際のケース。簡略化してあります。

  1. 1つのバグレポートの中から、2つのバグを見つける

    Bug report: "I have 750 g of flour, the bread recipe needs 1.25 kg, and the shopping list tells me to buy the whole 1.25 kg. Also, after I bought another 500 g and added it, the pantry shows 500 g of flour instead of 1250 g." tests/test_shopping.py::test_partial_stock fails too.

    Find the causes and fix them so the package does what README.md says.

    採点方法: 隠しユニットテスト(4グループ:convert、add、shopping、existing)

    GitHubでこのケースをご覧ください

GitHubの詳細情報

ツール

ツールテストは、モデルがツールを正しく呼び出しているかを確認するものです。各ケースは、ツールとの往復通信を含むスクリプト化された対話となっており、モデルは適切なツールを選択し、有効な引数を渡し、その結果を利用し、設定に組み込まれた罠を回避しなければなりません。形式が不正な呼び出しは失敗と見なされます。

GitHubの詳細情報

ツール:例題

オープンソースのテストセットから抜き出した、いくつかの実際のケース。簡略化してあります。

  1. 時計の変更に伴う引き取り時間を確認します

    User Book a pickup for my mother, Maria Sousa, at Lisbon airport on Sunday 25 October. …

    User Her mobile is +351 912 345 678.

    User Her husband Joao Sousa is on TP1351 with her but his phone is broken - book him a pickup too, same place and time …

    Several steps later

    User Finally: Maria might switch to the earlier TP1349 instead, so book her a second pickup for that flight too, just in …

    採点方法: 定められた6ステップのやり取り:各ツール呼び出し、その引数、および応答がチェックされる

    GitHubでこのケースをご覧ください

  2. ツールの回答から予約締切を算出します

    User Book a room at Harbour Inn Bergen (hotel BGO-2) for two nights from Friday 13 November for me, Ola …

    User Jonas really does sleep in the cot, so switch us to R-412 - it's cheaper, and the hotel's own note on …

    User OK, we stay in R-509. Until when can we still cancel this Bergen booking for free?

    Several steps later

    User Then just move that Oslo booking to the weekend of 4 December instead.

    採点方法: 定められた11ステップのやり取り:各ツール呼び出し、その引数、および返答がチェックされる。禁止されている内容を含む返答は失敗となる

    GitHubでこのケースをご覧ください

  3. 予約する前に、適切な日付と年齢層を選びましょう

    User Please sign my son Leo Brandt (born 7 November 2021) up for this term's Saturday class at Northpool - the earliest …

    User Lovely. What time does his class start, and is anyone else still able to get a spot in it?

    User Hm, he's still only four, so the Minnows would suit him better - move him to the 09:45 Minnows. …

    Several steps later

    User His sister Mia Brandt, born 3 March 2019, wants a Saturday class at Northpool too - the earliest one she can join …

    採点方法: スクリプト化された8ステップのやり取り:各ツール呼び出し、その引数、および返答が確認される

    GitHubでこのケースをご覧ください

GitHubの詳細情報

トク/ス

tok/sとは、実行中にモデルがテキストを生成する際の平均速度です。ローカルモデルは当社の自前のハードウェア上で実行されたため、それらの速度同士を比較することができます。ホスティングされているモデルの場合は、プロバイダーやその時の負荷状況に依存するため、その速度はあくまで目安としてご理解ください。

運用コスト

実行コストとは、プロバイダーが公表している料金に基づき、1回の実行における各リクエストの費用を合計したものです。これには、送信されたトークン数や返信として送り返されたトークン数(思考処理分も含む)が含まれます。この計算方法は、標準的なコードテストおよびチャットテストに対応しています。ただし、ボーナスセットや再試行、判定処理(当社のハードウェア上で実行される)、キャッシュ利用による割引やオフピーク時の割引は含まれていません。したがって、定価で支払う金額に近い値となります。「〜」と記載されている場合は、プロバイダーがトークン単位で課金していない(定額プランである)ことを意味し、その場合は定価に基づいてトークン数を計算しています。「*」と記載されている場合は、使用状況データが得られなかったリクエストがあるため、実際の数値より低くなっている可能性があります。また、プロバイダーのコンテンツフィルターによって返信がブロックされることもあります。その場合、何件がブロックされたかが記載され、ブロックされた各返信のスコアはゼロとなります。

クラス

クラスとは、モデルを合計スコアに基づいてS、A、B、Cの4つに分類する簡単な方法であり、Sが最も強いモデルです。各クラスの閾値は、ボードの下にある注記に記載されています。チャットスコアが完全に記録されていないモデルには、合計スコアもクラスもありません。

リーン

Lean機能では、モデルのチャットスコアとコードスコアをそれぞれボード上の中央値と比較します。一方の能力が明らかに優れている場合、そのモデルは「チャット寄り」または「コード寄り」と判定され、そうでなければ「バランス型」となります。必要な差の大きさについては、ボード下の注釈に記載されています。

続き

スイートとは、スコアが算出されたテストセットのバージョンのことです。テストが変更されるとモデルが再実行され、古いバージョンは「以前のスイートバージョン」として保存されます。スコアの比較は、同じスイート内でのみ行ってください。

検査日

テスト日とは、このボード上でモデルの結果が生成された日付です。後でモデルを再実行すると、より新しい日付が表示されます。

基礎となっているもの

「細かい調整」機能では、ベースとなるモデルの名前がここに表示され続け、「最新バージョンのみ」によって隠されることはありません。このチェックボックスはデフォルトでオンになっており、同じシリーズの新しいリリースが存在し、かつランク付けされている場合に、ベンダーの古いリリースを非表示にします。フィルターに「gemma 4」のようなベース名を入力すると、それをベースに作成されたすべてのモデルが一覧表示されます。

量/数

Quantとは、ローカルモデルの重みを圧縮するための形式です。Q8_0はフル精度モデルに近く、このボードにおける標準的な量子化方式です。より小さい量子化レベルを使えば処理速度が上がり、小型GPUにも対応しやすくなりますが、スコアが下がる可能性もあります。Q8_0が私たちの環境に合わない場合にのみQ6またはQ5を使用し、Q5未満のレベルは決して使いません。Q5未満のスコアとなった古いデータは「Q5未満」という注記付きでボードに残され、上位に入る可能性がある場合のみ標準的な量子化方式で再テストされます。同じ重みデータが2つの異なる量子化レベルでテストされた場合、一方の結果がランキングされ、もう一方は「別バージョン」としてその下に記載されます。APIとは、プロバイダーが任意の形式で提供するホスティングモデルのことです。

メインベンチを開く ここにある各スコアは、ボード上の1列です。