一番大きいモデルが最良とは限らない
言語モデルを選ぶとは、仕事にモデルを合わせることです。判断の材料は、費用、速さ、大きさ、読める文章の量、動く場所です。
この選択は、呼び出しのたびに繰り返されるので重要です。必要より十倍高いモデルを百万回呼べば、何の得もなく、大きな請求になります。
この課のゴール
メモ
仕事に合うモデルを選び、その理由を言える。
キーワード
| ことば | いみ |
|---|---|
| コンテキストウィンドウ | モデルが一回の呼び出しで読める最大の文章量 |
| レイテンシ | 返答を待つ時間 |
| トークン単価 | 一トークンあたりの値段。100万単位で示すことが多い |
| ホスト型 | 事業者が動かし、インターネット越しに使うもの |
| ローカル | 自分のコンピュータで動かすもの |
学生が入力するセルは、このプレビューでは空白です。
比べる五つのこと
まず、仕事から考えます。仕事には大きさがあります。たとえば、入る文章の量と、出る文章の量です。人が許せる待ち時間と、予算もあります。
次に、表のとおり、各モデルに五つの問いをします。一つでも満たさないモデルは、ほかが優れていても外します。
五つの問い
| 要素 | たずねること |
|---|---|
| 費用 | この仕事のトークンはいくらか。 |
| 速さ | 人にとって十分に速い返答か。 |
| 大きさ | 仕事の文章を全部読めるか。 |
| 品質 | 自分の例で十分によいか。 |
| 場所 | 文章を自分のコンピュータの外へ出してよいか。 |
学生が入力するセルは、このプレビューでは空白です。
ラボのモデルを二つの仕事で測る
docker exec -w /home/node/project agent node -e 'const lab = require("./lab.js"); const asks = [ { name: "短い", max: 10, text: "果物を一つ挙げてください。", sample: "りんご。" }, { name: "長い", max: 100, text: "雨の日の様子を三文で書いてください。", sample: "雨が窓をたたいています。通りは静かで灰色です。" }, ]; (async () => { for (const one of asks) { const started = Date.now(); const got = await lab.ask({ max_tokens: one.max, messages: [{ role: "user", content: one.text }] }, one.sample); const ms = Date.now() - started; if (got.label === "記録済みのサンプル") { console.log(one.name + ":記録済みのサンプル、時間は測っていません。"); continue; } const used = got.data.usage ? got.data.usage.completion_tokens + " トークンを生成" : "返答にトークン数なし"; console.log(one.name + ":モデルの答え、" + ms + " ms、" + got.text.length + " 文字、" + used + "。"); } })();'ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
呼ぶ前に費用を計算する
価格は、100万トークンあたりで示されます。入力トークンの価格と、通常はそれより高い出力トークンの価格があります。呼び出し一回の費用は、二つの積の合計です。入力トークンに入力価格をかけ、出力トークンに出力価格をかけて足します。
典型的な仕事のトークン数を数え、一回分を計算し、予想する呼び出しの回数をかけます。ここで使う価格表は作り話で、本物なのは方法だけです。
作り話の三つのモデルで仕事を計算する
docker exec -w /home/node/project agent node -e '/* 作り話の価格表です。価格は100万トークンあたりの単位数です。 */ const models = [ { name: "小", inPrice: 20, outPrice: 80, delay: 600, context: 8000 }, { name: "中", inPrice: 100, outPrice: 400, delay: 1500, context: 32000 }, { name: "大", inPrice: 500, outPrice: 2000, delay: 4000, context: 128000 }, ]; const job = { inTokens: 3000, outTokens: 300, maxDelay: 2000, budget: 0.5 }; console.log("仕事:入力 " + job.inTokens + " トークン、出力 " + job.outTokens + " トークン、" + job.maxDelay + " ms 以内の返答。"); for (const m of models) { const cost = (job.inTokens * m.inPrice + job.outTokens * m.outPrice) / 1000000; const ok = job.inTokens + job.outTokens <= m.context && m.delay <= job.maxDelay && cost <= job.budget; console.log(m.name + " 費用 " + cost.toFixed(3) + " 単位、遅延 " + m.delay + " ms、" + (ok ? "合う" : "合わない")); }'ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
例:一つの仕事、三つのモデル
| モデル | 一回の費用 | 遅延 | 合うか |
|---|---|---|---|
| 小 | 0.084 単位 | 600 ms | はい |
| 中 | 0.420 単位 | 1500 ms | はい |
| 大 | 2.100 単位 | 4000 ms | いいえ、遅すぎて予算の 0.5 単位も超える |
学生が入力するセルは、このプレビューでは空白です。
よくある間違い
注意
一番大きいモデルがいつも最良だと考える人が多くいます。たいてい一番遅く一番高く、簡単な仕事なら小さなモデルで十分なこともあります。自分の例で各モデルを試し、合格した中で一番安いものを選びます。
動く場所が条件を変える
ホスト型のモデルは、事業者が動かします。文章をインターネット越しに送り、トークンごとに支払います。ローカルのモデルは自分のコンピュータで動きます。文章は手元に残りますが、機材が要り、遅いこともあります。
私的な文章を扱う仕事は、ローカルに限られるかもしれません。そのときの規則は、許されたものの中で一番安いもの、です。
さらに:自分の仕事を計算する
費用のスクリプトの仕事を、自分が作りたいものに変えます。入出力のトークン数と、人が待てる時間を決めて、実行してください。
どのモデルを選び、どの要素が決め手だったかを書きましょう。その選択を信じる前に、次に何を試すかも言ってください。