ひとつは良く、ほかは悪く
調整したモデルは、学習させた仕事で点数が上がりました。では、良くなったのでしょうか。まだ分かりません。ほかのことが苦手になったかもしれず、動かす費用が二倍になったかもしれません。
調整したモデルを評価するとは、大事な分野のすべてで、同じケースを使ってベースラインと比べることです。
このレッスンのゴール
メモ
調整したモデルが、ベースラインより良いかどうかを言える。
キーワード
| ことば | いみ |
|---|---|
| 差 | 調整後の結果から調整前の結果を引いたもの |
| 基準の差 | 本物の改善と認める最小の差 |
| 悪化 | 調整後に間違うようになったケース |
| 分野 | 口調や計算のような、ケースの種類 |
| 記録済み | 保存した結果で、その場で作ったものではない |
学生が入力するセルは、このプレビューでは空白です。
同じケースで比べる
二つの版を、どちらも学習で見ていない、決まったケースの一組で動かします。それぞれの正解を数え、その違いが差です。
八つのうち一つの差は、小さすぎて信じられません。結果を見る前に、必要な基準の差を決めておきます。そうすれば、結果に言いくるめられません。
例: 八つのケースと三つの分野
| 分野 | 調整前の正解 | 調整後の正解 | 変化 |
|---|---|---|---|
| 仕分け | 4 件中 2 | 4 件中 3 | +1 |
| 口調 | 2 件中 1 | 2 件中 2 | +1 |
| 計算 | 2 件中 2 | 2 件中 1 | -1 |
| 全部 | 8 件中 5 | 8 件中 6 | +1 |
学生が入力するセルは、このプレビューでは空白です。
良い答えは、費用が増えることもある
調整したモデルは、答えが長くなったり、動かすのに大きな契約が要ったりするかもしれません。費用の上がりを、ベースラインの費用に対するパーセントで求めます。
許せる上限は、先に決めておきます。わずかな改善で請求が倍になるなら、出す価値はたいていありません。
よくある間違い
注意
「学習させた仕事で点数が上がれば、良いモデルだと分かる」と考えがちです。分かるのは、そこで良いことだけです。ほかの分野を確かめ、悪くなったケースを数え、費用も見てから決めます。
モデル用の補助を書く(1)
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const base = process.env.AI_URL || \"http://ai:4000\";' '// 応答に含まれるトークン数。なければ null。' 'function count(data, name) {' ' return data.usage && typeof data.usage[name] === \"number\" ? data.usage[name] : null;' '}' > model.js"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
モデル用の補助を書く(2)
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function ask(messages, sample, max) {' ' try {' ' const res = await fetch(base + \"/v1/chat/completions\", {' ' method: \"POST\",' ' headers: { \"content-type\": \"application/json\", authorization: \"Bearer lab\" },' ' body: JSON.stringify({ model: \"lab\", messages: messages, max_tokens: max || 100 }),' ' signal: AbortSignal.timeout(30000),' ' });' ' if (res.ok === false) throw new Error(\"status \" + res.status);' ' const d = await res.json();' ' return { text: d.choices[0].message.content, inTokens: count(d, \"prompt_tokens\"), outTokens: count(d, \"completion_tokens\"), recorded: false };' ' } catch (error) {' ' console.log(\"記録済みサンプル: モデルが答えませんでした (\" + error.message + \")。\");' ' return { text: sample, inTokens: null, outTokens: null, recorded: true };' ' }' '}' 'module.exports = { ask };' >> model.js"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
比較のスクリプトを書く(1)
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { ask } = require(\"./model\");' '// 記録済み: 1 は正解。二つの版とも、同じ八つのケース。' 'const cases = [' ' { id: \"c1\", area: \"sorting\", base: 0, tuned: 1 }, { id: \"c2\", area: \"sorting\", base: 0, tuned: 1 },' ' { id: \"c3\", area: \"sorting\", base: 1, tuned: 1 }, { id: \"c4\", area: \"sorting\", base: 1, tuned: 0 },' ' { id: \"c5\", area: \"tone\", base: 0, tuned: 1 }, { id: \"c6\", area: \"tone\", base: 1, tuned: 1 },' ' { id: \"c7\", area: \"sums\", base: 1, tuned: 1 }, { id: \"c8\", area: \"sums\", base: 1, tuned: 0 },' '];' > adapt5.js"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
比較のスクリプトを書く(2)
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function total(which) {' ' let n = 0;' ' for (const c of cases) n = n + c[which];' ' return n;' '}' 'const worse = cases.filter(function (c) { return c.base === 1 && c.tuned === 0; });' 'const change = {};' 'for (const c of cases) change[c.area] = (change[c.area] || 0) + c.tuned - c.base;' >> adapt5.js"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
比較のスクリプトを書く(3)
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' console.log(\"調整前 8 件中 \" + total(\"base\") + \"、調整後 8 件中 \" + total(\"tuned\"));' ' console.log(\"悪くなったケース: \" + worse.map(function (c) { return c.id; }).join(\", \"));' ' console.log(\"分野ごとの変化: \" + JSON.stringify(change));' ' const q = \"調整の狙いではなかった分野も確かめるのは、なぜですか。短い一文で答えてください。\";' ' const sample = \"一つの仕事に合わせて調整すると、ほかの仕事が静かに悪くなることがあり、確かめないと気づけないからです。\";' ' const reply = await ask([{ role: \"user\", content: q }], sample, 60);' ' console.log(\"返事: \" + reply.text);' '}' 'main();' >> adapt5.js"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
比較を実行する
docker exec -w /home/node/project agent node adapt5.jsここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
比較の出力
二つの結果は、記録されたものとしてスクリプトに書いてあります。Run は、それぞれの版の正解を数え、悪くなったケースを並べ、分野ごとの変化を示します。
最後の行は、短いモデルの呼び出しか、「記録済みサンプル」です。