評価から直す点を選ぶ
評価結果を読むとは、失敗を種類ごとにまとめ、いちばん安く、いちばん多く直せるものを変えることです。どの変更も、直るケースと壊れるケースを生むので、大切です。
図書館の最初の版は、10件中5件に合格しました。チームには案が4つあります。最初に出す価値があるのは一つだけで、得点がそれを教えてくれます。
このレッスンのゴール
メモ
私は、評価結果を読み、最初に何を変えるかを決められます。
キーワード
| ことば | いみ | れい |
|---|---|---|
| 失敗の種類 | ケースが失敗した理由 | invented |
| 候補 | 行おうか考えている変更 | |
| リグレッション | 前は合格し、今は失敗するケース | |
| 1000件あたりの費用 | 答え1000件を作る費用 | |
| 最も安い直し方 | 得られるものに対して費用が最小の変更 |
学生が入力するセルは、このプレビューでは空白です。
失敗を種類ごとにまとめる
10件中5件という得点は、どれだけ間違いがあるかを示します。なぜかは示しません。5つの失敗を種類ごとにまとめると、やることが見えてきます。
種類ごとに、原因も、安い直し方も違います。種類まるごとへの直し方は、5件への5つの直し方より優れています。
例: 5つの失敗
| 種類 | ケース | ありそうな原因 |
|---|---|---|
| 作り話 | c3、c7 | プロンプトが推測を禁じていない |
| あいまい | c5 | 質問に一般的な言葉で答えた |
| 断り | c8 | プロンプトが慎重すぎる |
| 長すぎ | c9 | 長さを制限するものがない |
学生が入力するセルは、このプレビューでは空白です。
まず最も安い直し方を試す
候補を費用の順に並べます。プロンプトに一行足すと、答えのたびに費用が少しだけ増えます。長いプロンプトは、もう少し増えます。大きなモデルは、約3倍かかります。
最も安いものを先に動かして、採点します。次のものは、得点が求めたときだけ重ねます。
例: 4つの候補
| 実行 | 変更 | 合格 | 1000件あたりの費用 |
|---|---|---|---|
| v1 | 最初の版 | 5 | 40 |
| v2 | シートの数字だけを使う | 7 | 42 |
| v3 | v1 に「一文で答える」を足す | 4 | 42 |
| v4 | v2 に「シートに事実があれば答える」を足す | 9 | 44 |
| v5 | v1 を大きなモデルで動かす | 7 | 130 |
学生が入力するセルは、このプレビューでは空白です。
1件を直し、2件を壊す
実行 v3 は、長すぎる答え c9 を直します。ただ、合格していた c2 と c10 も壊します。一文という規則が、数字を削ったからです。合計は5から4に下がりました。
合計は、これを隠します。二つの実行をケースごとに比べ、何が直り、何が壊れたかを書き出します。
よくある間違い
注意
何かを直した変更は良い変更だと考える人が多いです。壊したものを見てください。合格していたものを何も壊さないとき、または壊れるものを承知で受け入れるときだけ、変更を出します。
結果を読む道具を書く(1)
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const fs = require(\"fs\");' '// ケース c1 から c10 の、記録済みの実行5つ。v2: シートの数字だけを使う。' '// v3: v1 に「一文で答える」を足す。v4: v2 に「シートに事実があれば答える」を足す。' '// v5: 最初のプロンプトを、大きなモデルで動かす。費用は答え1000件あたり。' 'const RUNS = {' ' v1: { cost: 40, kinds: \"ok ok invented ok vague ok invented refusal long ok\" },' ' v2: { cost: 42, kinds: \"ok ok ok ok vague ok ok refusal long ok\" },' ' v3: { cost: 42, kinds: \"ok vague invented ok vague ok invented refusal ok vague\" },' ' v4: { cost: 44, kinds: \"ok ok ok ok ok ok ok ok long ok\" },' ' v5: { cost: 130, kinds: \"ok ok ok ok vague ok ok refusal long ok\" },' '};' 'for (const name in RUNS) RUNS[name].kinds = RUNS[name].kinds.split(\" \");' 'fs.writeFileSync(\"runs.json\", JSON.stringify(RUNS, null, 1));' > analyse.js"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
結果を読む道具を書く(2)
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function isOk(kind) { return kind === \"ok\"; }' 'function failures(kinds) {' ' const out = {};' ' kinds.forEach(function (k) { if (isOk(k) === false) out[k] = (out[k] || 0) + 1; });' ' return out;' '}' 'const base = RUNS.v1.kinds;' 'let best = null;' >> analyse.js"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
結果を読む道具を書く(3)
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'for (const name in RUNS) {' ' const kinds = RUNS[name].kinds;' ' const fixed = [];' ' const broke = [];' ' kinds.forEach(function (k, i) {' ' if (isOk(base[i]) === false && isOk(k)) fixed.push(\"c\" + (i + 1));' ' if (isOk(base[i]) && isOk(k) === false) broke.push(\"c\" + (i + 1));' ' });' ' const passed = kinds.filter(isOk).length;' ' console.log(name, \"合格 \" + passed, \"費用 \" + RUNS[name].cost, \"直った [\" + fixed + \"]\", \"壊れた [\" + broke + \"]\", JSON.stringify(failures(kinds)));' ' if (name === \"v1\" || broke.length > 0) continue;' ' const cost = RUNS[name].cost;' ' if (best === null || passed > best.passed || (passed === best.passed && cost < best.cost)) best = { name, passed, cost };' '}' 'console.log(\"選択: \" + best.name + \" (合格 \" + best.passed + \"、費用 \" + best.cost + \")\");' >> analyse.js"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
5つの実行を読む
docker exec -w /home/node/project agent node analyse.jsここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
Run の表示
| 行 | 意味 |
|---|---|
| v1 | 合格5、費用40、直ったものも壊れたものもなし |
| v2 | 合格7、c3 と c7 が直り、壊れたものなし |
| v3 | 合格4、c9 が直り、c2 と c10 が壊れた |
| v4 | 合格9、4件が直り、壊れたものなし |
| v5 | 合格7、費用130 |
| 最後の行 | 選択: v4 (合格 9、費用 44) |
学生が入力するセルは、このプレビューでは空白です。