悪い公開を止める審査
ガバナンス審査は、公開前に AI 機能を書面で短く確認することです。だれも尋ねなかった問いが、事故を起こします。書き残した記録は、のちに、だれが何を決めたかを示します。
このレッスンは、モジュールを、プログラムで確かめられる五つの項目にまとめます。
このレッスンのゴール
メモ
公開前に AI 機能を審査し、結果を書き残せます。
キーワード
| ことば | いみ |
|---|---|
| 審査 | 公開前に行う書面の確認 |
| 承認 | 責任者が公開してよいと認めること |
| 抜け | 審査が落とした項目 |
| ロールバック | 機能を止める手順 |
| 記録 | 審査の結果を保存したもの |
学生が入力するセルは、このプレビューでは空白です。
五つの項目で審査になる
五つを確認します。名前のある責任者はいますか。リスクは書いてありますか。評価のケースは十分ですか。ロールバックはありますか。結果は記録されますか。
各項目は、このモジュールから来ます。責任者はリスク評価から、リスクは監督とフィードバックから、評価はモデルの切り替えから、ロールバックは提供元のリスクから来ます。
例: 二つの審査、最小 5 件
| 機能 | 責任者 | リスク | 評価 | ロールバック | 記録 | 結果 |
|---|---|---|---|---|---|---|
| 返金ボット | あり | 2 | 0 | あり | あり | 評価が不足 |
| 履歴書の選別 | あり | 1 | 12 | なし | なし | ロールバックと記録が不足 |
学生が入力するセルは、このプレビューでは空白です。
結果を書き残す
結果は、日付、名前、見つかったことと一緒に保存します。審査で抜けが見つかれば、機能は待ちます。通れば、責任者が承認します。
変更のあとに、審査をやり直します。新しいモデル、新しい用途、新しい提供元のときです。審査はある一日の記録であり、永久の許可ではありません。
よくある間違い
注意
「審査は公開時に一度やれば足りる」と考えがちです。機能も、モデルも、利用者も、決まりも変わります。どれかが変わったら審査をやり直し、結果はそのつど残します。
モデル用の補助を書く(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\");' '' 'const MIN_EVALS = 5; // これより少ないケースでは信頼できない' '// 架空の審査が二つ。審査は、すべての項目がそろったときに準備完了。' 'const reviews = [' ' { name: \"返金ボット\", owner: \"佐藤 健\", risks: [\"誤った返金\", \"怒った顧客\"], evals: 0, rollback: \"スイッチを切る\", record: true },' ' { name: \"履歴書の選別\", owner: \"田中 美咲\", risks: [\"不当な不採用\"], evals: 12, rollback: \"\", record: false },' '];' > review.js"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
審査のチェックを書く(2)
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function missing(r) {' ' const gaps = [];' ' if (r.owner.trim() === \"\") gaps.push(\"責任者\");' ' if (r.risks.length === 0) gaps.push(\"リスク\");' ' if (r.evals < MIN_EVALS) gaps.push(\"評価\");' ' if (r.rollback.trim() === \"\") gaps.push(\"ロールバック\");' ' if (r.record === false) gaps.push(\"記録\");' ' return gaps;' '}' >> review.js"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
審査のチェックを書く(3)
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' reviews.forEach(function (r) {' ' const gaps = missing(r);' ' console.log(r.name + \": \" + (gaps.length === 0 ? \"準備完了\" : \"未完了、不足: \" + gaps.join(\"、\")));' ' });' ' const q = \"顧客と話すチャット機能のロールバック計画に必ず入れるべきことを、一文で書いてください。\";' ' const r = await ask([{ role: \"user\", content: q }], \"だれが、どうやって機能を止めるか、どれくらいかかるかを書きます。\", 60);' ' console.log(\"一文の例: \" + r.text);' '}' 'main();' >> review.js"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
審査のチェックを実行する
docker exec -w /home/node/project agent node review.jsここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
出力の例
| 行 | 示していること |
|---|---|
| 返金ボット: 未完了、不足: 評価 | 評価のケースがまだない |
| 履歴書の選別: 未完了、不足: ロールバック、記録 | 戻る道がなく、何も保存されていない |
| 一文の例: ... | あなた自身の呼び出し。実行ごとに変わるか、記録済みサンプルと出る |
学生が入力するセルは、このプレビューでは空白です。