
ロボットの録画から抽出したフレームをもとにモデルが書いた説明だけでは、その説明が録画と一致しているかは分かりません。Robot Reel のガイド Your first model-claim review は、より慎重な手順を示しています。まず元の 2 台のカメラの録画を見て、保存されたままのモデル回答を 1 つ取り出し、robot-reel review-claims で機械的に照合できる事実だけを確認します。説明そのものは明示的に not_assessed(自動判定の対象外)とします。本記事では、固定リビジョン 7f71f58 のドキュメントに沿ってこの手順を整理し、何を示せて何を示せないかに焦点を当てます。
注記:以下のコマンド、想定される終了コード、実験設定はすべてプロジェクトのドキュメント(O レベル、プロジェクト自身の記述)によるものです。本サイトでは再実行しておらず、独立した再現でもありません。Robot Reel プロジェクト全体の紹介は Robot Reel:ロボットの方策シミュレーションを、コマ単位で検証できる再生と 3D シーンに を参照してください。本記事はそのうちモデルの主張を照合する部分だけを扱います。
このデモが扱う範囲と扱わない範囲
model-review.md によると、このデモは既存の seed-09 SmolVLA ストレス実験から 3 つのエピソードを選んだもので、それぞれ reference、dim、camera の条件に対応します。各エピソードにはメインカメラと手首カメラの録画があり、それぞれから 5 フレームを抽出してモデル Qwen/Qwen3.8-27B-FP8 に渡します。入力モードは 2 つで、抽出フレームのみ(Images only)と、抽出フレームに機械可読な結果記録を加えたもの(Images + record)です。モードごと・エピソードごとに 1 回ずつ生成し、回答は合計 6 件です。
ドキュメントは、これが何ではないかも明記しています。新しい方策のロールアウトでも、モデルのランキングでも、母集団での正答率の推定でも、物理的な失敗メカニズムの証拠でもありません。選ばれた 3 エピソードはあくまでデモであり、6 件の回答から統計的な結論は導けません。
準備:固定バージョンのパッケージと証拠
この手順には GPU、モデルのアカウント、リポジトリのクローン、新たなシミュレーションのいずれも不要です。ガイドでは Python 3.12 以降を使い、新しいディレクトリに公開済みパッケージをインストールします(標準インストールには Robot Reel のシミュレーション依存関係も含まれますが、ここで使うのはオフラインの照合コマンドだけです)。
mkdir robot-claim-first-review && cd robot-claim-first-review
python3 -m venv .venv
.venv/bin/python -m pip install robot-reel==0.16.0
証拠は v0.16.0 リリースの ZIP で、SmolVLA の 3 エピソード、2 台のカメラの元録画、トレース、実際に抽出した画像、6 件のモデル回答、オフラインページが入っています。ガイドのスクリプトは先に SHA-256 を照合し、一致しなければ展開を拒否します。
.venv/bin/python - <<'PY'
import hashlib
import io
from pathlib import Path
from urllib.request import urlopen
from zipfile import ZipFile
url = "https://github.com/noteflowai/robot-reel/releases/download/v0.16.0/robot-reel-model-review.zip"
expected = "7691e06219d840dab3a19f3e411ad513ed69f00e3c69437e046b1f032cc601b3"
with urlopen(url, timeout=60) as response:
data = response.read()
if hashlib.sha256(data).hexdigest() != expected:
raise SystemExit("Archive checksum differs; do not extract it.")
Path("recorded-review").mkdir()
with Path("review.zip").open("xb") as output:
output.write(data)
with ZipFile(io.BytesIO(data)) as archive:
archive.extractall("recorded-review")
PY
展開したら recorded-review/index.html を開き、dim を選んで 2 台のカメラの録画を再生し、2 つのモードの回答を比べます。順序が大切です。モデルの説明を読む前に、まず元の録画を見ます。オンライン版は Robot Reel のモデル説明照合ページ です。
保存されたままの回答を照合する
review-claims が受け付ける主張ファイルのフィールドは次の 4 つだけです。
{
"outcome": "step_limit",
"action_count": 160,
"cited_frames": [0, 160],
"explanation": "A visual interpretation to be reviewed separately."
}
この JSON はドキュメントの作者が書いた形式の例で、モデルの出力ではありません。実際の入力は recorded/ ディレクトリから取り出した text フィールドで、編集や整形は一切しません。
.venv/bin/python - <<'PY'
import json
from pathlib import Path
source = Path("recorded-review/recorded/episode-b-with-record-17.json")
record = json.loads(source.read_text())
with Path("claims.json").open("x") as output:
output.write(record["text"])
PY
.venv/bin/robot-reel review-claims \
recorded-review/media/episode-b/trace.json claims.json --output my-review.json
チェッカーは各事実を matched、contradicted、unassessed のいずれかで報告し、2 つの入力ファイルを SHA-256 で紐付け、既存のレポートの上書きを拒否します。終了コードの意味は次のとおりです。
| 終了コード | 意味 |
|---|---|
| 0 | 結果と動作数の両方が一致し、引用フレームが少なくとも 1 つ存在する |
| 1 | 有効な JSON だが、矛盾する主張または未評価(unassessed)の主張がある |
| 2 | 入力が無効、または出力でエラーが発生した |
この Images + record の回答で想定される終了コードは 0 です。結果 step_limit、動作数 160、引用されたフレームラベルがすべてトレースと一致し、レポートでは "explanation_status": "not_assessed" が維持されます。unknown と null は不確かさを保持するためのもので、合格とは扱われません。
ガイドは重要な注意を添えています。この回答には入力として結果記録が与えられていたので、それを繰り返すのは記録を読んだだけで、モデルが独自に失敗を見つけたわけではありません。フレーム番号が実在しても、その画像がモデルの説明を裏付けることにはならず、物理的な原因の証明にはなおさらなりません。
形式の失敗を見える形で残す
同じディレクトリで Images only の回答を原文のまま取り出し、同じチェッカーを実行します。
.venv/bin/python - <<'PY'
import json
from pathlib import Path
source = Path("recorded-review/recorded/episode-b-images-only-17.json")
record = json.loads(source.read_text())
with Path("images-only.json").open("x") as output:
output.write(record["text"])
PY
.venv/bin/robot-reel review-claims \
recorded-review/media/episode-b/trace.json images-only.json
同じエピソードの Images only の回答は、指示どおりの素の JSON ではなく、JSON を Markdown のコードフェンスで囲んで返しました。この原文を同じチェッカーに渡すと、厳密な JSON 文書ではないため、想定される終了コードは 2 です。
ガイドのルールは、フェンスを取り除いて整形した内容をモデルの元の結果として報告しないことです。オフラインページは読みやすさのためにフェンス内の内容を取り出して表示しますが、形式の失敗の表示は残します。評価の観点では、「モデルが指定の形式で答えなかった」こと自体が記録すべき結果です。
モデルに渡されたもの
プロトコルは生成前にコミットされています。examples/model-review/sources.json は、ソースのコミット、クリップとトレースのハッシュ、抽出フレームのインデックス、コンタクトシートの正確なハッシュを固定しています。コンタクトシートは公開済みの非可逆 MP4 派生ファイルからデコードしたもので、方策が受け取った元の RGB バッファではありません。2 つのプロンプトモードの違いは 1 点だけで、機械可読な記録済みの事実を添えるかどうかです。
生成設定は、モデルのリビジョン 017b9c7af6b5689d5dd426a76e0bc077eb5ca20a、seed 17、temperature 0.6、top-p 0.9、top-k 20、thinking 無効、512 トークンの上限です。無効な JSON や誤った主張を含め、完了した出力はすべて保持されています。記録時の実行には L40S が使われています。ドキュメントは、新たに生成するとハードウェアやライブラリのバージョンによって結果が変わりうると注意し、通常の照合では公開済みの出力をそのまま使うよう勧めています。
ドキュメントには読み込み時の問題も記録されています。Transformers 5.17.0 は、このチェックポイントに存在しない dense モデルの mlp.gate 除外指定を正規表現の接頭辞として解釈し、gate_proj まで誤って除外して、その FP8 スケールを失います。記録スクリプトの --fix-dense-fp8-skip は、これらのルーター除外指定をメモリ上でのみ取り除き、元の重みは変更せず、欠落・想定外・不一致のチェックポイントキーがあれば拒否します。初期化に失敗した記録は、完了した出力とは別に保存されています。
制約と注意点
- 自動照合の対象は、結果ラベル、動作数、引用フレームが存在するかどうかだけです。説明と因果の判断は常に
not_assessedで、録画と照らし合わせた人によるレビューが別途必要です。 - トレースは与えられた証拠であり、独立に認証された物理的事実ではありません。トレースと一致しても、現実世界と一致するとは限りません。
- 選ばれた 3 エピソード、条件ごとに 1 回の生成では、モデルの比較や正答率の推定には使えません。
- モデルが見たのは非可逆 MP4 からデコードしたコンタクトシートで、方策が実際に受け取った画像とは異なります。
- ロボットのメディアを再配布するときは、アーカイブの
NOTICE.txtを添えてください。Robot Reel のコードのライセンスは、上流のロボット素材を再ライセンスするものではありません。 - 本サイトは固定リビジョンのドキュメントを読んだだけで、上記のコマンドは実行していません。
「照合できる」は「確認された」ではありません。これは フィジカルAIラボ講座 の証拠の基準と同じで、元の出典をたどれても、その出典の結論が正しいとは限りません。



