一番大きなモデルが、いつも最良とは限らない
モデルの大きさを選ぶとは、仕事を十分にこなせる、いちばん小さなモデルを仕事に合わせることです。狭い仕事なら、小さなモデルが、わずかな値段で大きなモデルに並ぶことがあります。
呼び出しの値段は積み重なり、待ち時間も積み重なります。ちょうどよい大きさは、勘ではなく、試して見つけます。
このレッスンのゴール
メモ
試験の結果と値段から、仕事に合うモデルの大きさを選べる。
キーワード
| ことば | いみ |
|---|---|
| 狭い仕事 | 小さくてはっきりした一つの作業 |
| 試験セット | 採点に使う、固定したケース |
| 合格率 | モデルが正解したケースの割合 |
| 一回の値段 | 要求一つにかかる費用 |
| 十分よい | 仕事が受け入れられる合格率 |
学生が入力するセルは、このプレビューでは空白です。
どの大きさも、同じケースで試す
試験セットを作ります。自分の仕事の実際のケースを、固定したリストにしたものです。たとえば、振り分ける問い合わせ十件です。どの大きさのモデルにも同じケースを解かせ、合否を記録します。
正解した割合が合格率です。試験セットはモジュール 68 でも扱います。このレッスンは記録済みの結果を使うので、今は何も動かしません。
六件の問い合わせでの、記録済みの結果
| 大きさ | 6 件中の正解 | 合格率 | 1000 回の値段 |
|---|---|---|---|
| 小 | 4 | 66.7% | 2 |
| 中 | 5 | 83.3% | 9 |
| 大 | 6 | 100% | 40 |
学生が入力するセルは、このプレビューでは空白です。
小さなモデルが落とすケースを見る
合格率は、どのケースが落ちたかを隠します。上の小さなモデルは、5 番と 6 番の問い合わせを落としています。中身を読みます。現実には少ないケースなら、小さなモデルでも足りるかもしれません。
そのうえで、正解一つあたりの値段を求めます。値段を、通る割合で割ったものです。安くてよく間違うモデルは、高いモデルより、正解一つあたりでは高くつくことがあります。
よくある間違い
注意
「いちばん大きなモデルなら安心だ」と考えがちです。それはいちばん高く、遅くもあります。自分の試験セットに小さなモデルが通るなら、それで十分です。通るなかでいちばん安いものを選び、仕事が変わったら、また試します。
モデル用の補助を書く(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 recorded = {' ' small: { cost: 2, passed: [1, 1, 1, 1, 0, 0] },' ' medium: { cost: 9, passed: [1, 1, 1, 1, 1, 0] },' ' large: { cost: 40, passed: [1, 1, 1, 1, 1, 1] },' '};' 'function wins(m) {' ' return m.passed.reduce(function (a, b) { return a + b; }, 0);' '}' 'function rate(m) {' ' return wins(m) * 100 / m.passed.length;' '}' > choose.js"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
大きさを選ぶスクリプトを書く(2)
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function perCorrect(m) {' ' return m.cost * m.passed.length / wins(m);' '}' 'function choose(need) {' ' let best = \"なし\";' ' let bestCost = Infinity;' ' for (const name of Object.keys(recorded)) {' ' const m = recorded[name];' ' if (rate(m) >= need && m.cost < bestCost) { best = name; bestCost = m.cost; }' ' }' ' return best;' '}' >> choose.js"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
大きさを選ぶスクリプトを書く(3)
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' console.log(\"6 件の問い合わせでの記録済みの結果 (今は動かしていない):\");' ' for (const name of Object.keys(recorded)) {' ' const m = recorded[name];' ' console.log(name + \": 正解 \" + rate(m).toFixed(1) + \"%、価格 \" + m.cost + \"、正解一つあたり \" + perCorrect(m).toFixed(2));' ' }' ' console.log(\"80% 必要: \" + choose(80) + \" | 95% 必要: \" + choose(95) + \" | 100% 必要: \" + choose(100));' ' const q = \"自分の問い合わせで小さなモデルを試してから選ぶ理由を、短い一文で書いてください。\";' ' const sample = \"小さなモデルは狭い仕事ではうまくいくことがあり、どこで失敗するかは自分のケースでしか分からないからです。\";' ' const reply = await ask([{ role: \"user\", content: q }], sample, 60);' ' console.log(\"返事: \" + reply.text);' '}' 'main();' >> choose.js"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
大きさを選ぶ
docker exec -w /home/node/project agent node choose.jsここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
出力の例
| 行 | 示していること |
|---|---|
| small: 正解 66.7%、価格 2、正解一つあたり 3.00 | 安く、見た目ほど高くつかない |
| large: 正解 100.0%、価格 40、... 40.00 | いつも正解で、いちばん高い |
| 80% 必要: medium | 95% 必要: large | 必要な割合が大きさを決める |
| 返事: ... | モデルの一文。言葉は毎回違う |
学生が入力するセルは、このプレビューでは空白です。