Upgrade to Pro — share decks privately, control downloads, hide ads and more …

OpenAI Serviceの利用料金を細かく見える化するツール作ってみた

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for Akira Sato Akira Sato
April 14, 2026
88

OpenAI Serviceの利用料金を細かく見える化するツール作ってみた

JAZUG Shizuoka #4にて発表した資料です。
https://jazug.connpass.com/event/383753/

Avatar for Akira Sato

Akira Sato

April 14, 2026

Transcript

  1. 佐藤 陽 / Sato Akira サイオステクノロジー株式会社 Professional Service SL in

    静岡 仕事 Azureクラウド構築 生成AIを活用したアプリ開発 ブログ執筆 / 外部登壇 趣味 運動(ロードバイク/ランニング) 音楽(FUJI ROCK FESTIVAL) 読書(森博嗣/有栖川有栖) @satodayo1115 自己紹介
  2. usage Functions Azure OpenAI Service request prompt_tokens プロンプト内のトークンの数。 completion_tokens 生成された入力候補内のトークンの数。

    reasoning_tokens 推論のためにモデルによって生成されたトークン数 cached_tokens キャッシュされたプロンプト トークンの数。 total_tokens 要求内で使われたトークンの合計数 以下の使用トークン情報を含むがレスポンス返る response stream_options["include_usage"] = True
  3. usage Functions Azure OpenAI Service request prompt_tokens プロンプト内のトークンの数。 completion_tokens 生成された入力候補内のトークンの数。

    reasoning_tokens 推論のためにモデルによって生成されたトークン数 cached_tokens キャッシュされたプロンプト トークンの数。 total_tokens 要求内で使われたトークンの合計数 以下の使用トークン情報を含むがレスポンス返る response stream_options["include_usage"] = True
  4. クイズタイム プロンプトキャッシュにヒットして、入力トークンが大幅 割引になるための条件は次のうちどれでしょう? 1. Systemメッセージの長さが単体で1,024トークン以上あり、かつその内容が過去のリク エストと完全に一致している。 →APIに渡す messages 配列の「一番上から数えた文字列全体」が判定対象です。 Systemメッセージが短くても、問題ありません。

    2. APIに送信するメッセージ配列全体が1,024トークン以上あり、その「先頭から1,024ト ークン」が完全に一致している。 3. メッセージの長さが1,024トークン以上あり、APIリクエスト時に stream_options: {“prompt_cache”: true} を明示的に指定している。 →プロンプトキャッシュは条件を満たせば自動適用されます。 ◎
  5. 見える化 let pricing = datatable(model_name:string, input_per_1m:real, cached_input_per_1m:real, output_per_1m:real) [ ‘gpt-5-mini’,

    39.10, 3.91, 312.80 //KQL実行時に動的に料金を入れる ]; customEvents | where name == 'usage_telemetry' | extend department_id = tostring(customDimensions.department_id) //部署名 | extend model_name = tostring(customDimensions.model_name) //モデル名 | extend prompt_tokens = tolong(customMeasurements.prompt_tokens) //入力トークン | extend cached_tokens = tolong(customMeasurements.cached_tokens) //キャッシュ利用されたトークン | extend completion_tokens = tolong(customMeasurements.completion_tokens) //出力トークン | join kind=leftouter pricing on model_name | extend normal_prompt_tokens = prompt_tokens - cached_tokens | extend input_cost = normal_prompt_tokens / 1000000.0 * input_per_1m | extend cached_input_cost = cached_tokens / 1000000.0 * cached_input_per_1m | extend output_cost = completion_tokens / 1000000.0 * output_per_1m | extend total_cost_jpy = round(input_cost + cached_input_cost + output_cost, 2) | summarize total_cost_jpy = round(sum(total_cost_jpy), 2) by timestamp = bin(timestamp, 1h), department_id | order by timestamp asc
  6. まとめ 今回作ってみたもの • Functionsでのストリーミングトークン抽出アプリ • KQLを使ったコスト表示ダッシュボード できるようになったこと • Cost Managementの遅延を待たない、秒単位でのコスト把握

    • 「アプリ単位・部門単位」での正確なコスト表示 …とはいえ、RAGやエージェントアプリで本格導入を考えると大変 素直にLangSmith や Langfuse などのLLMOpsツールを使った方が良い気がします。