AI ChatGPT(4)、新APIを使ってみる

プロローグ

3月2日(2023年)にChatGPTのAPIが正式に公開された。
※これまで使えたのは、GPT3.5で、ChatGPTのAPI自身ではなかったのです。

curlコマンド、GAS(GoogleAppsScript)、Pyhton言語から提供されたChatGPTAPIを使用してみます。
なお、PHP言語&Javascript言語についても、紹介します。

API公開時に届いたメールの内容:
記念すべき「 2023年03月02日 03:38」です。


最初の画像は届いた英文そのまま
2番目は、日本語に翻訳した内容です

件名:API の更新: ChatGPT、Whisper、および開発者ポリシー
本文:
本日より、新しい ChatGPT および Whisper API を使用してアプリと製品を構築できます。API と初期のパートナーの使用事例については、こちらをご覧ください。 

ChatGPT API 

新しい Chat API は、ChatGPT 製品で使用されているのと同じモデルである gpt-3.5-turbo を呼び出します。また、チャット以外の多くのユースケースに最適なモデルでもあります。初期のテスターはプロンプトを少し調整するだけで text-davinci-003 から gpt-3.5-turbo に移行しました。Chat API の詳細については、ドキュメント を参照してください。


価格
1,000 トークンあたり 0.002 ドルで、既存の GPT-3.5 モデルよりも 10 倍安くなっています。


モデルの更新
私たちは常にチャット モデルを改善しており、これらの改善を開発者にも提供したいと考えています。gpt-3.5-turbo モデルを使用する開発者は、特定のモデル バージョンを柔軟に選択しながら、推奨される安定したモデルを常に入手できます。

 

たとえば、本日、少なくとも 6 月 1 日までサポートされる「gpt-3.5-turbo-0301」をリリースし、4 月に gpt-3.5-turbo を新しい安定版リリースに更新します。モデルページでは、切り替えの更新情報が提供されます。

ウィスパー API

2022 年 9 月にオープンソース化した音声テキスト変換モデルである Whisper に対するコミュニティの反応に感激しています。今日から、Large-v2 モデルが API を通じて whisper-1 として利用可能になり、最速になります。 、モデルを使用する最も安価で便利な方法。Whisper API の詳細については、ドキュメント を参照してください。

 

料金
API の料金は 0.006 USD/分で、最も近い秒に切り上げられます。

ポリシーの変更とデータの使用方法

過去 6 か月間、API のお客様からフィードバックを収集し、より良いサービスを
提供する方法を理解してきました。次のような多くの具体的な変更を行いました。

API を通じて送信されたデータは、明示的にオプトインしない限り、モデルの
トレーニングやその他のサービスの改善には使用されなくなりました
API ユーザー向けのデフォルトの 30 日間のデータ保持ポリシーを実装し、
ユーザーのニーズに応じてより短い保持期間のオプションを使用する
ローンチ前のレビューを削除 – 自動モニタリングを改善することでロックを解除
データの所有権に関する条件を含む、利用規約と使用ポリシーの簡素化: 
ユーザーはモデルの入力と出力を所有します
Snap、Shopify、Instacart などの初期のパートナーが新しい API を使用して構築
したものを確認し、ChatGPT と Whisper を利用した次世代アプリの構築を
今すぐ開始してください。

 
—OpenAI チーム

ChatGPT APIドキュメント:ここから

○OpenAI社のAPIキーは以下から取得します。
※旧GPT3.5と同じURLです。旧APIで取得したAPIでキーでもそのまま使用可能です。

「curl」コマンドからAPIを使用する

以下はCentOS6で実行した「curl」コマンドです:「Hello!」だけです

curl https://api.openai.com/v1/chat/completions \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -d '{
  "model": "gpt-3.5-turbo",
  "messages": [{"role": "user", "content": "Hello!"}]
}'
※「YOUR_API_KEY」には実際に取得したAPIキー値を指定します。

実行結果は以下です:Hello there! How can I assist you today?

{"id":"chatcmpl-6qtL9eHDIRetdnT57hOMJDlr7Wb31","object":"chat.completion","created":1678063803,"model":"gpt-3.5-turbo-0301","usage":{"prompt_tokens":9,"completion_tokens":12,"total_tokens":21},"choices":[{"message":{"role":"assistant","content":"\n\nHello there! How can I assist you today?"},"finish_reason":"stop","index":0}]}

