答えを変える三つの設定
temperature、トークンの上限、停止テキストは、呼び出しの設定のうち、答えを最も大きく変える三つです。どれもリクエスト本体の、メッセージの隣に書きます。
これらが大切なのは、初期値のままだと、データ処理にはばらつきが大きすぎたり、画面には長すぎたりするからです。知っていれば、意図して選べます。
この課のゴール
メモ
モデルの呼び出しで、temperature、トークンの上限、停止テキストが何を変えるかを説明できる。
キーワード
| ことば | いみ | れい |
|---|---|---|
| temperature | 答えのばらつきの大きさを決める設定 | 0 |
| トークン | モデルが読み書きする小さな文字の断片 | |
| トークンの上限 | 返答に使えるトークンの最大数 | max_tokens |
| 停止テキスト | モデルがそこに達すると返答を終える文字列 | |
| 終了の理由 | 返答が終わった理由 | length |
学生が入力するセルは、このプレビューでは空白です。
temperature はばらつきを決める
モデルは、次のトークンを、ありそうなトークンの一覧から選びます。temperature が低いと、ほとんどいつも一番ありそうなものを選びます。高いと、あまりありそうでないものも入ってきます。
正解が一つの仕事、たとえば文章から日付を取り出す仕事には、0 に近い低い値を選びます。アイデアや名前には、高めの値を選びます。
例:三つの仕事の temperature
| 仕事 | temperature | 理由 |
|---|---|---|
| メールから注文番号を取り出す | 0 | 正解は一つだけ |
| お客様の質問に答える | 0.7 | 自然だが、極端ではない |
| 店の名前を十個提案する | 1.2 | いろいろな案がほしい |
学生が入力するセルは、このプレビューでは空白です。
二つの温度で三回ずつたずねる
docker exec -w /home/node/project agent node -e 'const lab = require("./lab.js"); const question = [{ role: "user", content: "金魚の名前を一つ考えてください。一語で答えてください。" }]; const samples = { 0: ["ぶくぶく", "ぶくぶく", "ぶくぶく"], 1.2: ["ニモ", "しぶき船長", "ぶくぶく"] }; (async () => { for (const temperature of [0, 1.2]) { const found = []; let label = ""; for (let i = 0; i < 3; i++) { const got = await lab.ask({ max_tokens: 8, temperature: temperature, messages: question }, samples[temperature][i]); found.push(got.text.trim()); label = got.label; } console.log("temperature " + temperature + "(" + label + "):" + found.join(" | ")); } })();'ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
トークンの上限は厳しい天井
トークンは小さな文字の断片で、短い単語や、長い単語の一部であることが多いです。max_tokens は、モデルが書けるトークンの最大数です。そこに達すると、文の途中でも返答は止まります。
返答には終了の理由が付きます。stop は、モデルが書き終えたことを表します。length は、上限で切られたことを表します。
わざと返答を途中で切る
docker exec -w /home/node/project agent node -e 'const lab = require("./lab.js"); const question = [{ role: "user", content: "APIとは何かを二文で説明してください。" }]; const sample = { short: "APIとは、プログラムが別のプログラムに", long: "APIとは、あるプログラムが別のプログラムに何かを頼むための決まりです。呼び出す側がリクエストを送り、返事を受け取ります。" }; (async () => { for (const limit of [12, 80]) { const got = await lab.ask({ max_tokens: limit, messages: question }, limit === 12 ? sample.short : sample.long); const why = got.data ? got.data.choices[0].finish_reason : (limit === 12 ? "length" : "stop"); console.log("max_tokens " + limit + "(" + got.label + ")、finish_reason " + why + ":"); console.log(" " + got.text.trim()); } })();'ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
よくある間違い
注意
max_tokens を小さくすれば、モデルが短く書くと考える人が多くいます。そうではありません。文の途中で切れるだけです。短い答えがほしいときは、指示で頼みます。上限は、予想より少し上に置く安全装置です。
停止テキストは返答を早く終える
停止テキストは、自分で選ぶ文字列です。モデルがそれを書こうとすると、代わりに返答が終わり、停止テキスト自体は返答に含まれません。
返答を一行や、リストの一項目に収めたいときに使います。多くのモデル API は、停止テキストを同時にいくつか指定できます。
リストを三番目の前で止める
docker exec -w /home/node/project agent node -e 'const lab = require("./lab.js"); const question = [{ role: "user", content: "一から五までの数を漢字で、一行に一つ、1. 2. 3. のように番号を付けて書いてください。" }]; (async () => { const got = await lab.ask({ max_tokens: 60, stop: ["3."], messages: question }, "1. 一\n2. 二\n"); console.log("答え(" + got.label + "):" + JSON.stringify(got.text)); console.log("3. を含みますか。" + got.text.includes("3.")); })();'ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
さらに:自分の設定で試す
長さの Run で、質問を自分のものに変え、max_tokens を 5、30、200 で試します。そのたびに、終了の理由を書き留めてください。
そして、実際のプログラムにはどの値を書くかを言いましょう。上限が小さすぎるほうが、大きすぎるよりも損が大きい理由も言ってください。