OpenAIからChatGPTとWhisperに関するAPIがリリースされたのでドキュメントを読み解いてみた

2023.03.02

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんちには。

データアナリティクス事業本部 インテグレーション部 機械学習チームの中村です。

先日、OpenAIからChatGPTとWhisperに関するAPIがリリースされました。

この記事では発表やAPIドキュメントからポイントとなりそうな部分を抽出して紹介したいと思います。

1次情報は以下を参照ください。

冒頭まとめ

冒頭で気付いたポイントを列挙しておきます。

  • ChatGPT API
    • 入力としてテキスト(content)以外にrolemessagesに記述(複数可能)
    • 入力にroleを用いた複数のmessageを与えることで、ある程度内容のコントロールが可能
    • 会話の履歴は自動では参照しないため、サービスとしてのChatGPTと同様の動きをさせるには、過去の会話を入力する必要があると推察
    • 課金は入力出力合計のトークン単位($0.002/1ktoken)
    • トークンは単純な単語単位とは異なる。また入力トークンも課金に含む
    • 入力と出力は合計で4096トークンまでしか対応できない
    • 入力トークン数を見積もるためのツールは提供されており、出力トークン数はパラメータ側で制御可能
    • Dedicated インスタンスも存在するが利用数が多いユーザ向け
  • Whisper API
    • トランスクリプション(書き起こし)とトランスレーション(翻訳)は別のエンドポイント
    • 入力は25MBまでのため、長さによっては音声のみ、圧縮フォーマットを使用するなどの工夫が必要
    • 課金はファイルサイズではなく、時間長で決まる($0.006/分、1時間の会議で約50円程度)
    • それでも難しい場合は、Pydubなどの別ライブラリで区間切り出しを検討する必要あり
    • Whisperにもpromptがあり、句読点の有無やフィラーの有無を制御できる用途が想定
    • タイムスタンプなどの詳細出力するためには、response_formatをverbose_jsonにする必要がある
  • その他
    • Fine-tuningについては双方未対応
    • データ利用ポリシーの更新

それでは、ChatGPT、Whisperの順に見ていきます。

ChatGPT API

エンドポイント

以下がAPIのエンドポイントとなります。

https://api.openai.com/v1/chat/completions

もともとテキスト生成用に以下のcompletionsエンドポイントがありましたが、それとは微妙に違うためご注意ください。

https://api.openai.com/v1/completions

リクエスト例

HTTPリクエストの例は以下です。テキスト生成ではpromptでしたが、その代わりにmessagesという形で入力を与えます。

(以降、OPENAI_API_KEYという環境変数にAPIキーを設定している前提です)

curl https://api.openai.com/v1/chat/completions
  -H "Authorization: Bearer $OPENAI_API_KEY"
  -H "Content-Type: application/json"
  -d '{
  "model": "gpt-3.5-turbo",
  "messages": [{"role": "user", "content": "What is the OpenAI mission?"}]
}'

messagesには以下のように複数のテキストを含めることができます。

