LLMを扱えるクラウドサービス、Azure OpenAI Serviceを触ってみたので使い方をメモ

  •  
 
トビウオ に投稿

概要

もはや説明不要かもしれませんが、2022年11月にOpenAI社からChatGPTがリリースされてから、LLM(Large Language Model) によるテキスト生成はグッと一般的になりました。ChatGPT以外だとAnthropic社のClaudeGoogle社のGeminiも有名ですが、最大手がChatGPTな状況はまだまだ変わりそうにありません。

ChatGPTのアイコン

(丁志仁, CC BY-SA 4.0, via Wikimedia Commons)

こうしたLLM人気を受けてか、LLMエンジンを使ったクラウドサービスも各社から出ています。AWSならAmazon BedrockGoogle CloudならVertex AI StudioAzureならMicrosoft Azure OpenAI Serviceなどですね。いずれのサービスも、テキスト生成や画像生成など、用途に応じたLLMモデルを選択できるようになっています。

モデルが選択できる

この記事では、そのうちMicrosoft Azure OpenAI Serviceを使い、GPT-4にアクセスし、OpenAI社のGPT-4との「使い方の違い」について詳しく解説していきます。

OpenAIの場合

OpenAI 公式サイトの解説ページに詳しく書かれていますが、必要最低限な箇所について解説します。

まず、API キーを取得します。同社サイトにログインし、Dashboardタブ→API Keysタブに移動。そして、Create new secret keyボタンをクリックして、API キーを取得します。

OpenAIのAPIキーの取得方法-1

OpenAIのAPIキーの取得方法-2

このコピーした API キーを、APIにアクセスする際に使用します。まずはcurlコマンドで動作を確認してみましょう。

OPENAI_API_KEY='sk-XXXXXXXX'

curl "https://api.openai.com/v1/chat/completions" \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer $OPENAI_API_KEY" \
    -d '{
        "model": "gpt-4o",
        "messages": [
            {
                "role": "system",
                "content": "あなたは平安時代の歌人です。"
            },
            {
                "role": "user",
                "content": "朝食に関する短歌を詠んでください。"
            }
        ]
    }'

このコマンドを実行すると、GPT-4oが、平安時代の歌人になりきって、朝食に関する短歌を詠んでくれるはずです。JSON出力における['choices'][0]['message']['content']に、今回生成したテキストが格納されています。

{
  "id": "chatcmpl-xxx",
  "object": "chat.completion",
  "created": 1729215993,
  "model": "gpt-4o-2024-08-06",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "朝ぼらけ 新しき日を 迎えつつ  \n炊ぐ釜より 香る飯の湯気  ",
        "refusal": null
      },
      "logprobs": null,
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 36,
    "completion_tokens": 31,
    "total_tokens": 67,
    "prompt_tokens_details": {
      "cached_tokens": 0
    },
    "completion_tokens_details": {
      "reasoning_tokens": 0
    }
  },
  "system_fingerprint": "fp_xxx"
}

公式ドキュメントによると、gpt-4oより賢くないけど速くて安いgpt-4o-miniや、逆にgpt-4oより賢いけど遅くて高いo1-previewなど、状況に応じて様々なモデルを選択できます。

また、messagesにおいて、rolesystemの場合は「モデルがどのように振る舞うべきかの指示」、roleuserの場合は「モデルに対するユーザーの入力 (ChatGPTでユーザーが入力するテキストと概ね同じ)」となります。こういった作法に従えば、誰でも簡単に「LLMを使ったテキスト生成」をソフトウェアに組み込めるわけですね。

なお、こうした素のREST APIの他に、Python や JavaScript.NET など、他の言語向けのインターフェースも提供されています。例えば、Python の場合は以下のようになります。

from openai import OpenAI
client = OpenAI()

completion = client.chat.completions.create(
    model='gpt-4o',
    messages=[
        {'role': 'system', 'content': 'あなたは平安時代の歌人です。'},
        {'role': 'user', 'content': '朝食に関する短歌を詠んでください。'},
    ]
)

print(completion.choices[0].message)

Azure OpenAI Serviceの場合 (セットアップ編)

Azure OpenAI Serviceの場合も、まずは Azure 公式サイトからアカウントを作成することになります。

次に、APIキーを発行するための手続きを行う……のですが、そのためのステップが少々長めです。箇条書きにしても、次のようなステップが必要となります。

  1. 「サブスクリプション」を作成する
  2. 「リソースグループ」を作成する
  3. 「リソース」として「Azure OpenAI Service」を作成する
  4. 作成したリソースに対応する、「エンドポイントURL」と「APIキー」を取得する
  5. 「モデルデプロイ」メニューから「Azure OpenAI Studio」に遷移し、「デプロイ」を作成する
  6. 「エンドポイントURL」と「APIキー」、そして「デプロイ」の名前がREST APIの呼び出しに必要となる

