“Azure OpenAI”で始めるPythonプログラミング【LLMことはじめ Vol.1】
こんにちは、皆さん!株式会社調和技研のAI技術開発第一グループにて、お客様のAIの開発・導入支援を担当している鈴木卓麻です。
現在、世の中はAIが言語、画像、音声など複数の形式を同時に扱うマルチモーダルの時代へと進化しています。この新しい波に取り残されないために、画像処理エンジニアである私も最新の大規模言語モデル(LLM)の知識を習得することで専門性を拡張し、より多くの問題解決策を提供できるようになることが不可欠です。
そこで、自分が最初に勉強したことを振り返り、いろいろ勉強した中で必要最小限のことをまとめ、実践的なハンズオン形式の記事を4回に分割してお届けしたいと思います。
この記事が、読者の皆さんにとって、新たなキャリアへの一歩を踏み出すお手伝いとなれば幸いです。
前提条件
Azure OpenAI Serviceにアクセスが可能であること
Openai のパッケージバージョンが1.x.xであること
Pythonの初歩的なプログラミングが可能であること
ローカル仮想環境での実験
本記事の目標(完成形を提示)
この記事の目標はコマンドプロンプト上でLLMと会話ができるようになることです。
全体の流れ
Step1:Azure OpenAI Serviceとは
Step2:アクセスキーとエンドポイント
Step3:ライブラリのインストール
Step4:GPTを呼び出すコード
Step5:コードの実行
Step6:ブラッシュアップ
Step1:Azure OpenAI Serviceとは
Azure OpenAI Service[1]は、Microsoft Azureのクラウドプラットフォーム上でOpenAI社のAIモデルを利用できるサービスです。特に、企業がセキュリティの高い環境で、GPTやDALL-EなどのAIモデルを利用したアプリケーションを迅速に構築することが可能です。
企業がAzureを利用するポイントは以下の通りです。
セキュリティ
Azure OpenAI Serviceは、Microsoft Azureのセキュリティとコンプライアンス基準に準拠しており、データの暗号化やプライベートネットワークの利用など、厳格なセキュリティ対策が施されています。これにより、機密性の高い社内書類のデータ保護が求められる企業にとって、大きなメリットがあります。
可用性
可用性とはシステムが継続して稼働できる能力の事です。Azure OpenAI Serviceは、99.9%以上の稼働率を保証するSLA(サービスレベルアグリーメント)を提供しており、企業にとって信頼性の高いサービスを提供します。
サポート
有償のサポートプランを利用することで、企業は運用中に直面する可能性のある問題に対して、Microsoftから専門的な支援を受けられます。
現在、Azure OpenAIへのアクセスはMicrosoftへの申請が必要で、許諾を得て初めて使えるサービスです。これは、安全かつ公正な使用を確保するために、Microsoftが定める “6つのAI原則”[2]に従う必要があるためです。責任をもってMicrosoftは、責任のあるAIの使用を推進するというコミットメントの一環として、アクセスを制限しているとしています。そのためOpenAIに比べると、利用のハードルは少し高いかもしれません。
一方、OpenAI APIは、最新のAIモデルを迅速に利用できる点がメリットです(特に最近発表されたGPT-4oが利用可能です。現在、特定のリージョンでAzure OpenAI ServiceでもGPT-4oは利用可能 ※2024.06.12調べ)。しかし、セキュリティや可用性の保証はAzure OpenAI Serviceほど高くありません。個人開発者や小規模なプロジェクトにはOpenAI APIが適している場合がありますが、大規模かつセキュリティを重視する企業にはAzure OpenAI Serviceが推奨されます。
Step2:アクセスキーとエンドポイント
Azure OpenAI Serviceを利用して開発をするためには「アクセスキー」と「エンドポイント」の取得が必要です。この二つのパラメータを設定することで初めてPythonからAzure OpenAI Serviceを使えます。これらのパラメータは以下の手順で取得できます。
- Azureのポータルサイトにアクセスし、検索窓にOpenAIを入力します。
- Azure OpenAIにアクセスし、使用したいリソースグループにアクセス後、「Azure OpenAI Studioに移動する」を押します。
どのモデルを使うか、モデル名を確認します(今回はgpt-35-turboを選択)
Azure OpenAI Studioからポータルに戻ってキーとエンドポイントを取得します。
このAPIキーとエンドポイントを設定することでAzure Openai Service にアクセスできるようになります。この情報が外部に流出すると、第三者があなたのAzure Openai Serviceを利用できるようになってしまうため、注意が必要です。基本的にはAPIキーは環境変数に割り当て外部から閲覧できないようにします。環境変数に登録する具体的な方法はStep6で解説します。
Step3:OpenAIのパッケージをインストール
PythonでOpenAIを使用するにはopenaiパッケージをインストールする必要があります。
pip install openai
インストールが完了したら、次のコマンドを実行してバージョンを確認します。
penai --version
バージョンが1.x.xと表示されれば、インストールは成功です。もしバージョンが0.28.1と表示された場合は、インストールをやり直してください。
Step4:GPTを呼び出すコード
パッケージのインストールが完了したので、次にAzure OpenAIを呼び出してみましょう。OpenAIのライブラリはバージョンによって使用方法が異なるため注意が必要です。ここではv1.x.x系の使用方法を紹介します。
まずは、以下のコード全文を記載します。
# 1 パッケージのインポート
from openai import AzureOpenAI
# 2 APIクライアントの設定
client = AzureOpenAI(
api_key = "****************************",
api_version = '2023-05-15', # this might change in the future
azure_endpoint = "https://YOUR_RESOURCE_NAME.openai.azure.com/", # your endpoint should look like the following
)
# 3 API呼出方法
response = client.chat.completions.create(
model="gpt-35-turbo",
messages=[
{"role": "user", "content": "日本で一番高い山を教えて下さい。"},
],
)
# 4 レスポンスの処理
print(response.choices[0].message.content)
このコードは大きく4つのブロックに分けています。それぞれ解説していきます。
#1 パッケージのインポート
from openai import AzureOpenAI
openaiパッケージからAzureOpenAIクラスをインポートすることでAzureOpenAIを使えます。
#2 APIクライアントの設定
次に、APIクライアントの設定を行います。クライアントインスタンスを作成して、そのインスタンスにAPIキー、APIバージョン、エンドポイントを設定する必要があります。
client = AzureOpenAI(
api_key = "****************************",
api_version = '2023-05-15',
azure_endpoint = "https://YOUR_RESOURCE_NAME.openai.azure.com/",
)
api_keyはStep2で取得したキーを入力します。
azure_endpointはStep2で取得したエンドポイントのアドレスを入力します。
現段階ではローカル仮想環境で実験しているため、直接記載していますが、この書き方は推奨されません。Step6で書き方の改善を説明します。
api_versionは使用したいAPIのバージョンを指定します。
YYYY-MM-DD日付形式で管理されています。新しいバージョンが頻繁にリリースされ、古いバージョンが廃止されるため、定期的に更新することが重要です。
i.e)「2023-05-15」,「2024-02-01」 など
サポートされているバージョンはAPIクライアントの設定の公式サイト[3]で確認できます。
#3 API呼出方法
こちらのコードはAPIの呼び出し方です。
# API呼出方法
response = client.chat.completions.create(
model="gpt-35-turbo",
messages=[
{"role": "user", "content": "日本で一番高い山を教えて下さい。"},
],
)
Azure OpenAI Serviceには、「Chat Completions API」と「Completions API」の2つのAPIがあります。これらはどちらもOpenAIの言語モデルを使ってテキスト生成を行うためのAPIですが、使い方や目的が少し異なります。
1. Completions API
<概要>
Completions APIは、与えられたテキストの続き(補完)を生成するためのAPIです。これは、シンプルに一連のテキストを入力し、その続きとしてどのようなテキストが生成されるかを取得するためのものです。
<使い方の例>
たとえば、あなたが小説を書いていて次の文章の続きを生成したいとします。
吾輩は猫である |
このテキストをCompletions APIに入力すると、その続きの文章を生成してくれます。
名前はまだない |
と対話ではなく、入力されたテキストの続きを出力する一問一答といった感じです。
こちらは現在Legacy扱いで、OpenAI公式ドキュメント[4]によれば、今後のアップデートの対象外となっています。今後はあまり使わない方が良いでしょう。
2. Chat Completions API
<概要>
Chat Completions APIは、特にチャットボットや対話型のアプリケーションを構築するために設計されたAPIです。このAPIは、複数のターンの対話(例えば、人間とボットの会話)の履歴を考慮して応答を生成します。
<使い方の例>
たとえば、あなたがカスタマーサポートのチャットボットを作りたいとします。ユーザーとボットの間で以下のような対話があるとします。
ユーザー:『吾輩は猫である』の続きの文章を教えて下さい。 ボット:『吾輩は猫である』は、夏目漱石によって書かれた日本の古典文学作品です。この… |
この対話履歴をChat Completions APIに渡すと、次にボットがどのように応答するべきかを生成してくれます。先に紹介したCompletionsAPIより、使いやすいです。詳しくはまだ勉強中です。
Chat Completions APIの引数は以下のものがあります。
model:デプロイされていて使いたいモデルを選択してください。”gpt-35-turbo”や“ gpt-4”を設定してください。
詳細はMicrosoft公式のAzure OpenAI Service モデル[5]のモデルID部分を参照してください。※モデルはAzure OpenAI Serviceにデプロイされていなければ使えません。
<messages>
ロール | 説明 |
system | 会話を始める際に役割を設定。会話のルールや回答時の性格などを定義してあげる
|
user | 質問、要求や指示など、入力するメッセージを定義 |
assistant | モデルが生成した回答を定義(会話履歴を全て送ることで、その文脈を踏まえた回答が可能)
|
今回は、GPTには何の役割も与えずに質問だけ投げかけるようにしてみました。
ユーザー:日本で一番高い山を教えて下さい。 |
期待する回答は「富士山」です。
回答の表示
response:GPTから返ってきた内容はJson形式で次のような構造になっています。
{
"choices": [
{
"finish_reason": "stop",
"index": 0,
"message": {
"content": "日本で一番高い山は富士山(ふじさん)です。標高3,776メートルで、日本国内外から多くの登山者や観光客が訪れています。富士山は日本の象徴的な存在であり、世界遺産にも登録されています。",
"role": "assistant"
},
"logprobs": null
}
],
"created": 1716538052,
"id": "chatcmpl-7QyqpwdfhqwajicIEznoc6Q47XAyW",
"model": "gpt-35-turbo",
"object": "chat.completion",
"usage": {
"completion_tokens": 93,
"prompt_tokens": 23,
"total_tokens": 116
}
}
レスポンスの中身はいろいろありますが、欲しい内容はmessageの部分となります。
他にも、回答が完全に完了しているか、トークン数はいくつかなどの情報も返ってきます。[6]
#4 レスポンスの処理
レスポンスの中から回答のテキスト部分のみ抜き出すのは以下のように書くと簡単にできます。
# レスポンスの処理
print(response.choices[0].message.content)
Step5:コードの実行
さて、すごく短いコードですが、実行してみましょう。
ユーザーメッセージをコードに埋め込んでいるので、質問はできませんが、回答が返ってきました。ちょっと嬉しいです。
Step6:ブラッシュアップ
さて、ここまででとりあえず動くものができましたが、まだまだ粗削りな状態です。次のことを行い、コードの整理を行いましょう。
- APIキーなどを環境変数に設定し、コードから呼び出す
- 会話をつづけるためのループ構造
繰り返しになりますが、このサンプルのAPIキーなどを直性コード内に実装する方法は一般的には推奨されません。これらを公開してしまうと、第三者に不正利用され、その結果、第三者が使用した分の金額を請求される可能性があります。一般的なお作法としては、これらのキーを環境変数に登録し、コード内で呼び出す方法を覚えておきましょう。
Windows設定
コマンドプロンプトで「OPENAI_API_KEY」環境変数を設定する方法
setx OPENAI_API_KEY " ***************************"
ちゃんと設定されているか確認する方法は、コマンドプロンプトで次のように入力します。
echo %OPENAI_API_KEY%
設定した値が表示されたら環境変数にちゃんと設定されています。これで準備が完了しました。
ではコード内で環境変数を呼び出す方法です。
import os
api_key = os.getenv("OPENAI_API_KEY ")
os.environ[“OPENAI_API_KEY”]でも問題ありません。内部の動きとしてはほぼ変わらないので自分がわかりやすい関数を使用してください。
会話を続けるためのループ構造
先ほどまでのプログラムは、GPTから回答を受け取ると終了するようになっています。そこで、while文を使用して無限ループを作成し、ユーザーからの入力を継続的に受け付けるよう変更してみましょう。
import os
from openai import AzureOpenAI
# LLMの設定
client = AzureOpenAI(
api_key= os.getenv("AZURE_OPENAI_API_KEY"),
api_version='2023-05-15',
azure_endpoint=os.getenv("AZURE_OPENAI_ENDPOINT"),
)
# LLMの役割を定義
conversation = [{"role":"system","content":"""
貴方はベテランのエンジニアです。質問に対しては初心者にもわかるように丁寧に回答して下さい。
"""}]
# 無限ループでユーザーからの入力を受け付け、回答を返す
while True:
# 入力を受け付ける
user_input = input("Q:")
conversation.append({"role": "user", "content": user_input})
# Azure OpenAIにリクエストを送信
response = client.chat.completions.create(
model="gpt-35-turbo",
messages=conversation,
)
conversation.append({"role":"assistant","content":response.choices[0].message.content})
print("A:",response.choices[0].message.content + "\n")
では、このプログラムを実行してみます。
今回はLLMに特定の役割も割り当ててみました。しかし、会話を続けていくとトークン数の上限に達し、プログラムが停止してしまうことがあります。トークン数の管理は重要ですが、その方法に関しては次の機会に詳しくご説明します。
おわりに
コマンドプロンプトでAPIを利用してGPTと会話するプログラムを作成することに成功しました。
今回はテキスト生成AIであるGPT-3.5-Turboを使用しましたが、画像生成AIであるDELL-E2を呼び出すことで、画像の生成も可能です。APIの操作方法は基本的に同じなので、このハンズオンをキッカケに、様々な機能を試してみましょう。
【参考文献】
[2] What is Responsible AI?|Microsoft
[3] Azure OpenAI ServiceのREST API リファレンス|Microsoft
[4] Text generation models|OpenAI Platform
画像系AIの開発に従事。2002年立命館大学理工学部卒。写真現像機の開発、プリントシール機の開発を経て2022年8月に調和技研に参加。二児の父。子育てのために京都からフルリモートワークが可能な会社を探していたら北海道の調和技研に出会う。最近はPTA活動と競技ドッジボールの審判が忙しい。