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

無料レッスン

予算、止める規則、任せないもの

このレッスンのあとで: 予算と止める規則を決めて、タスクをエージェントに任せる価値があるかを判断することができる。

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

エージェントの限度と費用

コーディングエージェントは段階ごとに働き、どの段階にも時間とお金がかかります。予算と止める規則がないと、自分なら十分で終わるタスクで、一時間も回り続けることがあります。

エージェントの変更は、どれもあなたの見直しが要ります。前に学んだのは、何を任せるかを判断で決めることでした。このレッスンでは、そこに数字を足します。

このレッスンのゴール

メモ

予算と止める規則を決めて、タスクをエージェントに任せる価値があるかを判断することができる。

キーワード

ことばいみれい
段階エージェントの一つの動作。読む、直す、動かす
予算一回の実行が使ってよい段階や金額の上限
止める規則実行を早めに終わらせる確認
我慢進まなくても許す段階の数3
浮く分書く時間と見直す時間を引いたあと、節約できる分

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

予算と止める規則

どの実行にも予算を与えます。段階は 10 まで、金額は 40 円までです。我慢も与えます。通るテストの数が 3 段階増えなければ、止めます。

段階ごとに、決まった順で確かめます。完了、予算超え、進まない、段階切れ、の順です。最初に当てはまったものが、実行を終わらせます。

例: stuck の実行を一段階ずつ

段階費用(円)使った額通る数(6 のうち)増えてからの段階
14420
25930
361531
452032
562633 なので止める: 進まない

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

浮く時間と、かかる時間

エージェントに任せても、手でかかる分がそのまま浮くわけではありません。タスクを書く分と、変更を見直す分が、やはりかかります。浮く分は、手でかかる分から、その両方を引いたものです。

浮く分が 0 以下なら、自分でします。支払いの確認やデータの削除のように危険が大きいときも、分の数に関係なく自分でします。

例: 四つのタスク

タスク手で仕様と見直し浮く分判断
12 のファイルで関数名を変える401525任せる
文書のページを足す301515任せる
一行の誤字を直す25-3自分でする
支払いの確認を変える604020自分でする: 危険が大きい

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

よくある間違い

注意

エージェントは自分が別のことをしている間に働くので、その時間はただだと考える人が多いです。あなた自身の時間は、タスク、見直し、手直しに使われます。任せる前にその分を数え、危険が大きい仕事は数に関係なく自分でしましょう。

助っ人 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 LIMIT = { steps: 10, yen: 40, patience: 3 };' 'const runs = {' '  \"steady\": { total: 6, cost: [3, 4, 3, 5, 4, 3], passing: [1, 2, 3, 4, 5, 6] },' '  \"stuck\": { total: 6, cost: [4, 5, 6, 5, 6, 7, 6, 5], passing: [2, 3, 3, 3, 3, 3, 3, 3] },' '  \"expensive\": { total: 8, cost: [9, 12, 10, 11, 9], passing: [1, 2, 3, 4, 5] },' '};' > budget.js"

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

予算のスクリプトを書く(2)

コマンド
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function stop(r) {' '  let spent = 0;' '  let best = 0;' '  let rose = 0;' '  for (let i = 0; i < r.cost.length; i += 1) {' '    const step = i + 1;' '    spent += r.cost[i];' '    if (r.passing[i] > best) { best = r.passing[i]; rose = step; }' '    if (best === r.total) return step + \" 段階目で完了、\" + spent + \" 円\";' '    if (spent > LIMIT.yen) return step + \" 段階目で予算超え、\" + spent + \" 円\";' '    if (step - rose >= LIMIT.patience) return step + \" 段階目で進まない、\" + spent + \" 円\";' '    if (step >= LIMIT.steps) return step + \" 段階目で段階切れ、\" + spent + \" 円\";' '  }' '  return \"記録が終わった、\" + spent + \" 円\";' '}' >> budget.js"

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

予算のスクリプトを書く(3)

コマンド
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const tasks = [' '  { name: \"12 のファイルで関数名を変える\", byHand: 40, spec: 5, review: 10, risk: \"low\" },' '  { name: \"文書のページを足す\", byHand: 30, spec: 5, review: 10, risk: \"low\" },' '  { name: \"一行の誤字を直す\", byHand: 2, spec: 3, review: 2, risk: \"low\" },' '  { name: \"支払いの確認を変える\", byHand: 60, spec: 10, review: 30, risk: \"high\" },' '];' 'function decide(t) {' '  if (t.risk === \"high\") return \"自分でする: 危険が大きい\";' '  const net = t.byHand - t.spec - t.review;' '  return net > 0 ? \"任せる、\" + net + \" 分浮く\" : \"自分でする: 何も浮かない\";' '}' >> budget.js"

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

予算のスクリプトを書く(4)

コマンド
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' '  Object.keys(runs).forEach(function (name) { console.log(name + \": \" + stop(runs[name])); });' '  tasks.forEach(function (t) { console.log(t.name + \": \" + decide(t)); });' '  const q = \"短く一文で答えてください。進まなくなったコーディングエージェントを止めるのは、なぜですか。\";' '  const sample = \"近づいていない実行は、お金を使い、見直すものを増やすだけだからです。\";' '  const reply = await ask([{ role: \"user\", content: q }], sample, 80);' '  console.log(\"モデル: \" + reply.text);' '}' 'main();' >> budget.js"

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

予算のスクリプトを動かす

コマンド
docker exec -w /home/node/project agent node budget.js

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

Run の出力

行意味
steady: 6 段階目で完了、22 円予算の中で、すべてのテストが通る
stuck: 5 段階目で進まない、26 円三つの段階で増えなかった
expensive: 4 段階目で予算超え、42 円40 円を超えた
12 のファイルで関数名を変える: 任せる、25 分浮くエージェントに任せる価値がある
文書のページを足す: 任せる、15 分浮くこちらも任せる価値がある
一行の誤字を直す: 自分でする: 何も浮かない手でするほうが速い
支払いの確認を変える: 自分でする: 危険が大きい分の数に関係なく自分でする
モデル: ...ラボからの一文。モデルが答えなければ記録済みサンプル

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

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

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