curl https://api.openai.com/v1/chat/completions
  -H "Authorization: Bearer $OPENAI_API_KEY"
  -H "Content-Type: application/json"
  -d '{
  "model": "gpt-3.5-turbo",
  "messages": [{"role": "user", "content": "What is the OpenAI mission?"},{"role": "user", "content": "Who won the world series in 2020?"},{"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},{"role": "user", "content": "Where was it played?"}]
}'

roleには、system, user, assistantのいずれかを指定することが可能で、これにより以下を可能としています。

  • アシスタントの行動をある程度設定する
  • 会話履歴を含めることで、過去の履歴を含めたニュアンスで回答する

ChatGPTをWebブラウザから使用していた時は、会話履歴を把握しながら回答してくれていました。

当然ですが、APIとして使用する時は組み込む開発者側で過去の会話履歴を管理する必要がありそうです。

またリクエストについては、PythonとNode.jsなどでライブラリが提供されているため、そちらで実行することも可能です。

ライブラリについての詳細は以下を参照ください。

レスポンス例

レスポンスは以下のように返されます。

{
  "id": "chatcmpl-6p5FEv1JHictSSnDZsGU4KvbuBsbu",
  "object": "messages",
  "created": 1677693600,
  "model": "gpt-3.5-turbo",
  "choices": [
    {
      "index": 0,
      "finish_reason": "stop",
      "messages": [
        {
          "role": "assistant",
          "content": "OpenAI's mission is to ensure that artificial general intelligence benefits all of humanity."
        }
      ]
    }
  ],
  "usage": {
    "prompt_tokens": 20,
    "completion_tokens": 18,
    "total_tokens": 38
  }
}

prompt_tokensが入力トークン数であり、completion_tokensが出力トークン数です。

これらが請求額のもとになります。

トークンとは何か

ここでトークンとは何かについて見ていきます。

ChatGPTを利用するにあたっては、多少はトークンというものを意識する必要があります。その理由は以下です。

  • 課金はトークン単位で実施される
  • トークンの総数がモデルの最大値以下でなければならない
    • 例えば、gpt-3.5-turbo-0301モデルでは4096トークン

トークンは単純な単語単位等ではなく、例えば以下のようにトークン分割されます。

"ChatGPT is great!"
["Chat", "G", "PT", " is", " great", "!"]

また入力トークンと出力トークンの両方が、これらの数量にカウントされます。

動作の具体例としては以下のようになります。

  • 入力に10トークンを使用し、メッセージ出力で20トークンを受け取った場合、30トークンが請求される
  • 入力に4090トークンを使用した場合、出力は6トークンで打ち切られる

これらのトークン(入力側)がどの程度の数になるかをAPIコール前に知りたい場合は、公式ドキュメントに記載の通り以下のNotebookのコードが参考になりそうです。

出力側のトークンは、リクエストにmax_tokensを含めることで制限できます。

詳細は以下も参照ください。

トークンの上限についての情報から、ChatGPTをブラウザで使用する場合にRegenerateをできていたのは、ある程度入力の過去履歴を打ち切っていたということが推察されます。

ですので開発者自身で組み込む場合はここも考慮事項になりそうですね。

モデルについて

現在は、gpt-3.5-turbogpt-3.5-turbo-0301が指定可能です。

gpt-3.5-turbo-0301gpt-3.5-turboのスナップショットとなっており、gpt-3.5-turboを指定すれば最新版を追従して使える形となります。

逆にモデルを固定化したい場合は、gpt-3.5-turbo-0301のように指定すればOKなようです。

またトレーニングデータについては2021年9月までの情報となっているため、最新の情報を参照できない可能性がある点は課題として残っています。

ここは今後のアップデートに大いに期待ですね。以下からモデル一覧を確認できますので、気になる方はウォッチしておきましょう。

出力のランダム性の制御

出力のランダム性を制御するためのパラメータとしてtemperaturetop_pがあります。

双方とも高く設定すると出力がだんだんランダムとなる仕組みです。

両方を同時に設定することは推奨されていないようです。

APIパラメータの詳細

その他にもいくつかパラメータがありますので、以下もご参照ください。

料金

トークンの合計量で決まります。現在は1,000トークンあたり$0.002となっているようです。

以下の公式情報もご参照ください。

Dedicated インスタンス

ChatGPTは通常はユーザ間でインスタンスが共有されて処理されますが、Dedicated インスタンス(専用インスタンス)も提供されるようです。

発表によれば、Dedicated インスタンスは料金体系も異なり、計算インフラストラクチャの割り当てを期間ごとに支払う形となるようです。

また様々なオプションの設定も可能となっており、例えば以下のようなものも挙げられています。

  • 長いコンテキスト制限などの機能を有効にするオプション
  • モデルスナップショットを固定する機能

目安としては、1日あたり4億5000万トークンを超えて稼働する場合に、経済的なメリットが出てくるようです。

さらに、開発者のワークロードをハードウェアのパフォーマンスに対して直接最適化することができるため、共有インフラストラクチャと比較してコストを劇的に削減することができるようですね。

こちらのDedicated インスタンスに関しての詳細は、別途個別にOpenAIまで問い合わせる必要があります。

Whisper API

Whisper APIは、トランスクリプション(音声を文字に書き起こす)とトランスレーション(+英語への翻訳)をエンドポイントから利用可能となっています。

エンドポイント

以下がAPIのエンドポイントとなります。

https://api.openai.com/v1/audio/transcriptions

リクエスト例

以下がリクエスト例となります。(トランスクリプションの場合)

curl https://api.openai.com/v1/audio/transcriptions \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -H "Content-Type: multipart/form-data" \
  -F model="whisper-1" \
  -F file="@/path/to/file/openai.mp3"

また翻訳の場合は以下になります。

curl https://api.openai.com/v1/audio/translations \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -H "Content-Type: multipart/form-data" \
  -F model="whisper-1" \
  -F file="@/path/to/file/openai.mp3"

レスポンス例

レスポンス例は以下のようになります。

{
  "text": "Imagine the wildest idea that you've ever had, and you're curious about how it might scale to something that's a 100, a 1,000 times bigger..."
}

デフォルトではタイムスタンプなどの詳細が出力されないため、詳細を見たい場合はresponse_formatをverbose_jsonにする必要があります。

対応フォーマット

以下の入力ファイルタイプに対応しています。

  • MP3、MP4、MPEG、MPGA、M4A、WAV、WebM

また現在、ファイルのアップロードは25MBに制限されています。

そのため25MB以上のデータを処理したい場合は、圧縮フォーマットを使用するかPydubなどのライブラリを使って音声を分割する必要がありそうです。

(Pydub自体はとても便利で、無音判定を自動で実施して分割するなどが可能です。今後情報をブログで紹介したいと思います)

プロンプト

Whisperにおいてもpromptパラメータを使用することで、出力されるテキストに影響を与えることができるようです。

以下のようなシーンが想定されています。

  • 分割されてしまった音声の前のセグメントの書き起こし結果をプロンプトに含めて精度を向上させる
  • 書き起こし結果は句読点がスキップされることが多いため、プロンプトに句読点を含めることで、句読点を出力させる
  • 「えー…」などのフィラーも同様にスキップされることが多いため、プロンプトにフィラーを含めることで、フィラーも出力させる

ここら辺が制御できるのはとても便利そうですね。

言語の指定

Whisper自体は言語を自動で判定することが可能ですが、languageパラメータを指定することでこれを手動で指定することも可能です。(transcriptionsのみ)

languageはISO-639-1の言語コードで指定します。

詳細は下記を参照ください。

モデル

モデルには現在whisper-1のみが指定可能となっており、この指定でWhisperのlarge-v2が使用されます。

whisper-lではないかと最初おもいましたがwhisper-1でOKです)

