【最新速報】ChatGPT APIの「概要と使い方」(Pythonコード付き)
はじめまして、フリーランスのますみです!
本日(アメリカ:2023年3月1日、日本:2023年3月2日)に公開された「ChatGPT APIの概要と使い方」を解説します!
この記事を通して、「ChatGPTのAPIをシステムに組み込みたい」という方の役に立てますと幸いです!
また、ChatGPTやAPIについてまだ詳しくない方は、こちらを先にご覧ください◎
ChatGPT APIの概要
本日(日本時間)ChatGPTのAPIがついに公開されました🎉
待ちに待った発表ですね😆
注目ポイント
今回公開されたAPIで注目すべきポイントは、3つあります!
1. モデル最適化による「コストカット」
まず、OpenAIはモデルの最適化を行い、2022年12月のモデルと比べて、「90%のコストカット」を実現したようです。
そのため、APIの価格もこれまで文章生成において、もっとも品質の高かったtext-davinci-003
というモデルの「1/10の価格」である「$0.002 / 1K tokens」に設定されています。
2. APIにおける「データ利用規約」の変更
次に、APを用いてOpenAIへ送られていたデータの利用規約が「オプトアウト形式からオプトイン形式」に変更されました。
- 「オプトアウト形式」とは、「ユーザーから明示的にデータ利用をしないでください」と要求されなければ、データが利用される仕組みです。
- 「オプトイン形式」とは、「ユーザーから明示的にデータ利用をしてもいいですよ」という承諾を得ない限り、データが利用されない仕組みです。
すなわち「オプトイン形式に変更された」ということは、これまではAPI経由で送られていたデータは、デフォルトで学習データに用いられていましたが、これからは「デフォルトとして学習データに使われなくなった」ということです。
3. APIにおける「データ保管規約」の変更
最後に、オプトイン形式への変更に伴い、API経由で送信されたデータは「30日間保管された後、削除されるという保管規約へ変更」されました。
ここで、30日間保管される目的は「不正利用や誤用を防ぐためのモニタリング」に使うためだそうです。
「結局OpenAIの人たちに見られてしまう」という点は変わらないようです。
また、「法的な要求」を受けた場合は、データの保管期間は延長される可能性があります。
ChatGPT APIの使い方
リクエストパラメータについて
Pythonで実行する前に、前提知識として「ChatGPT APIにおけるリクエストパラメーター」について説明します。
結論から言うと、ChatGPTのAPIでは、「ロールとコンテンツが格納されたリスト」をパラメーターとして指定してリクエストを送ります。
ロール(role)は、「system, user, assistant」の3種類から選ぶことができます。
- system:ChatGPTに対して「どのように振る舞ってほしいか?」や「どのような状況下か?」などの「条件を指示」をするロール。
- user:ユーザーからの「プロンプト(指示や質問)」を送るロール。
- assistant:これまでのChatGPTが生成した「返答の履歴」を共有するロール。
「system」が行うような条件付けは、「user」から指示することも可能ですが、「システム側で設定した条件」か「ユーザーが設定した条件」かを判別するために「system」というロールが存在すると考えられます。
もしも「system」というロールがないと、システム側で指定した条件がチャット上に表示されてしまいますよね。
結論として、ChatGPTのAPIでは、「この3つの中のいずれかのロールにコンテンツを紐付けたリスト」をリクエストパラメーターとして指定します。
Pythonでの実行方法
それでは、Pythonで実際に実行してみましょう。
1. 環境構築
まずpip install openai
とシェルで実行して、openai
のライブラリをインストールします。
% pip install openai
2. APIキーの設定
Pythonのファイル上で、openai
をインポートします。
そして、APIキーを設定します(APIキーの発行方法はこちらを参照)。
import openai
openai.api_key = "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
3. モデルの指定
次に、Chatを生成するAPIのコードを記述します。
ChatGPTのAPIは、「gpt-3.5-turbo」と「gpt-3.5-turbo-0301」というモデルもあります。
-
gpt-3.5-turbo
:最新モデルに自動更新されていくモデル。 -
gpt-3.5-turbo-0301
:3月1日時点で固定化されたモデル。
モデルの出力の再現性を重視して、暗黙的なモデル更新がされたくない場合は、「0301」のモデルを使うことをオススメします。
ここでは、「gpt-3.5-turbo」を用います。
import openai
openai.api_key = "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
+ res = openai.ChatCompletion.create(
+ model="gpt-3.5-turbo",
+ )
4. messagesの記述
次に、messagesを書いていきます。
ここでは、systemから「日本語で返答してください。」という条件をつけたいと思います。
そして、「What is AI?」という風に英語で質問をします。
import openai
openai.api_key = "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
res = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
+ messages=[
+ {
+ "role": "system",
+ "content": "日本語で返答してください。"
+ },
+ {
+ "role": "user",
+ "content": "What is AI?"
+ },
+ ],
)
すると、次のような返答が返ってきました。
「Unicodeエスケープシーケンス」のデータが返ってきており、\u
の表記になっています。
assistantからの日本語の返答が返ってきていそうな予感。。。
{
"choices": [
{
"finish_reason": "stop",
"index": 0,
"message": {
"content": "AI\u3068\u306f\u3001\u4eba\u5de5\u77e5\u80fd(artificial intelligence)\u306e\u3053\u3068\u3067\u3059\u3002\u30b3\u30f3\u30d4\u30e5\u30fc\u30bf\u30fc\u3084\u30ed\u30dc\u30c3\u30c8\u306a\u3069\u306b\u4eba\u9593\u3068\u540c\u3058\u3088\u3046\u306b\u601d\u8003\u30fb\u5224\u65ad\u30fb\u5b66\u7fd2\u306a\u3069\u306e\u80fd\u529b\u3092\u4e0e\u3048\u308b\u6280\u8853\u3084\u5206\u91ce\u3092\u793a\u3057\u307e\u3059\u3002AI\u6280\u8853\u306f\u3001\u69d8\u3005\u306a\u5206\u91ce\u3067\u5fdc\u7528\u3055\u308c\u3066\u304a\u308a\u3001\u81ea\u52d5\u904b\u8ee2\u8eca\u3001\u8a00\u8a9e\u51e6\u7406\u3001\u753b\u50cf\u8a8d\u8b58\u3001\u533b\u7642\u306a\u3069\u3001\u79c1\u305f\u3061\u306e\u751f\u6d3b\u306b\u591a\u5927\u306a\u5f71\u97ff\u3092\u4e0e\u3048\u3066\u3044\u307e\u3059\u3002",
"role": "assistant"
}
}
],
"created": 1677718151,
"id": "chatcmpl-xxx",
"model": "gpt-3.5-turbo-0301",
"object": "chat.completion",
"usage": {
"completion_tokens": 149,
"prompt_tokens": 28,
"total_tokens": 177
}
}
日本語が返ってきているかを確認するために、contentのデータを直接Printしてみましょう。
import openai
openai.api_key = "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
res = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{
"role": "system",
"content": "日本語で返答してください。"
},
{
"role": "user",
"content": "What is AI?"
},
],
)
+ print(res)
+ print(res["choices"][0]["message"]["content"])
すると、次のように日本語でAIの説明をしていることがわかりました。
{
"choices": [
{
"finish_reason": "stop",
"index": 0,
"message": {
"content": "AI\u3068\u306f\u3001\u4eba\u5de5\u77e5\u80fd(artificial intelligence)\u306e\u3053\u3068\u3067\u3059\u3002\u30b3\u30f3\u30d4\u30e5\u30fc\u30bf\u30fc\u3084\u30ed\u30dc\u30c3\u30c8\u306a\u3069\u306b\u4eba\u9593\u3068\u540c\u3058\u3088\u3046\u306b\u601d\u8003\u30fb\u5224\u65ad\u30fb\u5b66\u7fd2\u306a\u3069\u306e\u80fd\u529b\u3092\u4e0e\u3048\u308b\u6280\u8853\u3084\u5206\u91ce\u3092\u793a\u3057\u307e\u3059\u3002AI\u6280\u8853\u306f\u3001\u69d8\u3005\u306a\u5206\u91ce\u3067\u5fdc\u7528\u3055\u308c\u3066\u304a\u308a\u3001\u81ea\u52d5\u904b\u8ee2\u8eca\u3001\u8a00\u8a9e\u51e6\u7406\u3001\u753b\u50cf\u8a8d\u8b58\u3001\u533b\u7642\u306a\u3069\u3001\u79c1\u305f\u3061\u306e\u751f\u6d3b\u306b\u591a\u5927\u306a\u5f71\u97ff\u3092\u4e0e\u3048\u3066\u3044\u307e\u3059\u3002",
"role": "assistant"
}
}
],
"created": 1677718151,
"id": "chatcmpl-xxx",
"model": "gpt-3.5-turbo-0301",
"object": "chat.completion",
"usage": {
"completion_tokens": 149,
"prompt_tokens": 28,
"total_tokens": 177
}
}
+ AIとは、人工知能(artificial intelligence)のことです。コンピューターやロボットなどに人間と同じように思考・判断・学習などの能力を与える技術や分野を示します。AI技術は、様々な分野で応用されており、自動運転車、言語処理、画像認識、医療など、私たちの生活に多大な影響を与えています。
5. チャットの文脈に基づいた文章生成
ここまでは、text-davinci-003
とやっていることはそこまで変わりません。
次に、ChatGPTから返ってきた回答を組み込んで、2つ目の質問をしたいと思います(直前の会話の文脈に基づいた文章生成)。
messagesのリクエストパラメーターに、チャットの履歴をリスト形式で付与します。
そして、「英語に翻訳してください。」と追加の質問をします。
import openai
openai.api_key = "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
res = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{
"role": "system",
"content": "日本語で返答してください。"
},
{
"role": "user",
"content": "What is AI?"
},
+ {
+ "role": "assistant",
+ "content": "AIとは、人工知能(artificial intelligence)のことです。コンピューターやロボットなどに人間と同じように思考・判断・学習などの能力を与える技術や分野を示します。AI技術は、様々な分野で応用されており、自動運転車、言語処理、画像認識、医療など、私たちの生活に多大な影響を与えています。"
+ },
+ {
+ "role": "user",
+ "content": "英語に翻訳してください。"
+ },
],
)
print(res)
print(res["choices"][0]["message"]["content"])
すると、次のように返答が返ってきました。
過去の会話の文脈を考慮して、英語の回答を返してくれたことがわかります。
{
"choices": [
{
"finish_reason": "stop",
"index": 0,
"message": {
"content": "AI stands for artificial intelligence. It refers to the technology and field that endows computers, robots, and other devices with the ability to think, reason, judge, learn, and perform other cognitive tasks similar to humans. AI has been widely applied in various fields, including self-driving cars, natural language processing, image recognition, healthcare, and others, and has a significant impact on our daily lives.",
"role": "assistant"
}
}
],
"created": 1677718680,
"id": "chatcmpl-xxx",
"model": "gpt-3.5-turbo-0301",
"object": "chat.completion",
"usage": {
"completion_tokens": 82,
"prompt_tokens": 197,
"total_tokens": 279
}
}
AI stands for artificial intelligence. It refers to the technology and field that endows computers, robots, and other devices with the ability to think, reason, judge, learn, and perform other cognitive tasks similar to humans. AI has been widely applied in various fields, including self-driving cars, natural language processing, image recognition, healthcare, and others, and has a significant impact on our daily lives.
最後に
最後まで読んでくださり、ありがとうございました!
いかがだったでしょうか?
この記事を通して、少しでもあなたの学びに役立てば幸いです!
おまけ
エンジニアの仲間(データサイエンティストも含む)を増やしたいため、公式LINEを始めました🎉
「一緒に仕事をしてくれる方」「友だちとして仲良くしてくれる方」は、友だち追加をしていただけますと嬉しいです!(仲良くなった人たちを集めて、「ボードゲーム会」や「ハッカソン」や「もくもく会」もやりたいなと考えています😆)
とはいえ、みなさんにもメリットがないと申し訳ないので、特典を用意しました!
友だち追加後に、アンケートに回答してくれた方へ「エンジニア図鑑(職種20選)」のPDFをお送りします◎
参考文献
Discussion