[Flutter] ChatGPTの始め方とAPIの利用方法

ChatGPTはAPIを持っています。これを使うと自分のアプリからChatGPTを呼び出してAIとのやり取りが行えるようになります。

私も自作アプリNovel editorでChatGPTのAPI利用を実装しています。その時に調べた内容をここにまとめてみました。

ChatGPTのアカウント登録

API利用の前提としてChatGPTのアカウント登録とシークレットキーの生成が必要です。

ChatGPTのサイトでSign upでアカウント登録に入ります。

次にメールアドレスを入力してContinueボタンを押します。

パスワード入力してContinueボタンを押します。

メールアドレスの確認を求められますので、入力したメールアドレスの受信トレイを確認してください。

「OpenAI – Verify your email」のようなタイトルのメールが来ているので、メールを開いてVerify email addressボタンを押します。

すると以下のようにメールアドレスの確認が取れたというページが表示されますので、登録完了です。

見づらいですが、上記ページの「login」リンクをクリックすると、ログインページに遷移するのでログインします。

ログイン後に名前と生年月日を入力してContinueします。

SMS認証もあるため電話番号を入力してSend codeします。

受信したSMSメッセージに表示されている6桁のコードを入力して完了です。

ChatGPTのページが表示されます。

シークレットキーの生成

次にChatGPTを外部から扱えるようにするためのシークレットキーを生成します。

API keysのページを表示します。

Create new secret keyボタンをクリックします。

Create secret keyボタンをクリックします。すると、以下のようにシークレットキーが生成されます。

コピーボタンを押してこのシークレットキーを保存してください。

なお、このシークレットキーは二度と表示されないため手元に残しておく必要があります。その場合は、第三者に見られないような場所に保存してください。(APIを通じてただ乗りされてしまい、有料サブスクリプション契約している場合は従量課金制になるので高額請求にもつながってしまいます)

APIの利用

APIを通じてChatGPTとチャットをするには、まずモデルの一覧を取得し、モデルを指定してチャットを行うという2つの手順が必要です。

モデル一覧の取得

モデルとは大規模言語モデルを指していて、機械学習や深層学習を経て作成されたAIの頭脳的なものを指しています。これはChatGPTとの契約形態で利用できるものが異なっており、例えば最新版の「GPT-4」はChatGPTとの有料サブスクリプションを契約していないと利用できなかったりします。

ChatGPTとAPIを通じてチャットする場合はこのモデルを指定する必要があります。そのため自分のアカウントでどのモデルが利用可能なのかを調べます。

ここではcurlコマンドを利用して一覧を取得する例を紹介します。(curlコマンドはWindows10から標準でインストールされていますが、ない場合はGnuWin32やMinGWを導入して利用可能にしてください)

curl https://api.openai.com/v1/models -H "Authorization: Bearer xxx"
  • xxxの部分に前段で取得したシークレットキーを入力してください

すると以下のようなjsonのレスポンスが受信できます。私は無料枠で取得しているのでGPT4はありませんでしたが、GPT3.5Turboは利用できるようです。

{
  "object": "list",
  "data": [
    :
    {
      "id": "gpt-3.5-turbo",
      "object": "model",
      "created": 1677610602,
      "owned_by": "openai",
      "permission": [
        {
          "id": "modelperm-zy5TOjnE2zVaicIcKO9bQDgX",
          "object": "model_permission",
          "created": 1690864883,
          "allow_create_engine": false,
          "allow_sampling": true,
          "allow_logprobs": true,
          "allow_search_indices": false,
          "allow_view": true,
          "allow_fine_tuning": false,
          "organization": "*",
          "group": null,
          "is_blocking": false
        }
      ],
      "root": "gpt-3.5-turbo",
      "parent": null
    },
    :
  ]
}

利用できるモデルの種類によって得意な分野が異なるようでして、それぞれの内容は「ChatGPT モデル 種類」で検索すると分かると思います。

AIとチャットしたい場合は上記のサンプルにあるようなgpt-3.5-turboでいいと思います。

チャット

curl https://api.openai.com/v1/chat/completions ^
 -H "Content-Type: application/json" ^
 -H "Authorization: Bearer xxx" ^
 -d "{\"model\": \"gpt-3.5-turbo\",\"messages\": [{\"role\": \"user\", \"content\": \"Hello!\"}]}"
  • xxxの部分に前段で取得したシークレットキーを入力してください
  • -dが「モデルを指定してチャットを送る」部分となります
    • modelに前段で取得して「利用可能なモデル」から使いたいモデルのidを指定します
    • messagesにはroleとcontentがあり、roleは利用者であればuserを、contentにはAIに投げかけたい言葉を入力します

応答はjsonで返ってきます。

{
  "id": "chatcmpl-xxx",
  "object": "chat.completion",
  "created": 1691277483,
  "model": "gpt-3.5-turbo-0613",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "Hello! How can I assist you today?"
      },
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 9,
    "completion_tokens": 9,
    "total_tokens": 18
  }
}

細かい説明はChatGPTのAPIリファレンスを見ると分かりますが、choicesにあるmessageのroleが「assistant」になっているところのcontentがAIの応答となっています。

上記の例では私が「Hello!」と投げかけると「Hello! How can I assist you today?」と返してきてくれました。

