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

無料レッスン

自前で動かすか、借りるか

このレッスンのあとで: モデルを自前で動かすかどうかを、決められる。

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

機械を持つか、一回ごとに払うか

モデルを自前で動かすとは、自分で面倒を見る機械で動かすことです。借りるとは、一回ごとに他の人へ払うことです。費用の増え方は、二つで違います。

安い方は、呼び出しの回数で変わります。計算で境目が分かり、リストで、計算が忘れたものが分かります。

このレッスンのゴール

メモ

モデルを自前で動かすかどうかを、決められる。

キーワード

ことばいみ
自前自分の機械でモデルを動かすこと
借りる一回ごとに他の人へ払うこと
損益分岐点二つの費用が等しくなる回数
処理能力機械 1 台が一か月にこなせる回数
障害サービスが止まっている時間

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

増え方が違う二つの費用

借りる費用は、一回ごとに同じなので、まっすぐに増えます。自前は階段の費用です。機械 1 台がこなせる回数は決まっていて、1 台ずつ丸ごと買います。機械の面倒を見る人の費用もかかります。

損益分岐点は、二つの費用が等しくなる回数です。それを超えると、自前が安くなります。

架空の金額、千円、一か月

月の回数借りる自前
300,0009002,400
1,000,0003,0003,300
1,200,0003,6003,300
2,000,0006,0005,100

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

計算が忘れるもの

値段の計算は、決定ではありません。夜に機械が故障したときの障害は、計算に入っていません。ソフトの更新の手間も、遊んでいる機械も入っていません。個人情報を誤って扱ったときの費用も入っていません。

反対側も入っていません。データが建物の外に出せないなら、いくら安くても、借りることはできません。

よくある間違い

注意

「機械を持てば、一回ごとはただだ」と考えがちです。機械も人も障害対応も、毎月払い続けます。階段と人を入れて損益分岐点を求め、それでも抜けているものを挙げます。

モデル用の補助を書く(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 price = 3;' 'const machine = 900;' 'const capacity = 600000;' 'const people = 1500;' 'function rent(calls) {' '  return Math.floor(calls * price / 1000);' '}' 'function host(calls) {' '  return Math.ceil(calls / capacity) * machine + people;' '}' > host.js"

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

費用を計算するスクリプトを書く(2)

コマンド
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' '  console.log(\"月の回数 | 借りる | 自前 | 安いのは\");' '  for (const calls of [300000, 600000, 1000000, 1200000, 2000000]) {' '    const pick = host(calls) < rent(calls) ? \"自前\" : \"借りる\";' '    console.log(calls + \" | \" + rent(calls) + \" | \" + host(calls) + \" | \" + pick);' '  }' '  console.log(\"単純な損益分岐点: \" + Math.ceil((machine + people) * 1000 / price) + \" 回\");' >> host.js"

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

費用を計算するスクリプトを書く(3)

コマンド
docker exec -w /home/node/project agent sh -c "printf '%s\n' '  const q = \"自前でモデルを動かすときにかかる費用のうち、一回の値段に入っていないものを一つ、短い一文で挙げてください。\";' '  const sample = \"機械が夜に故障したときに待機する人が要り、その人の時間は一回の値段に入っていません。\";' '  const reply = await ask([{ role: \"user\", content: q }], sample, 60);' '  console.log(\"返事: \" + reply.text);' '}' 'main();' >> host.js"

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

費用を計算する

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

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

出力の例

行示していること
300000 | 900 | 2400 | 借りる少ない回数では、借りる方が安い
1000000 | 3000 | 3300 | 借りる二台目を買うので、自前が跳ね上がる
1200000 | 3600 | 3300 | 自前ここで自前が勝つ
単純な損益分岐点: 800000 回早すぎる。階段を無視している
返事: ...モデルの一文。言葉は毎回違う

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

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

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