モデルAPIはトークンで課金される
たいていのモデルAPIは、呼び出しの回数ではなく、トークンの数で課金します。短い質問と長い作文では、費用が大きく違います。
呼び出す前に費用を見積もれば、請求書で驚かずにすみます。このレッスンで、その方法を学びます。
このレッスンのゴール
メモ
呼び出しを行う前に、その費用を見積もれる。
キーワード
| ことば | いみ |
|---|---|
| トークン | 数えられて課金される、文章の小さなかたまり |
| 入力トークン | プロンプトで送るトークン |
| 出力トークン | モデルが書いて返すトークン |
| 100万あたりの価格 | 100万トークンの値段 |
| 予算 | 使ってよいと決めた最大の金額 |
学生が入力するセルは、このプレビューでは空白です。
入力と出力のトークンが課金される
送る入力トークンと、モデルが書く出力トークンの両方に、お金を払います。1トークンあたりでは、出力のほうが高いのがふつうです。
価格は、100万トークンあたりで示されます。このレッスンの価格は作り物です。本物の価格は変わるので、提供元のページを読みましょう。
例:呼び出し1回
| 部分 | トークン数 | 100万あたりの価格(円) | 費用(百万分の1円) |
|---|---|---|---|
| 入力 | 1000 | 200 | 200000 |
| 出力 | 500 | 800 | 400000 |
| 合計 | 1500 | 該当なし | 600000、つまり0.6円 |
学生が入力するセルは、このプレビューでは空白です。
文字数からトークンを見積もる
docker exec -w /home/node/project agent node -e "const text='APIキーとは何かを一文で説明してください。';let a=0,k=0;for(const c of text){if(c.charCodeAt(0)<128)a++;else k++}console.log('文字数:'+text.length);console.log('推定トークン数:'+(k+Math.ceil(a/4)))"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
呼ぶ前にトークンは見積もれる
日本語は、英語より多くのトークンを使います。このレッスンの目安は、日本語の文字は1文字で約1トークン、半角の英数字は4文字で約1トークンです。たとえば日本語の100文字は、約100トークンです。
これはおおまかな見積もりです。呼び出しのあとには、たいてい本当の数が返ります。
モデルを呼んでトークン数を読む
docker exec -w /home/node/project agent node -e "const u=(process.env.AI_URL||'http://ai:4000')+'/v1/chat/completions';const show=(a,b)=>{console.log('入力トークン:'+a+'、出力トークン:'+b);console.log('レッスンの価格での費用:'+(a*200+b*800)+' 百万分の1円')};(async()=>{try{const r=await fetch(u,{method:'POST',headers:{'content-type':'application/json',authorization:'Bearer lab'},body:JSON.stringify({model:'lab',messages:[{role:'user',content:'APIキーとは何かを一文で説明してください。'}],max_tokens:60})});const j=await r.json();if(r.ok===false)throw new Error(r.status+' '+j.error.message);console.log('答え:'+j.choices[0].message.content);if(j.usage)show(j.usage.prompt_tokens,j.usage.completion_tokens);else console.log('トークン数は報告されませんでした。')}catch(e){console.log('応答なし('+e.message+')。記録済みサンプル:');console.log('答え:APIキーは、リクエストが自分のものだと証明する秘密です。');show(24,30)}})()"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
上限で出力を短く保つ
入力は、短いプロンプトを書くことで抑えます。出力は max_tokens で抑えます。これは、答えをそのトークン数で打ち切ります。
チャットでは、新しいやり取りのたびに、前のメッセージをすべて送り直します。そのため、長いチャットはやり取りごとに高くなります。
予算が尽きたら止める
docker exec -w /home/node/project agent node -e "const calls=[[1000,500],[2000,800],[1500,1200],[3000,2000],[500,100]];let spent=0;const limit=4000000;for(let i=0;i<calls.length;i++){const c=calls[i][0]*200+calls[i][1]*800;if(spent+c>limit){console.log((i+1)+'回目は '+c+' かかるので、止めます。使った合計 '+spent);break}spent+=c;console.log((i+1)+'回目:費用 '+c+'、使った合計 '+spent)}"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
よくある間違い
注意
どの呼び出しも同じ費用だと考える人が多くいます。費用は、入力と出力のトークンが増えると上がり、長いチャットは履歴を送り直します。ループを動かす前に、トークンを数え、上限をつけ、予算を決めましょう。