これでAPIによるChatGPTとのAIチャットができたということになります。Pythonであればpip install openaiでインストールされるモジュールで利用できますし、上記のようにhttps通信を使ったものであれば言語関係なく(curlを呼び出してもいいし)利用できるので、様々なアプリに導入できると思います。

Dartでの利用

pubspec.yamlでhttpパッケージを導入して利用します。

import 'package:http/http.dart' as http;
import 'dart:convert';

// DartPadに貼り付けるとそのまま動作します(シークレットキーはご自分のをお使いください)
void main() async {
  // モデル一覧の取得
  http.Response resModels = await http.get(
    Uri.parse('https://api.openai.com/v1/models'),
    headers: {
      'Authorization': 'Bearer xxx',
    },
  );
  print(json.decode(resModels.body));

  // AIとチャット
  http.Response resChat = await http.post(
    Uri.parse('https://api.openai.com/v1/chat/completions'),
    headers: {
      'Authorization': 'Bearer xxx',
      'Content-Type': 'application/json',
    },
    body: json.encode(
      {
        'model': 'gpt-3.5-turbo',
        'messages': [
          {
            'role': 'user',
            'content': 'Hello!',
          }
        ],
      },
    ),
  );
  
  print(json.decode(resChat.body));
}
  • モデル一覧はget、チャットはpostで呼び出しています
  • postで投げるデータも応答もjsonなのでjsonエンコード・デコードして利用します

ポイント

会話を続ける

ChatGPTのページで行うチャットは会話を続けることができます。APIでどのように実現するのか調べたところ、「リクエストにこれまでの会話を含める」というものでした。

curlでの例は以下です。

# 最初の問いかけ
curl https://api.openai.com/v1/chat/completions ^
 -H "Content-Type: application/json" ^
 -H "Authorization: Bearer xxx" ^
 -d "{\"model\": \"gpt-3.5-turbo\",\"messages\": [{\"role\": \"user\", \"content\": \"Hello!\"}]}"

# 以下が返される
# role: assistant, content: Hello! How can I assist you today?

# 次の問いかけ
curl https://api.openai.com/v1/chat/completions ^
 -H "Content-Type: application/json" ^
 -H "Authorization: Bearer xxx" ^
 -d "{\"model\": \"gpt-3.5-turbo\",\"messages\": [{\"role\": \"user\", \"content\": \"Hello!\"}, {\"role\": \"assistant\", \"content\": \"Hello! How can I assist you today?\"}, {\"role\": \"user\", \"content\": \"Thank you!\"}]}"

これで会話を続けられますが、注意するポイントがあります。

APIの課金制度は従量課金制でトークンという単位により課金が行われます。1000トークンあたり0.002ドルだと言われており、英語だと1単語が1トークン、日本語の場合は1文字が1トークンとして扱われているようです。これまでの会話を含めるということはそのトークンが増えていくということになるため、会話を続ければ続けるほどトークンが消費されていくということになります。

制限

こちらからの投げかけ(プロンプト)と応答は2048トークンまでの上限という制限がかかっているそうです。

また、1分あたりにやり取りできるトークンの制限もありました。無料ユーザーは20分で40,000トークンだそうです。

任意パラメータ

チャット時に任意のパラメータを追加できます。その中でもチャットの回答に関わってくるtemperatureとtop_pのパラメータがあり、それぞれ低い値ほど再現性のある回答になり、高い値ほど多様な回答になるというものでした。

  • temperature
    • 0.0~2.0の間で指定可能(デフォルトは1.0)
  • top_p
    • 0.0~1.0の間で指定可能(デフォルトは1.0)

門外漢の私にはさっぱりな内容ですが、こちらの「ChatGPTのTop PやTemperatureについて少し知ってみよう」に詳しい解説があったのでご覧ください。temperatureは回答の揺らぎを指定するもの、top_pは回答に含まれる中でありえない語の排除をするかどうか、のような理解でしょうか。

そちらの記事にもある通り、temperatureとtop_pの両方を同時に変えてリクエストすることは好ましくないようです。

HTTPステータスコード

APIのリクエスト時に返されるHTTPステータスコードの意味はこちらにありました。

実際のプログラムでは下記のHTTPステータスコードをチェックしてエラー処理などを行う必要があると思います。

  • 200
    • 成功なので想定しているレスポンスが得られます
  • 401
    • Invalid Authentication、Incorrect API key provided、You must be a member of an organization to use the API
    • 上記3パターンの認証エラーが発生
  • 429
    • Rate limit reached for requests、You exceeded your current quota, please check your plan and billing details
    • リクエスト制限に引っかかったというエラーです
  • 500
    • The server had an error while processing your request
    • サーバー側でのエラーです
  • 503
    • The engine is currently overloaded, please try again later
    • リクエストを処理できていないエラーです

以下は試しに無効なシークレットキーでモデル一覧をリクエストした時のレスポンス例です。

{
  "error": {
    "message": "Incorrect API key provided: ****************************************. You can find your API key at https://platform.openai.com/account/api-keys.",
    "type": "invalid_request_error",
    "param": null,
    "code": "invalid_api_key"
  }
}

以上がChatGPTのAPI使用方法でした。

参考