エージェントの限度と費用
コーディングエージェントは段階ごとに働き、どの段階にも時間とお金がかかります。予算と止める規則がないと、自分なら十分で終わるタスクで、一時間も回り続けることがあります。
エージェントの変更は、どれもあなたの見直しが要ります。前に学んだのは、何を任せるかを判断で決めることでした。このレッスンでは、そこに数字を足します。
このレッスンのゴール
メモ
予算と止める規則を決めて、タスクをエージェントに任せる価値があるかを判断することができる。
キーワード
| ことば | いみ | れい |
|---|---|---|
| 段階 | エージェントの一つの動作。読む、直す、動かす | |
| 予算 | 一回の実行が使ってよい段階や金額の上限 | |
| 止める規則 | 実行を早めに終わらせる確認 | |
| 我慢 | 進まなくても許す段階の数 | 3 |
| 浮く分 | 書く時間と見直す時間を引いたあと、節約できる分 |
学生が入力するセルは、このプレビューでは空白です。
予算と止める規則
どの実行にも予算を与えます。段階は 10 まで、金額は 40 円までです。我慢も与えます。通るテストの数が 3 段階増えなければ、止めます。
段階ごとに、決まった順で確かめます。完了、予算超え、進まない、段階切れ、の順です。最初に当てはまったものが、実行を終わらせます。
例: stuck の実行を一段階ずつ
| 段階 | 費用(円) | 使った額 | 通る数(6 のうち) | 増えてからの段階 |
|---|---|---|---|---|
| 1 | 4 | 4 | 2 | 0 |
| 2 | 5 | 9 | 3 | 0 |
| 3 | 6 | 15 | 3 | 1 |
| 4 | 5 | 20 | 3 | 2 |
| 5 | 6 | 26 | 3 | 3 なので止める: 進まない |
学生が入力するセルは、このプレビューでは空白です。
浮く時間と、かかる時間
エージェントに任せても、手でかかる分がそのまま浮くわけではありません。タスクを書く分と、変更を見直す分が、やはりかかります。浮く分は、手でかかる分から、その両方を引いたものです。
浮く分が 0 以下なら、自分でします。支払いの確認やデータの削除のように危険が大きいときも、分の数に関係なく自分でします。
例: 四つのタスク
| タスク | 手で | 仕様と見直し | 浮く分 | 判断 |
|---|---|---|---|---|
| 12 のファイルで関数名を変える | 40 | 15 | 25 | 任せる |
| 文書のページを足す | 30 | 15 | 15 | 任せる |
| 一行の誤字を直す | 2 | 5 | -3 | 自分でする |
| 支払いの確認を変える | 60 | 40 | 20 | 自分でする: 危険が大きい |
学生が入力するセルは、このプレビューでは空白です。
よくある間違い
注意
エージェントは自分が別のことをしている間に働くので、その時間はただだと考える人が多いです。あなた自身の時間は、タスク、見直し、手直しに使われます。任せる前にその分を数え、危険が大きい仕事は数に関係なく自分でしましょう。
助っ人 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 分浮く | こちらも任せる価値がある |
| 一行の誤字を直す: 自分でする: 何も浮かない | 手でするほうが速い |
| 支払いの確認を変える: 自分でする: 危険が大きい | 分の数に関係なく自分でする |
| モデル: ... | ラボからの一文。モデルが答えなければ記録済みサンプル |
学生が入力するセルは、このプレビューでは空白です。