Whisper large-v2についてはリポジトリを参照ください。

出力のランダム性の制御

出力のランダム性を制御するためのパラメータとしてtemperatureがあります。

こちらはChatGPTと同様、高く設定すると出力がだんだんランダムとなる仕組みです。

APIパラメータの詳細

その他のパラメータについては、以下をご参照ください。

料金

入力音声データの時間長あたりで決まります。現在は1分あたり$0.006となっているようです。

会議1時間あたり、$0.36ですので現在のレートでは50円程度となります。

以下の公式情報もご参照ください。

Pythonでの実行例

ここまではAPI仕様について説明してきましたが、最後にPythonライブラリで実行する方法を記載しておきます。

まずはpipでopenaiをインストールします。

pip install openai

APIキーはOPENAI_API_KEYという環境変数に設定しておけば動作させることができます。

ChatGPTを使用する際は以下のような形です。

completion = openai.ChatCompletion.create(
  model="gpt-3.5-turbo",
  messages=[{"role": "user", "content": "Tell the world about the ChatGPT API in the style of a pirate."}]
)
print(completion)

Whiperを使用する場合は以下となります。

import openai
file = open("/path/to/file/openai.mp3", "rb")
transcription = openai.Audio.transcribe("whisper-1", f)
print(transcription)

その他

Fine-tuningについて

現在、OpenAIのAPIでFine-tuningできるのはGPT-3系のみとなっており、ChatGPTのgpt-3.5-turboとWhisperについては提供されていないようです。

ここは今後の動きにも期待したいと思います。

データ利用に関するポリシー

APIで送信するデータについて、どのように利用されるかのポリシーについても併せて3/1に更新されていますのでご参照ください。

まとめ

いかがでしたでしょうか。

API仕様を細かく見ていくと、単純にレスポンスを得るだけでなく意図通りの出力を得るための調整どころについても理解することができました。

またChatGPTをWebブラウザから使用していただけでは分からない制限なども明らかになりました。

これにより組み込み時に必要そうな考慮事項を把握できたのは良かったと思います。

今後APIをお使いになられる方の参考になれば幸いです。