5
6

【自分でも動かせた!】Azure OpenAI REST APIの挙動を見てみた

Last updated at Posted at 2023-09-22

INDEX

  • 概要
  • 目的
  • 準備
  • 雑なリソース構成
  • Azure OpenAI REST APIの挙動を見てみた
  • あとがき
  • 参考

1. 概要

image.png
注意: この記事は↑スクショのアプリ1を作る訳ではありません。

こんにちは。今回はとりあえずGPT関連に触ってみようという事で社内で試行錯誤していた記録です。
この記事は、Azure OpenAI Serviceに興味はあるけど触った事ない人(どっから始めればいいんや…と悩んでいる人) あたりを想定しています。
つまり、俺でもアプリにAzure OpenAIを組み込んで何か出来そう! と思ってもらえたら、私的にもオールオッケー2です。

MS Learnやリファレンスが難解と感じる企業ユーザー向け3なので、既に使い始めている人には無用の長物どころか知識を捻じ曲げる毒物になりそうなので見ない方がいいです。

2. 目的

本記事では、VSCode拡張のREST Clientを用いて、Azure OpenAI APIの呼び出しをする手順を記載します。
REST APIの呼び出し方さえ分かってしまえば、他のアプリに組み込むのは何とかなるのではないかと思ったからです。

3. 準備

  • Azureのサブスクを持ってる事
    • Azureを選ぼうとしているサラリーマンエンジニアなら既に持ってると思うのでスキップ!
  • OpenAIの利用申請をする事
    • 申請ページ
    • 申請時の注意点
      • 問5: 申請ページの途中でメールアドレスを求められるが、これが企業ユーザーに限定されている
      • 問17: OpenAIを使いたいのが自社ではない場合、使いたい企業(顧客企業等)自身に申請させて下さい(代理不可)
      • 問18: 通常はText and code modelsだけでよい。画像生成もしたいならDALL-E 2 models4も選択して良いです。2023年9月現在は、East USリージョンのみの提供になっています
    • メモ

4. 雑なリソース構成

本家ChatGPTと違い、Azure OpenAIを使うためにはAzure的な考えが必要です。
ここでは、実際にリソースを作成し、RESTリクエストを投げる所までを書きます。

4.1. OpenAI Serviceリソースを作る

  • Azureポータルにアクセスし、リソース作成画面を開きます
    image.png
  • 適宜設定します
    • 基本
      • 名前はREST APIのエンドポイントのサブドメイン部分になります。あんま変な名前にしないでね!5
      • リージョンについて2023/9時点では、DALL-Eを使う場合はEast USにしないとダメです!6
      • 価格について2023/9時点では、Standard S0しか確認できていません
        image.png
    • ネットワーク
      • 種類について、一旦さっくり使いたいだけなので、無効にします。
      • それ以外はそのままで
        image.png
    • タグ
      • お好きなように!
    • レビューおよび送信
      • 問題がなければ作成ボタンを押下します。
        image.png
  • 追加のネットワーク設定をします
    • 作成したリソースを開き、リソース管理 > ネットワーク(Networking)を開きます
    • スクショのように設定し、自分のPCからOpenAIリソースに触れるようにします。7
      image.png

4.2. 使用するモデルをデプロイする

  • OpenAI Serviceリソースは、GPTモデルを格納する為の箱です。なので、箱にモデルを入れていきます。
  • 作成したAzure OpenAI Serviceリソースを開き、Azure OpenAI Studioを起動します。
    上の方にあるGo to Azure OpenAI Studioでも開きますが、同じウインドウで開いてしまうのでスクショのようにExploreボタンがオススメです。
    image.png
  • Studioが起動したら、Management > Deployments > + Create new deploymentを開きます
    image.png
  • 画面がポップしたら、任意のモデルとデプロイ名を指定します。
    スクショはgpt-35-turbo-16kを指定8していますが、gpt-35-turboで問題ありません。
    Tokens per Minute Rate Limitに関してはお試しで触るだけなので初期値で問題ありません。高負荷または低負荷アプリ組み込み時等は調整が必要です。
    image.png