「GAS」言語からAPIを使用する

GASプロジェクト:
https://script.google.com/home/projects/1N4dlWVdjQSK_3q7vkppufkQrqt7dKV72e79lx5Xiws9ltx6LnGzLtRpb/edit
○特記事項

作成した関数を「WEBアプリ」として「デプロイ」して、他の言語からも利用できるようにします。後述する「GAS関数を公開する」を参照してください。


○事前準備
APIキーをプロジェクトのプロパティとして事前登録します。

○GASコード
【質問内容】:?

function requestChatCompletion() {
  //スクリプトプロパティに設定したOpenAIのAPIキーを取得
  const apiKey = ScriptProperties.getProperty('APIKEY');
  //ChatGPTのAPIのエンドポイントを設定
  const apiUrl = 'https://api.openai.com/v1/chat/completions';
  //ChatGPTに投げるメッセージを定義(ユーザーロールの投稿文のみ)
  const messages = [{'role': 'user', 'content': 'Google Apps Scriptの活用事例を教えてください'}];
  //OpenAIのAPIリクエストに必要なヘッダー情報を設定
  const headers = {
    'Authorization':'Bearer '+ apiKey,
    'Content-type': 'application/json',
    'X-Slack-No-Retry': 1
  };
  //ChatGPTモデルやトークン上限、プロンプトをオプションに設定
  const options = {
    'muteHttpExceptions' : true,
    'headers': headers, 
    'method': 'POST',
    'payload': JSON.stringify({
      'model': 'gpt-3.5-turbo',
      'max_tokens' : 1024,
      'temperature' : 0.9,
      'messages': messages})
  };
  //OpenAIのChatGPTにAPIリクエストを送り、結果を変数に格納
  const response = JSON.parse(UrlFetchApp.fetch(apiUrl, options).getContentText());
  //ChatGPTのAPIレスポンスをログ出力
  console.log(response.choices[0].message.content);
}

「Python」言語からAPIを使用する

○事前準備
    Python用のOpenAIモジュールを、事前にインストールします。

pip install openai

○Pythonコード
    サンプルは以下から参照しました:但し、ここのサンプルコードは、GPT3.5 APIです。
    https://note.com/npaka/n/n0dd2b226e8ae

【質問内容】:その球団の本拠地はどこですか?

import os
os.environ["OPENAI_API_KEY"] = 'YOUR_API_KEY'

import openai

response = openai.ChatCompletion.create(
  model="gpt-3.5-turbo",
  messages=[
    {"role": "system", "content": "あなたは役に立つアシスタントです。"},
    {"role": "user", "content": "2021年の日本シリーズで優勝したのは?"},
    {"role": "assistant", "content": "2021年の日本シリーズで優勝したのは、東京ヤクルトスワローズです。"},
    {"role": "user", "content": "その球団の本拠地はどこですか?"}
  ]
)
print(response["choices"][0]["message"]["content"])
print(response)

○実行結果

【ChatGPTの回答内容】:東京ヤクルトスワローズの本拠地は、東京都文京区の明治神宮野球場です。

東京ヤクルトスワローズの本拠地は、東京都文京区の明治神宮野球場です。
{
  "choices": [
    {
      "finish_reason": "stop",
      "index": 0,
      "message": {
        "content": "\u6771\u4eac\u30e4\u30af\u30eb\u30c8\u30b9\u30ef\u30ed\u30fc\u30ba\u306e\u672c\u62e0\u5730\u306f\u3001\u6771\u4eac\u90fd\u6587\u4eac\u533a\u306e\u660e\u6cbb\u795e\u5bae\u91ce\u7403\u5834\u3067\u3059\u3002",
        "role": "assistant"
      }
    }
  ],
  "created": 1678012848,
  "id": "chatcmpl-6qg5IFlBQEV5cwYELXWhxlnYFuL8h",
  "model": "gpt-3.5-turbo-0301",
  "object": "chat.completion",
  "usage": {
    "completion_tokens": 43,
    "prompt_tokens": 109,
    "total_tokens": 152
  }
}

「PHP」言語からAPIを使用する

○コメント
    Python言語の様に、ライブラリは用意されていないので、curlライブラリ(コマンド)を使用します。

