変更の計画の見直し方
変更の計画は、何を変えるか、なぜ安全か、どう元に戻すかを書いた短い文書です。変更の見直しは、何かを出す前に、その計画を調べます。
AIの変更が一つ悪いと、数分で全員の利用者に届くことがあります。前もって書いた確認の一覧があれば、答えははっきり出ます。答えは、進める、足りない、止める、の三つです。
このレッスンのゴール
メモ
出す前に、変更の計画を見直すことができる。
キーワード
| ことば | いみ |
|---|---|
| 変更の計画 | 何が変わり、どう戻すかを書いた短い文書 |
| 証拠 | 変更が悪くなっていないと示す結果 |
| 展開 | 変更が、段階を踏んで利用者に届く方法 |
| 戻す手順 | 変更を元に戻す手順 |
| 承認者 | よいと言う人 |
学生が入力するセルは、このプレビューでは空白です。
計画には五つの部分が要る
五つの部分とは、変更、証拠、展開、戻す手順、承認者です。部分が欠けた計画は、まだ準備ができておらず、見直す人はどの部分かを言います。
最初に、欠けた部分を調べます。ない部分の数字を調べても、意味がないからです。
各部分には、書いた限度がある
計画を読む前に、限度を書いておきます。証拠は、事例が 100 件以上で、合格率が下がっていないこと。展開は、10 パーセント以下から始め、最低 50 件を集めること。
戻す手順は、試してあり、15 分以内でできること。承認者は、書いた人ではないこと。
例: 二つの計画を限度に当てる
| 規則 | prompt v7 | model swap |
|---|---|---|
| 事例は 100 件以上 | 240、通る | 60、通らない |
| 合格率が下がらない | 71 から 74、通る | 80 から 76、通らない |
| 10 パーセント以下から始める | 5、通る | 50、通らない |
| 最低 50 件 | 50、通る | 0、通らない |
| 戻す手順は試して 15 分以内 | はい、10 | いいえ、30。二つ通らない |
| 承認者は書いた人ではない | 佐藤、通る | 田中が書いた、通らない |
| 判断 | 進める | 止める |
学生が入力するセルは、このプレビューでは空白です。
よくある間違い
注意
数字がよければ、計画は準備ができていると考える人が多いです。数字は、戻す手順が働くことを示しません。一度も試していない戻す手順は、必要なときに失敗するかもしれません。だから見直しでは、試したか、何分かかったかを聞きます。
助っ人 model.js を書く(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"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
助っ人 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 data = await res.json();' ' const text = data.choices[0].message.content;' ' return { text, inTokens: count(data, \"prompt_tokens\"), outTokens: count(data, \"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\");' 'const plans = {' ' \"prompt v7\": { change: \"返金の新しいプロンプト\", evidence: { cases: 240, before: 71, after: 74 },' ' rollout: { start: 5, min: 50 }, back: { minutes: 10, tested: true }, approver: \"佐藤\", author: \"田中\" },' ' \"model swap\": { change: \"新しいモデル\", evidence: { cases: 60, before: 80, after: 76 },' ' rollout: { start: 50, min: 0 }, back: { minutes: 30, tested: false }, approver: \"田中\", author: \"田中\" },' ' \"tone tweak\": { change: \"もっと親しみのある口調\", evidence: { cases: 150, before: 70, after: 70 },' ' rollout: { start: 10, min: 50 }, approver: \"佐藤\", author: \"田中\" },' '};' > review.js"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
見直しのスクリプトを書く(2)
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const names = { change: \"変更\", evidence: \"証拠\", rollout: \"展開\", back: \"戻す手順\", approver: \"承認者\" };' 'function problems(p) {' ' const out = Object.keys(names).filter(function (k) { return p[k] === undefined; })' ' .map(function (k) { return names[k] + \"がない\"; });' ' if (p.evidence && p.evidence.cases < 100) out.push(\"証拠が少ない\");' ' if (p.evidence && p.evidence.after < p.evidence.before) out.push(\"証拠に悪化がある\");' ' if (p.rollout && p.rollout.start > 10) out.push(\"展開の最初が大きい\");' ' if (p.rollout && p.rollout.min < 50) out.push(\"展開に最低件数がない\");' ' if (p.back && p.back.tested === false) out.push(\"戻す手順を試していない\");' ' if (p.back && p.back.minutes > 15) out.push(\"戻す手順が遅い\");' ' if (p.approver === p.author) out.push(\"承認者が書いた人\");' ' return out;' '}' >> review.js"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
見直しのスクリプトを書く(3)
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const STOP = [\"証拠に悪化がある\", \"戻す手順がない\", \"戻す手順を試していない\", \"戻す手順が遅い\", \"承認者が書いた人\"];' 'function decide(p) {' ' const found = problems(p);' ' if (found.length === 0) return \"進める\";' ' return found.some(function (f) { return STOP.indexOf(f) >= 0; }) ? \"止める\" : \"足りない\";' '}' 'async function main() {' ' Object.keys(plans).forEach(function (name) {' ' console.log(name + \": \" + decide(plans[name]) + \" \" + JSON.stringify(problems(plans[name])));' ' });' ' const q = \"短く一文で答えてください。変更を承認する人は、その変更を書いた人ではいけないのは、なぜですか。\";' ' const sample = \"書いた本人には見えないものを、別の目が見つけられるからです。\";' ' const reply = await ask([{ role: \"user\", content: q }], sample, 80);' ' console.log(\"モデル: \" + reply.text);' '}' 'main();' >> review.js"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
変更の見直しを動かす
docker exec -w /home/node/project agent node review.jsここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
Run の出力
| 行 | 意味 |
|---|---|
| prompt v7: 進める [] | 問題が一つもない |
| model swap: 止める [...] | 問題が七つあり、安全の規則も含む |
| tone tweak: 止める ["戻す手順がない"] | 戻す手順がまったくない |
| モデル: ... | ラボからの一文。モデルが答えなければ記録済みサンプル |
学生が入力するセルは、このプレビューでは空白です。