余談: デプロイできるモデルの一覧を確認する

+ Create new deploymentで選べるモデルは、Management > Modelsから確認できます。
ちなみに、OpenAIの利用申請がまだ適用されていなかったりすると空っぽになります。
image.png

5. Azure OpenAI REST APIの挙動を見てみた

REST APIの呼び出しは、VSCodeのREST Clientという拡張機能を使いました。

5.1. とりあえずチャットAPIでHello, World

最初なので、細かく書いてみます。

5.1.1. RESTの投げ方を見る

  • StudioのPlayground > Chatを開きます
  • Chat sessionのテキストボックスに任意の文字を入れて送信します
  • Chat session > View codeを開きます
    image.png
  • 右上のドロップダウンボックスで言語が選べます。今回はRESTの投げ方を知りたいのでcurlを選びます。
    image.png
  • リクエストヘッダも含めて、チャットを送った時のコマンドが分かりますね!ポイントはこの辺ですかね。
    • エンドポイント(URL)とメソッド(GETとかPOSTとか)
    • APIキー
    • リクエストBODY

5.1.2. 実際にREST Clientで投げてみる

色々と思考錯誤して最小に近い形にしたのがこちら。
カッコ書きした箇所は適宜置き換えて使ってみて下さい。

test1.http
# 基本設定
@api_key = (APIキー)
@endpoint = https://(リソース名).openai.azure.com
@api_version = 2023-05-15
@deployment_name = (モデルデプロイ時につけた`Deployment Name`)

### チャットAPI(Chat) - "/chat/completions"
POST {{endpoint}}/openai/deployments/{{deployment_name}}/chat/completions?api-version={{api_version}}
api-key: {{api_key}}
Content-Type: application/json

{
    "model": "(モデル名「gpt-35-turbo」等)",
    "messages": [
        { "role": "user", "content": "こんにちは、世界" }
    ]
}

実際に投げてみた所

  • 送信方法。VSCode上に上記コードをテキストファイル(拡張子はhttp)で作成すると、メソッド(GETやPOST)の直上にSend Requestという文字が出るので、これをクリックする
    image.png
  • 送信
    image.png
  • 受信
    image.png

5.2. 入力候補APIはどうよ?!

投げ方の雰囲気はチャットAPIを同じだけど、モデルがチャット系特化(gpt-35-turboではなくgpt-35-turbo-16k等)だと失敗する。

test2.http
# 基本設定
@api_key = (APIキー)
@endpoint = https://(リソース名).openai.azure.com
@api_version = 2023-05-15
@deployment_name = (モデルデプロイ時につけた`Deployment Name`)

### 入力候補API(Completions) - "/chat/completions"
POST {{endpoint}}/openai/deployments/{{deployment_name}}/completions?api-version={{api_version}}
api-key: {{api_key}}
Content-Type: application/json

{
    "prompt": "赤い果物を3つ、名詞のみで答えなさい",
    "max_tokens": 100,
    "stop": null
}

実際に投げてみた所

  • 送信
    image.png
  • 受信
    image.png

エラーやんけ! どうやら入力候補APIに対応していないモデル(gpt-35-turbo-16k)を使ったせいみたいです。

モデルをgpt-35-turboに変更して実際に投げてみた所(リトライ)

  • OpenAI Serviceリソースにgpt-35-turboを追加してからリトライします。
    image.png
  • 送信
    image.png
  • 受信
    image.png

200 OKが返ってきました。
でも、文章にもなってしまいましたね。この辺は別のモデルを使うと良いのだろうか。(davinci等)

5.3. それ以外のAPI。そや!モデルAPIって使えそうじゃね?

test3.http
# 基本設定
@api_key = (APIキー)
@endpoint = https://(リソース名).openai.azure.com
@api_version = 2023-05-15
@deployment_name = (モデルデプロイ時につけた`Deployment Name`)

### モデル一覧取得
GET {{endpoint}}/openai/models?api-version={{api_version}}
api-key: {{api_key}}

