プロローグ
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の関数「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を利用してみます、とても幸せな&素敵な体験ができます。
著者:志村佳昭(株式会社トリニタス 技術顧問)