valid,invalid

関心を持てる事柄について

OpenAIのテキスト生成(GPT-3)APIをプログラムから呼び出す方法と料金

ChatGPTやDALL・E2で有名なOpenAIのAPIを呼び出す方法について*1

一般的なWebサービスと大して変わらず、以下の2ステップで行う。

  1. API Keyを取得
  2. API Keyを用いてAPIを呼び出す

1. API Keyを取得

https://platform.openai.com/ からsign upし、 https://platform.openai.com/account/api-keys からAPI Keyを発行する。

2. APIを呼び出す

利用できるAPIの一覧や使い方は以下にまとまっている。

platform.openai.com

呼び出すのはプログラムはなんでもよいが、ドキュメントにはcurl, Python, Node.jsのサンプルが記載されている。

折角なので公式ドキュメントに記載のないRubyを使ってみたいと思っていたら、ruby-openai gemがあったので試す。

completion API

ChatGPT的なテキスト認識・応答を実行する場合はcompletion APIを使う。テキスト生成にはGPT-3ベースのtext-davinci-003というモデルを指定する。ドキュメントによればこれは現時点で最も有能なモデルとのことだが後述する従量課金モデルにおける単価も高い。求める速度や学習データや金額を加味して好きなモデルを選べば良い。

# ai.rb
require 'bundler/inline'

gemfile do
  source 'https://rubygems.org'
  gem 'ruby-openai'
end

client = OpenAI::Client.new(access_token: ENV['API_TOKEN'])

# 指定できるパラメーターは以下を参照
# https://platform.openai.com/docs/api-reference/completions/create
response = client.completions(
 parameters: {
   model: "text-davinci-003",
   prompt: 'RubyでOpenAIのAPIを呼び出す方法は?',
   max_tokens: 2000
  }
)

puts response
$ API_KEY=<YOUR KEY> ruby ai.rb

実行すると以下のようなレスポンスが返る。

{"id"=>"cmpl-6iZDl05LwFazAWZVfxC499epDUbKS",
 "object"=>"text_completion",
 "created"=>1676079841,
 "model"=>"text-davinci-003",
 "choices"=>
  [{"text"=>
     "\n\nOpenAIのAPIを呼び出すためにRubyでは、OpenAIのRubyクライアントを使用する方法がおすすめです。OpenAI Ruby クライアントは、OpenAIのAPIへのアクセスを簡単に行うためのライブラリです。\nOpenAI Ruby クライアントを使用するには、まずGemのインストールを行います。以下のコマンドを実行します。\n\n```\n$ gem install openai\n```\n\n次に、APIを使用するための定義を行います。クライアントのインスタンスを作成し、利用するAPIのキーや署名を設定します。\n\n```ruby\nrequire 'openai'\n\nopenai = OpenAI::Client.new(\n  api_key: 'あなたのAPIキー',\n  app_signature: 'あなたのアプリ署名'\n)\n```\n\nAPIを実際に使用するときは、各APIのエンドポイントとパラメータを使ってopenaiオブジェクトのメソッドを実行します。例えば、OpenAI GymのAPIを使用する場合は、以下のようにオプションのパラメータとともにAPIを使うことができます。\n\n```ruby\nresource = openai.gym.create_environment(\n  environment_id: 'my_env',\n  parameters: {'n_actions': 4}\n)\n```",
    "index"=>0,
    "logprobs"=>nil,
    "finish_reason"=>"stop"}],
 "usage"=>{"prompt_tokens"=>21, "completion_tokens"=>473, "total_tokens"=>494}}

なお、使用制限を超えたとのエラーが出ることがある。

 {"error"=>
   {"message"=>
     "You exceeded your current quota, please check your plan and billing details.",
    "type"=>"insufficient_quota",
    "param"=>nil,
    "code"=>nil}}

自分の場合、どうやら過去に登録したときの無料枠をすでに使い切っていたらしく、 https://platform.openai.com/account/billing/overview からクレジットカードを登録して再度試したらうまくいった。

料金について

https://openai.com/api/pricing/ を一通り読むと良い。最新の情報は必ず公式ドキュメントを参照すること。

従量課金モデルとなっており、画像は生成枚数、自然言語処理においてはtokenの量に比例する。tokenとは「自然言語処理に使われる単語の断片」とのこと。

英文では1 tokenは約4文字、0.75ワードに相当すると説明されている。使いたい/生成したいテキストの具体的なtoken数を知りたければInteractive tokenizerで確認できる。

確かみてみろ!

使いすぎが怖い場合は自身が許容できる課金額の上限を https://platform.openai.com/account/billing/limits で制限しておくとよい。ハードリミット(API利用停止)とソフトリミット(メール通知)を設定できる。

弱気の$10.00上限

また、APIコール時にmax_tokensを指定しておけば一回のリクエストで爆発的にtokenを消費することを防げる。


2023-02-11時点で$0.0200 /  1,000 tokens。

上記のスクリプトで消費したのが約500 tokensなので、10,000回呼び出せば$100ぐらいになる。用途にもよるがサービスに組み込むレベルだとかなり高額になりそう。

*1:正確にはChatGPTではなく類似する別のGPT-3のモデル(Davinci等)を利用することになる