AWS の判定モデル Strands Decider 2B はコードレビューのバグ探しに使えない
Strands Decider 2B に PR の差分を渡してバグのありそうな変更を当てさせたところ、既定の設定のままでは 4,096 トークンを超えた差分の後ろをエラーを出さずに捨てていて、点の高い変更を選んでも無作為に選ぶより当たりませんでした。設定(max_length)を上げると、点の高い上位 2割の当たりは 11.4% から 41.8% と 4 倍近くになり、Claude Sonnet 5.5 も上回りました。ただしこの伸びは、変更が 202 か所ある 1 本の大きな PR の変更をまとめて高く付けた結果で、その PR を除くと Clef と Sonnet 5.5 より当たりませんでした。変更ごとにバグを当てる用途には、設定を上げてもまだ使えません。
Strands Decider 2B は、AWS の Strands Agents のチームが 2026-10-01 に公開した 20億パラメータの判定モデルです。判定モデルは文章を生成せず、問いの答えの確率だけを返します。重みが Hugging Face で公開されていて、手元の CPU か GPU で動かせます。
試したのは、私が運用している Slack のボット(TypeScript)のリポジトリです。このリポジトリにはマージした後に直したバグが修正のコミットとして残っていて、その行を正解にしました。比べる相手は、前の日に測った Cloudflare の判定モデル Clef(Workers AI の API で使えます)と Claude Sonnet 5.5 です。
既定の設定では長い差分の後ろが読まれず、無作為より当たらなかった
マージ済みの PR に push のたびに出た差分 55回分(同じ PR でも push ごとに 1 回と数える)について、毎回その差分の全体(変更の前後 10行の文脈付き)を渡し、その中の変更のまとまり(追加・変更された行のひと続き)を 1 つずつ指して「この範囲の変更に、マージする前に直すべき問題がありますか?」と聞き、「はい」の確率を点にしました。Strands Decider 2B は渡された文章を 1 回だけ読み、その上で複数の問いにまとめて答える作りなので、この形にしています。Clef と Sonnet 5.5 にも前の日に同じ形で渡し、Sonnet 5.5 には「はい」の確率を数字で答えさせました。
既定の設定で読める長さは 4,096 トークンで、差分と問いを合わせてこれを超えると差分の後ろが切られます。エラーも警告も出ず、点はふつうに返ってきました。55回分のうち 20回分が超えていて、変更のまとまり 400個のうち 221個が読まれていませんでした。正解を含む 73個のうち 55個も、その読まれない側にありました。
点の高い上位 2割(79個)のうち正解を含む物は 9個(11.4%)で、無作為に選んだ場合の 18.2% を下回りました。差分の先頭に近い変更ほど点が高く、変更の番号と点の順位相関は −0.76 でした。
たとえば Slack のメッセージの中で 2つのボタンに同じ ID を付けていた所があります。Slack がメッセージを受け付けないエラーになり後で直したバグですが、差分の読まれない側にあり、400個中 244位でした。
4,096 は設定値で、上げると当たりは 4 倍近くになった
4,096 はライブラリの設定 max_length の値で、土台の言語モデルは 262,144 トークン(約 26万)まで読めます。作った側はソースのコメントに、自分たちの評価では 3,072 から 4,096 に増やしても点が変わらなかったと書いています。
max_length を最長の差分(約 2万4千トークン)が丸ごと入る 24,576 に上げ、同じ 55回分・同じ問い・同じ正解で測り直しました。4,096 に収まる回の点は、上げても変わりませんでした。
- 上位 2割の当たり: 既定 11.4% → 上げた後 41.8%(33個) / Clef 21.5% / Sonnet 5.5 29.1%
- AUC: 既定 0.378 → 上げた後 0.707 / Clef 0.559 / Sonnet 5.5 0.580
差分の先頭ほど点が高い偏りも消えました。
上げた分だけ重くなり、4 コアの CPU で 2万トークン台の差分は 1 回 6〜8分かかって、メモリは最大 12.5GB 使いました。
伸びの中身は変更の多い 1 本の PR
55回分のうち 5回分は同じ 1 本の大きな PR で、変更のまとまり 400個のうち 202個と、正解 73個のうち 55個をこの PR が持っていました。上げた後の点では、この PR の変更がまとめて 0.58〜0.68 と高く付いていました。差分の長さ(トークン数)をそのまま点にしても AUC は 0.642 になり、長い差分ほど高く付けるだけで数字の多くが出ます。
この PR を除いた残り(変更のまとまり 198個、正解 18個)の AUC は次のとおりでした。
- Strands Decider 2B: 0.534
- Clef: 0.645
- Sonnet 5.5: 0.707
この PR の中だけで比べると Strands Decider 2B 0.732、Clef 0.498、Sonnet 5.5 0.585 で、Strands Decider 2B が上でした。ただし正解のバグを含む PR は全体で 6 本しかないので、この差は根拠にしていません。
測った範囲で言えること
このリポジトリの 55回分の差分では、既定の設定のままだと長い差分の後ろが黙って切られたので、使うなら max_length を上げてからになります。上げた後も、大きい PR を除くと Clef と Sonnet 5.5 より当たらず、変更ごとにバグを当てる用途にはまだ使えませんでした。