提供元が明日変わったらどうするか
提供元のリスクとは、自分で制御できない一つの提供元に、機能がどれだけ依存しているかです。提供元は、停止したり、価格を上げたり、モデルを終了したりします。すると機能は止まるか、ずっと高くなります。
依存をなくすことはできませんが、見える形にし、点数を付け、出口を計画できます。
このレッスンのゴール
メモ
機能が一つの提供元にどれだけ依存し、何に代替がないかを言えます。
キーワード
| ことば | いみ |
|---|---|
| 依存 | それなしでは機能が動かないもの |
| 単一障害点 | 代替のない一つの依存 |
| 提供終了 | 提供元が使っているモデルをやめること |
| 切り替え期間 | 依存を置き換えるのにかかる日数 |
| 撤退計画 | 提供元をやめる手順を書いたもの |
学生が入力するセルは、このプレビューでは空白です。
機能が依存するものを挙げる
依存を一つずつ書き出します。モデル、読み込むデータ、呼び出すツールです。それぞれに三つ尋ねます。代替はありますか。置き換えに何日かかりますか。その間、利用者はどうなりますか。
代替のない依存は単一障害点です。点数を付け、一覧の上から取り組みます。
例: 二つの依存
| 依存 | 重み | 代替なし | 置き換えに 60 日 | 点数 |
|---|---|---|---|---|
| チャットのモデル | 3 | 2 倍で 6 | 1 を足す | 7 |
| 文書検索 | 2 | 代替あり | 10 日だけ | 2 |
学生が入力するセルは、このプレビューでは空白です。
必要になる前に出口を計画する
提供元は、モデルをやめたり、価格を変えたり、長く止まったりします。今のうちに決めます。第二のモデル、キャッシュ、簡素な答え、一時停止のどれにするかです。
撤退計画を書き、第二の道を時々試します。一度も動かさない代替は、必要な日に動かないかもしれません。コスト、トレース、信頼性のモジュールでは、失敗ごとの代替の選び方を扱います。
よくある間違い
注意
「大きな提供元は止まらないので、計画は要らない」と考えがちです。大手も止まり、価格を変え、モデルをやめます。依存は、提供元の大きさではなく、なくなったとき利用者に何が起きるかで判断します。
モデル用の補助を書く(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 design = [' ' { name: \"チャットのモデル\", kind: \"model\", fallback: false, days: 60 },' ' { name: \"文書検索\", kind: \"data\", fallback: true, days: 10 },' ' { name: \"決済 API\", kind: \"tool\", fallback: false, days: 20 },' ' { name: \"音声から文字\", kind: \"model\", fallback: true, days: 45 },' '];' 'const WEIGHT = { model: 3, data: 2, tool: 1 };' > vendor.js"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
依存の点数を書く(2)
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function score(d) {' ' let s = WEIGHT[d.kind];' ' if (d.fallback === false) s = s * 2;' ' if (d.days > 30) s = s + 1;' ' return s;' '}' >> vendor.js"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
依存の点数を書く(3)
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' let total = 0;' ' design.forEach(function (d) {' ' total = total + score(d);' ' console.log(d.name + \": \" + score(d) + (d.fallback ? \"\" : \" 代替なし\"));' ' });' ' console.log(\"合計: \" + total);' ' const q = \"機能が提供元に依存する前に、その提供元へ尋ねるべき短い質問を三つ挙げてください。\";' ' const r = await ask([{ role: \"user\", content: q }], \"1. 価格を変えるとき、どれだけ前に知らせますか。 2. 古い版はいつまで使えますか。 3. データはどう書き出せますか。\", 90);' ' console.log(\"質問の一例: \" + r.text);' '}' 'main();' >> vendor.js"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
依存の点数を実行する
docker exec -w /home/node/project agent node vendor.jsここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
出力の例
| 行 | 示していること |
|---|---|
| チャットのモデル: 7 代替なし | 最も高い点数で、単一障害点 |
| 文書検索: 2 | 代替があり、切り替え期間も短い |
| 決済 API: 2 代替なし | 代替はないが、重みが小さい |
| 音声から文字: 4 | 代替はあるが、置き換えに 45 日かかる |
| 合計: 15 | 設計全体 |
| 質問の一例: ... | あなた自身の呼び出し。実行ごとに変わるか、記録済みサンプルと出る |
学生が入力するセルは、このプレビューでは空白です。