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

無料レッスン

出す前に変更の計画を見直す

このレッスンのあとで: 出す前に、変更の計画を見直すことができる。

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

変更の計画の見直し方

変更の計画は、何を変えるか、なぜ安全か、どう元に戻すかを書いた短い文書です。変更の見直しは、何かを出す前に、その計画を調べます。

AIの変更が一つ悪いと、数分で全員の利用者に届くことがあります。前もって書いた確認の一覧があれば、答えははっきり出ます。答えは、進める、足りない、止める、の三つです。

このレッスンのゴール

メモ

出す前に、変更の計画を見直すことができる。

キーワード

ことばいみ
変更の計画何が変わり、どう戻すかを書いた短い文書
証拠変更が悪くなっていないと示す結果
展開変更が、段階を踏んで利用者に届く方法
戻す手順変更を元に戻す手順
承認者よいと言う人

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

計画には五つの部分が要る

五つの部分とは、変更、証拠、展開、戻す手順、承認者です。部分が欠けた計画は、まだ準備ができておらず、見直す人はどの部分かを言います。

最初に、欠けた部分を調べます。ない部分の数字を調べても、意味がないからです。

各部分には、書いた限度がある

計画を読む前に、限度を書いておきます。証拠は、事例が 100 件以上で、合格率が下がっていないこと。展開は、10 パーセント以下から始め、最低 50 件を集めること。

戻す手順は、試してあり、15 分以内でできること。承認者は、書いた人ではないこと。

例: 二つの計画を限度に当てる

規則prompt v7model 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: 止める ["戻す手順がない"]戻す手順がまったくない
モデル: ...ラボからの一文。モデルが答えなければ記録済みサンプル

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

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

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