ChatGPTで有名なOpenAIですが、Webのインタフェース (https://chat.openai.com/) だけでなく、プログラムから呼び出せるWebAPIをいろいろ提供しています。今回はPythonのopenaiモジュールを使って、OpenAIの提供するサービスを利用してみます。
目次
準備
OpenAI入門をはじめてゆきましょう。まずは準備です。
APIキーの取得
プログラムからOpenAIのサービスを利用する場合には、APIキーを取得する必要があります。
- アカウントのない人は https://platform.openai.com/signup から Sing upをしてください。アカウント作成時には本人を確認するための2段階認証の手続きが必要です。また、クレジットカードの登録など支払い方法の登録も必要となります。
- アカウントがある人は https://platform.openai.com/login から Log inしてください。
ログインができたらAPIキーの作成です。https://platform.openai.com/api-keys のページから”Create new secret key”をクリックします。
以下のようにキーの名前を求められるので覚えやすい名前を付けておきます。
「Create secret key」ボタンを押下するとキーの値が表示されます。ダイアログを閉じるとキーの値を参照することはできません。キーの値をどこかにCopy&Pasteなどで保存しておきます。
環境変数の設定
キーの値はプログラム中に埋め込むことも可能ですが、プログラムをほかの人と共有する場合には、キーの値が見えてしまうので好ましくありません。一般的にはキーの名前と値を環境変数に登録し、プログラムからその値を取得して使用します。環境変数とは、パソコンで使用できる変数のようなイメージです。以下はWindows11で環境変数を設定する手順です。スタートメニューで「環境変数」と入力すると以下のように表示されます。
「開く」をクリックすると、以下のようなダイアログが表示されます。環境変数の名前とその値が列挙されています。
上段「…のユーザー環境変数」は現在ログインしているユーザー固有の設定、下段「システム環境変数」はすべてのユーザーに共通の設定です。今回は上段の「新規」をクリックし、OPENAI_API_KEYという変数を設定してください。
正しく設定されたかどうかは以下のPythonスクリプトを実行することで確認できます。
import os
print(os.environ["OPENAI_API_KEY"])
キーの値が出力されれば環境変数が設定されていることになります。これでopenaiモジュールを使用した時に自動的にAPIキーが参照されるようになります。
openaiモジュールのインストール
以下のコマンドをコマンドプロンプトなどから実行して、openaiモジュールをインストールします。
pip install --upgrade openai
このモジュールは頻繁に更新されます。この記事を執筆時点でのバージョンは1.1.2でした。Windowsでのバージョンの確認方法は以下の通りです。
コマンドプロンプトの場合:pip list | findstr openai
Power Shellの場合:pip list | Select-String openai
APIの種類
OpenAIはさまざまなWebAPIを提供しています。以下のURLにあるAPI ReferenceのページにあるENDPOINTSがそれぞれのWebAPIに相当します。
https://platform.openai.com/docs/api-reference
代表的なENDPOINTには以下のようなものがあります。
- Chat = 会話形式のやり取りから応答を引き出します。
- Completions = シンプルに質問して応答を得るときに適しています。
- Images = 画像を生成します。
- Audio = 音声をテキストに変換、テキストを音声に変換したりします。
- Embedding = 単語や文章をベクトル形式に変換します。類似検索やカテゴライズなど複雑な独自処理をするときに使用します。
上記のAPI ReferenceにはHTTPプロトコルを使って機能を利用するときの手順が記載されています。そのような呼び出し方も可能ですが、Pythonのopenaiモジュールには、それぞれのEndpointに相当するクラスが用意されているので、そちらを使った方が簡単です。
ChatCompletion – 会話形式
医者にかかる場合には、お医者さんと会話しながら症状を説明するはずです。学校の先生に質問するときも、いろいろ会話しているはずです。このように日常生活では、なにか回答を期待する場合、会話を通して状況を説明するのが普通です。会話することで状況(コンテキスト)を適切に伝えることができるからです。OpenAIでもこのような手法で
まず、会話を通して応答を得てみましょう。入力が会話形式になっていることに注目してください。
from openai import OpenAI
client = OpenAI()
response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "あなたは学校の先生です。"},
{"role": "user", "content": "英語の学習で大切なことは何ですか?"},
{"role": "assistant", "content": "毎日少しの時間でも継続することです。"},
{"role": "user", "content": "どうすれば継続できますか?"}
]
)
print(response.choices[0].message.content)
最初にopenaiモジュールからOpenAIクラスをインポートし、そのオブジェクトを変数clientに格納しています。あとは、clientのchat.completions.createメソッドを実行するだけです。いろいろな引数が指定できますが、今回はmodel、messagesを指定しています。
- model = 生成AIのモデルを指定します。Chatの場合には”gpt-3.5-turbo”, “gpt-4″などが指定可能です。
- messages = 会話の情報をリストの形式で与えます。リストの中のオブジェクトには以下の情報を指定します。
- role = 役割、”system”:前提、”user”:あなたの質問、”assistant”:ChatGPT側からの応答例
- content = それぞれの役割のメッセージ
実行してしばらく待つと以下のようなメッセージが表示されました。
継続するためには以下のポイントに気をつけると良いです。
1. 目標を明確にする: 学習の目標を設定し、それを実現するためのステップを計画します。明確な目標があれば、それに向かって進むことができます。
2. スケジュールを立てる: 毎日の学習時間をスケジュールに組み込みましょう。毎日同じ時間帯に学習することで、習慣化しやすくなります。
3. モチベーションを保つ: 自分自身に対して毎日の学習の重要性を常に思い出すことが重要です。学習の目的や興味を明確化し、モチベーションが下がった時にそれを再確認してください。
4. 周りのサポートを利用する: 学習を継続するためには、周りの人々やコミュニティのサポートを受けることも重要です。友人や同僚と一緒に学習する、オンラインコミュニティに参加するなど、学習の仲間を見つけることで励みになります。
5. 楽しく学ぶ: 英語の学習は楽しく取り組むことが大切です。興味を持つテーマの本や映画を使った学習、音楽やゲームを取り入れた学習方法など、自分に合った楽しい学習方法を見つけましょう。
これらのポイントを意識して学習を継続すると、英語力の向上につながることでしょう。
それっぽい応答が得られていることがわかります。 response.choices[0].message.content という記述で応答を得ています。複数の応答を得ることも可能なので、choicesというプロパティが用意されています。今回はその先頭(0番目)の応答を取得し、そのメッセージ(message)の内容(content)とたどっています。
ちなみに、少し前までは以下のようなコードが実行できましたが、APIの仕様が変更され動かなくなりました(openaiモジュールのバージョン1.1.2)。
import openai
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "あなたは学校の先生です。"},
{"role": "user", "content": "英語の学習で大切なことは何ですか?"},
{"role": "assistant", "content": "毎日少しの時間でも継続することです。"},
{"role": "user", "content": "どうすれば継続できますか?"}
]
)
print(response.choices[0]["message"]["content"])
似たような形ではありますが、クラス名などが変更されています。変化の激しい分野でもあるので、「モジュールを更新すると動かなくなった」、ということは珍しくありません。このような状況に直面した場合は公式の情報を参照してください。
ちなみに、コマンドプロンプトから直接APIを呼び出すことも可能です。
openai api chat.completions.create -m gpt-3.5-turbo -g user "こんにちは"
Completion – シンプルな問合せ
会話のような形式でなく、シンプルに質問して回答を得る、という場合にはCompletionを使用します。以下サンプルコードです。
from openai import OpenAI
client = OpenAI()
response = client.completions.create(
model="gpt-3.5-turbo-instruct",
prompt="日本で一番高い山はなんですか?",
max_tokens=100
)
print(response.choices[0].text)
以下のような応答が得られました。
日本で一番高い山は、富士山(ふじさん)で、標高3776mです。
clientオブジェクトの作成までは前の例と同じです。client.completions.createメソッドを実行して応答を得ています。引数は以下の通りです。
- model = “gpt-3.5-turbo-instruct”というモデルを指定しています。
- prompt = 生成AIへの質問を1つの文字列という形式で記述します。
- max_tokens = 質問・応答の長さの上限を指定します。
ChatとCompletionで利用できるモデルが異なることに注意が必要です。また、Chatは会話形式なのでmessages引数にリストを、Completionは単発の質問なのでprompt引数に文字列を指定指定します。混乱しやすいところでもあるので注意してください。
Image Generation – 画像生成
生成AIでは画像を作成することも可能です。以下サンプルコードです。
import requests
from openai import OpenAI
client = OpenAI()
response = client.images.generate(
model="dall-e-3",
prompt="""Future Codersというプログラミングスクールのロゴを作成してください。
プログラミングを通して可能性を広げる、というのがスクールの理念です。
""",
size="1024x1024",
quality="standard",
n=1,
)
image_url = response.data[0].url
r = requests.get(image_url)
with open('logo.png','wb') as f:
f.write(r.content)
以下のようなロゴが作成されました。
clientの作成までは他のAPIと同じです。client.images.generateメソッドを使用します。引数は以下の通りです。
- model = 現時点での最新のモデル”dall-e-3″を指定しています。”dall-e-2″も指定可能です。
- size = 画像のサイズです。 1024×1024, 1024×1792, 1792×1024 から選択します。モデルによってサポートされるサイズは異なります。
- prompt = どんな画像を生成したいかテキストで指示をします。
- quality = 品質、standardかhdが指定可能です。
メソッドの戻り値 response.data[0].url から生成した画像のURLが取得できます。あとはそのURLをrequestsモジュールで取得してファイルに保存しています。
Text To Speech – テキストから音声へ
文字列を読み上げることも可能です。
https://platform.openai.com/docs/guides/text-to-speech
from pathlib import Path
from openai import OpenAI
client = OpenAI()
speech_file_path = Path(__file__).parent / "speech.mp3"
response = client.audio.speech.create(
model="tts-1",
voice="alloy",
input="本日は晴天なり、隣の客はよく柿食う客だ"
)
response.write_to_file(speech_file_path)
パターンが見てて来たと思います。clientを作成し、今度はclient.audio.speech.createメソッドを呼び出します。引数は以下の通りです。
- model = モデルを指定します。tts-1とtts-1-hdが指定可能です。
- voice = 音声の種類を指定します。alloy, echo, fable, onyx, nova, shimmer
- input = 読み上げる文字列を指定します。
実行すると、同じフォルダにspeech.mp3というファイルが作成されます。再生したところ、若干の外人風の訛りを感じましたが、漢字も正しく読み上げられていました。