### モデル取得
@model-id = gpt-35-turbo-16k
GET {{endpoint}}/openai/models/{{model-id}}?api-version={{api_version}}
api-key: {{api_key}}

  • 送信(モデルデプロイ名をURLに含めると単数取得になる)
    image.png
  • 受信(モデルデプロイ名を含めなかった時の応答)
    image.png

これは作ったアプリ上で動的にモデルを切り替えたい時に良さそうですね。
capabilitiesをよく見ると対応APIが分かりそうなパラメータを持っていそうな感じがします。(未確認)

5.4. …という事で雑なAPI説明

  • APIは大まかに9個ほどある様子
    1. チャット(Chat)
      • 連続した会話をする
    2. 入力候補(Completions)
      • 一問一答
      • 文章の要約や翻訳
      • ユーザー入力の予測
      • 等々…
    3. 画像生成(DALL-E、preview)
      • 2023/9時点では、East US限定
      • テキストから画像を生成する。Stable DiffusionやNovelAIっぽい?
    4. ファイル(Files、一部preview)
    5. 微調整(Fine Tunes、一部preview)
    6. モデル(Models、一部preview)
      • モデルの情報を取得する
    7. 画像(Images、一部preview)
    8. 操作イメージ(Operations Images、一部preview)
    9. 埋め込み(Embeddings、未調査)9
  • 初心者はチャット(Chat)入力候補(Completions)を抑えておけば良いと思います

6. あとがき

すっかり長文が読めなくなり、寄る年波にはなんとやらを痛感してきた弊社のバカ野郎担当の人です。

元々興味はあったのですが、初めの一歩の障壁がものすごく高く感じたので、同じような悩みを持っている人に向けて、スクショ大盛り

さらに、何らかのアプリを作りたい人に取っては、RESTリクエストの投げ方が分かればアプリへの組み込みはどうとでもなるかなと思い、REST APIに注目した記事になりました。

皆様のはじめの一歩に貢献できたのなら幸いです。

(2023/9/22追記)
俺ですらというキーワードに物言いがついたので修正しました。えっ、わざわざ修正履歴を残さなくてもいい…だと?!

7. 参考

  1. このスクショはOpenAI StudioでPlayground > Chatを開き、画面右上にあるDeploy to > A new web app...を選択すると構築できるアプリを改造したものです。ソースコードはGitHub上のMITで公開されています。https://github.com/microsoft/sample-app-aoai-chatGPT

  2. 元ネタはTMRのHotlimitの一節。ダイスケ的にもオールオッケーダイスケとは多分浅田大介の事。もう10年以上前なんですね。

  3. 後述する利用申請ページにて、メールアドレス等を入力しないとダメですが、これを企業ユーザーに限定している。個人ユーザーはダメっぽい。悲しいω

  4. 読みは「ダリー」。テキストの説明を元に画像を生成するモデルの一つです。Stable DiffutionNovel AIのサービスの中にいるモデルもこういう特徴を持ったものかもしれませんね。知らんけど。

  5. もしかしたら自前のドメインを買っているブルジョアな所は重複を気にしなくて良いかもね。買ってないので知らんけど。

  6. Japan Eastで使えるのは gpt-35-turbo系gpt-4系text-embedding-ada-002 の3系統。不正確な説明だが、初心者レベルならgpt-35gpt-4はチャットAPIに特化しているおり、adaは埋め込みAPIに特化…くらいに知っていればOK。

  7. お試しで触りたいだけなのでこういう構成にしています。この構成でアプリを公開するのは推奨しません。仮想ネットワーク等を作り、特定のアプリからのみアクセスするようにさせる等を検討して下さい。

  8. このスクショはフラグです…orz

  9. 埋め込みAPI。なんだけどいまいち分かっていません…。別記事で書くか…?!本家OpenAIの方に役割っぽい情報はあるけど、一緒なのかな?!⇒ https://platform.openai.com/docs/guides/embeddings/embeddings

  10. Completions完了と翻訳されたりするので、最初は「何のこっちゃ?」と思ったものです。これは訳さない方が理解できる。

5
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
6