○PHPコード
【質問内容】:その球団の本拠地はどこですか?

 'gpt-3.5-turbo',
        'messages'  => [json_decode($msg, true)]
    );

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, 'https://api.openai.com/v1/chat/completions');
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $response = curl_exec($ch);

    curl_close($ch);
    $response_data = json_decode($response, true);

    if (isset($response_data['choices'][0]['message']['content'])) {
        echo trim($response_data['choices'][0]['message']['content']);

    }
}

$prompt = 'Welcome to ChatGPT.';
send_prompt($prompt);

「Javascript」言語からAPIを使用する

ここでは少々、手抜きで、ChatGPTに教えてもらったコードをそのまま記載します。
まあ、ChatGPTは本当に便利ですね(^_^)。

const apiKey = 'YOUR_API_KEY'; // OpenAIのAPIキーを設定

async function generateResponse(prompt) {
  const apiUrl = 'https://api.openai.com/v1/chat/completions'; // ChatGPT APIのエンドポイント
  const response = await fetch(apiUrl, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'Authorization': `Bearer ${apiKey}`,
    },
    body: JSON.stringify({
      messages: [{ role: 'system', content: 'You are a helpful assistant.' }, { role: 'user', content: prompt }],
    }),
  });
  const data = await response.json();
  return data.choices[0].message.content;
}

// 使用例
const prompt = 'What is the capital of France?';
generateResponse(prompt)
  .then((response) => {
    console.log(response); // ChatGPTの応答を表示する
  })
  .catch((error) => {
    console.error(error);
  });

REST APIを公開する:GAS関数を公開する

実際に使用するには、クロスサイトスクリプティングを考慮する必要があります。
以下などをご参照ください:
https://www.ipa.go.jp/security/vuln/websecurity/cross-site-scripting.html

GAS(GoogleAppsScript)でWEB公開アプリを作成して、他言語でも呼び出せるようにします。
つまり、GAS言語で作成しましたが、PHP/Python言語等からも呼び出しが可能です。
GASのデプロイで、(ウェブアプリ/実行可能API)で「ウェブアプリ」を選択します。
用意する関数は「doGet()」です。
呼び出し方法は以下です:

	https://script.google.com/macros/s/AKfycbySY2WsipNpj442JMS1y45VORdECzI1aVyyu1ua7cXMa0DQbRQ5AskNZf6Kr4lsHAPD/exec?msg=ChatGPTとは

○GAS関数を公開する

○作成したGASの関数「doGet()」は以下です:

/* 
公開API(WEBアプリ)
*/
function doGet(e) {
  //スクリプトプロパティに設定したOpenAIのAPIキーを取得
  const apiKey2 = ScriptProperties.getProperty('APIKEY');
  //ChatGPTのAPIのエンドポイントを設定
  const apiUrl2 = 'https://api.openai.com/v1/chat/completions';
  //ChatGPTに投げるメッセージを定義(ユーザーロールの投稿文のみ)
  const messages = [{'role': 'user', 'content': e.parameter.msg}];

  //OpenAIのAPIリクエストに必要なヘッダー情報を設定
  const headers = {
    'Authorization':'Bearer '+ apiKey2,
    'Content-type': 'application/json',
    'X-Slack-No-Retry': 1
  };
  //ChatGPTモデルやトークン上限、プロンプトをオプションに設定
  const options = {
    'muteHttpExceptions' : true,
    'headers': headers, 
    'method': 'POST',
    'payload': JSON.stringify({
      'model': 'gpt-3.5-turbo',
      'max_tokens' : 1024,
      'temperature' : 0.9,
      'messages': messages})
  };
 //OpenAIのChatGPTにAPIリクエストを送り、結果を変数に格納
  const response = JSON.parse(UrlFetchApp.fetch(apiUrl2, options).getContentText());
  //ChatGPTのAPIレスポンスをログ出力
  console.log(response.choices[0].message.content);
  return ContentService.createTextOutput(response.choices[0].message.content);
}

エピローグ

・ChatGPTのAPIを使用して、Python/GAS/PHP/Javascript言語で、実装してみました。またREST-API(WEB API)も公開してみました。
・次回は、少し趣が変わりますが、VisualStudioCode(VSC)でChatGPTを利用してみます、とても幸せな&素敵な体験ができます。

著者:志村佳昭(株式会社トリニタス 技術顧問)