クリーム色の背景、色付き表示、高コントラスト、大きな文字のほうが読みやすいですか?配色と文字を選ぶと、すべてのページに一度で反映されます。

無料レッスン

モデルの回帰を見つける方法

このレッスンのあとで: 私は、2つのバージョンを同じケースで比べ、一方が悪くなったかを判断できます。

65分のレッスンコマンド7件AI コーディングエージェントのラボ:opencode でコードを説明・修正し、その結果を確かめる

新しいプロンプトは悪くなったか

回帰テストの実行とは、機能の2つのバージョンを同じケースで比べ、何が悪くなったかを示すことです。あるメッセージを直した変更が別のメッセージを壊すことはよくあり、誰も気づかないので、役に立ちます。

ショップの振り分け機能に新しいバージョンができました。合格率は前と同じに見えます。それは、何も変わっていないという意味ではありません。

このレッスンのゴール

メモ

私は、2つのバージョンを同じケースで比べ、一方が悪くなったかを判断できます。

キーワード

ことばいみ
回帰前は合格で、今は不合格のケース
合格率合格したケースの割合
基準版比べる相手のバージョン
ばらつき同じバージョンの実行どうしの差
不安定なケース実行によって合格したり不合格になったりするケース

学生が入力するセルは、このプレビューでは空白です。

同じケースで、バージョンごとに比べる

2つのバージョンを同じゴールデンセットで実行し、ケースごとの結果を残します。合格率は1つの数字を与えます。変わったケースの一覧は、その理由を与えます。

回帰とは、基準版では合格で、今は不合格のケースです。合格率より先に、この一覧を読みます。

例: 合格率は同じで、ケースが違う

バージョン12件中の合格数合格率不合格のケース
古い版、実行11083 パーセント8、12
古い版、実行2975 パーセント5、11、12
新しい版975 パーセント4、10、12

学生が入力するセルは、このプレビューでは空白です。

返事は変わるので、1回の実行では分からない

モデルは、同じメッセージにも毎回違う答えを返すことがあります。そこで、古いバージョンを2回実行します。2つの合格率の差がばらつきです。

不安定なケースは、ある実行で合格し、次の実行で不合格になります。それを新しいバージョンのせいにしてはいけません。

まず合格率で、次にケースで決める

新しい合格率が古い合格率より、ばらつきを超えて低ければ、悪化です。ばらつきの中なら、合格率は何も語りません。

次にケースを見ます。古い実行のすべてで合格し、新しい実行で不合格になったケースは、確かな回帰です。直すべきなのは、これです。

記録した3回の実行を書く(1)

コマンド
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const want = [\"請求\", \"配送\", \"その他\", \"請求\", \"配送\", \"その他\", \"請求\", \"配送\", \"不明\", \"不明\", \"請求\", \"その他\"];' '// 記録した実行。ケースごとにラベルと緊急度、必要なら文章も。' 'const runA1 = [[\"請求\", 2], [\"配送\", 2], [\"その他\", 1], [\"請求\", 2], [\"配送\", 3], [\"その他\", 1], [\"請求\", 2], [\"請求\", 2], [\"不明\", 1], [\"不明\", 1], [\"請求\", 3], [\"配送\", 2]];' > runs.js"

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

記録した3回の実行を書く(2)

コマンド
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const runA2 = [[\"請求\", 2], [\"配送\", 2], [\"その他\", 1], [\"請求\", 2], [\"その他\", 1], [\"その他\", 1], [\"請求\", 2], [\"配送\", 2], [\"不明\", 1], [\"不明\", 1], [\"その他\", 2], [\"配送\", 2]];' >> runs.js"

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

記録した3回の実行を書く(3)

コマンド
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const runB = [[\"請求\", 2], [\"配送\", 2], [\"その他\", 1], [\"その他\", 2], [\"配送\", 3], [\"その他\", 1], [\"請求\", 2], [\"配送\", 2], [\"不明\", 1], [\"不明\", 1, \"返金を承認しました。\"], [\"請求\", 3], [\"配送\", 2]];' 'module.exports = { want, runA1, runA2, runB };' >> runs.js"

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

比較を書く(1)

コマンド
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { want, runA1, runA2, runB } = require(\"./runs\");' '// レッスン2のルールを短くしたもの: ラベルが合う、緊急度が1から3、禁止フレーズがない。' 'function passes(entry, expected) {' '  const said = entry[2] || \"\";' '  return entry[0] === expected && entry[1] >= 1 && entry[1] <= 3 && said.includes(\"返金を承認しました\") === false;' '}' 'function results(run) {' '  return run.map(function (entry, at) { return passes(entry, want[at]); });' '}' > compare3.js"

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

比較を書く(2)

コマンド
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function rate(list) {' '  return Math.floor(list.filter(Boolean).length * 100 / list.length);' '}' 'const a1 = results(runA1);' 'const a2 = results(runA2);' 'const b = results(runB);' 'console.log(\"合格率 A1: \" + rate(a1) + \" パーセント\");' 'console.log(\"合格率 A2: \" + rate(a2) + \" パーセント\");' 'console.log(\"合格率 B: \" + rate(b) + \" パーセント\");' 'const noise = Math.abs(rate(a1) - rate(a2));' 'console.log(\"A1 と A2 のばらつき: \" + noise + \" ポイント\");' >> compare3.js"

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

比較を書く(3)

コマンド
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const low = Math.min(rate(a1), rate(a2));' 'const high = Math.max(rate(a1), rate(a2));' 'let verdict = \"はっきりした変化なし\";' 'if (rate(b) < low - noise) verdict = \"悪化\";' 'if (rate(b) > high + noise) verdict = \"改善\";' 'console.log(\"合格率だけで見た判定: \" + verdict);' 'const worse = [];' 'const unstable = [];' 'const always = [];' 'for (let at = 0; at < want.length; at = at + 1) {' '  const same = a1[at] === a2[at];' '  if (same === false) unstable.push(at + 1);' '  else if (a1[at] && b[at] === false) worse.push(at + 1);' '  else if (a1[at] === false && b[at] === false) always.push(at + 1);' '}' 'console.log(\"回帰 (A1 と A2 で合格、B で不合格): \" + worse.join(\"、\"));' 'console.log(\"不安定 (A1 と A2 で結果が違う): \" + unstable.join(\"、\"));' 'console.log(\"どの実行でも不合格: \" + always.join(\"、\"));' >> compare3.js"

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

バージョンを比べる

コマンド
docker exec -w /home/node/project agent node compare3.js

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

比較が表示するもの

行示す内容
合格率A1 は 83、A2 は 75、B は 75 パーセント
ばらつき8 ポイント
合格率だけの判定はっきりした変化なし
回帰ケース 4 と 10
不安定ケース 5、8、11
どの実行でも不合格ケース 12

学生が入力するセルは、このプレビューでは空白です。

試してみましょう

ヒント

runs.js で、runB のケース1の緊急度を2から9に変え、もう一度比べます。ケース1が回帰に加わるはずです。

よくある間違い

注意

各バージョンを1回ずつ実行して、その差を信じる人が多くいます。返事が変わるときは、1回の実行がどちらにも誤解を生みえます。基準版は少なくとも2回実行し、ばらつきを測り、変化はそれと比べて判断します。

このラボとソースについて: AI コーディングエージェントのラボ:opencode でコードを説明・修正し、その結果を確かめる

授業で使いますか?このモジュールを学生に割り当てると、教員用ガイド、自動採点つきの課題、学生ごとのラボを使えます。