具体的な説明画像については、枚数が多いので、以前発表したスライド記事の4ページ目以降を参照してください。

この構造を読み解くポイントとしては、次のようにまとめられるでしょう。実験用のリソースと本番用のリソースを分けて用意できるし、素のモデルと追加学習済みモデルを簡単に切り替えられる、といった感じでしょうか。

  • 「サブスクリプション」は課金を設定するために必要
  • 「リソースグループ」はリソースをまとめるために必要
  • 「(Azure OpenAI Serviceの) リソース」は、実際にLLMを使うために必要。APIキーエンドポイントURLはこのリソースと紐づいている
  • 1つのリソースは複数の「デプロイ」を持てる
  • 「デプロイ」は、「基本モデル」か「基本モデルに追加学習させたもの」のどちらかを元に作成できる

Azure OpenAI Serviceの場合 (使い方編)

前述したように、「エンドポイントURL」「APIキー」「デプロイ名」の3つが、Azure OpenAI Serviceを使うために必要です。まずは、公式リファレンスを見ながらREST APIを使ってみましょう。OpenAI APIのそれと似ているようで、ところどころ違う……といった風な設定です。

ENDPOINT_URL='https://my-resource.openai.azure.com'
API_KEY='XXXXXXXX'
DEPLOY_NAME='my-deploy'
API_VERSION='2024-02-01'

curl "${ENDPOINT_URL}/openai/deployments/${DEPLOY_NAME}/chat/completions?api-version=${API_VERSION}" \
    -H "Content-Type: application/json" \
    -H "api-key: ${API_KEY}" \
    -d '{
        "messages": [
            {
                "role": "system",
                "content": "あなたは平安時代の歌人です。"
            },
            {
                "role": "user",
                "content": "朝食に関する短歌を詠んでください。"
            }
        ]
    }'

また、Pythonの場合も、Azureの方はOpenAIの方とところどころ違うコードとなります。公式リファレンスに明記されていますが、ライブラリの旧バージョン (0.28.1など) と新バージョン (1.xなど) で書き方が大きく異なるので、利用の際には注意が必要です。

# OpenAI Python 1.xの場合
from openai import AzureOpenAI

ENDPOINT_URL='https://my-resource.openai.azure.com'
API_KEY='XXXXXXXX'
DEPLOY_NAME='my-deploy'
API_VERSION='2024-02-01'

client = AzureOpenAI(
  azure_endpoint = ENDPOINT_URL, 
  api_key=API_KEY,  
  api_version=API_VERSION
)

completion = client.chat.completions.create(
    model="gpt-35-turbo", # model = DEPLOY_NAME.
    messages=[
        {'role': 'system', 'content': 'あなたは平安時代の歌人です。'},
        {'role': 'user', 'content': '朝食に関する短歌を詠んでください。'},
    ]
)

print(completion.choices[0].message)

# OpenAI Python 0.28.1の場合 (旧方式)
from openai import AzureOpenAI

ENDPOINT_URL='https://my-resource.openai.azure.com'
API_KEY='XXXXXXXX'
DEPLOY_NAME='my-deploy'
API_VERSION='2024-02-01'

openai.api_type = "azure"
openai.api_base = ENDPOINT_URL
openai.api_key = API_KEY
openai.api_version = API_VERSION

response = openai.ChatCompletion.create(
    engine="gpt-35-turbo", # model = DEPLOY_NAME.
    messages=[
        {'role': 'system', 'content': 'あなたは平安時代の歌人です。'},
        {'role': 'user', 'content': '朝食に関する短歌を詠んでください。'},
    ]
)

print(response['choices'][0]['message']['content'])

まとめ

Azure OpenAI Serviceを使う際の手順を解説しました。OpenAIの場合と比べると、Azureの方は「リソース」「デプロイ」など、より細かい設定が必要となりますが、その分、より柔軟な運用が可能となります。

コメントを追加

プレーンテキスト

  • HTMLタグは利用できません。
  • 行と段落は自動的に折り返されます。
  • ウェブページのアドレスとメールアドレスは自動的にリンクに変換されます。
CAPTCHA
この質問はあなたが人間の訪問者であるかどうかをテストし、自動化されたスパム送信を防ぐためのものです。
画像
OpenAIのアイコン
AIモデルについて
OpenAIのAPIキー発行 (1)
OpenAIのAPIキー発行 (2)