Azure AI Foundry で作った gpt-4o モデルを API として Node-RED とやり取りするメモ

Azure AI Foundry で作った gpt-4o モデルを API として Node-RED とやり取りするメモ

この記事は Microsoft Azure Advent Calendar 2024 の記事です。

Azure AI Foundry で作った gpt-4o モデルを API として Node-RED とやり取りするメモです。

背景

2024/12/20 時点の情報で進めます。

Azure AI Foundry から gpt-4o モデルを使えた ので、これを発展させてAPI として Node-RED とやり取りしてみます。

Azure AI Foundry のプロジェクトを確認

プロジェクトを確認すると、概要のところに、すぐ API キーがあります。

ちょうど API ドキュメントのリンクもあるので見てみます。

Azure OpenAI Service REST API reference - Azure OpenAI | Microsoft Learn

こちらです。

Completions を使ってみます。

POST https://{endpoint}/openai/deployments/{deployment-id}/completions?api-version=2024-10-21

こんなアクセスの仕方のようです。

{endpoint} はプロジェクトにある Azure OpenAI エンドポイントを使います。

{deployment-id} は、Deployment IDです。これをを確認するには、Azure AI Foundry ポータルにサインインし、モデルカタログから必要なモデルを選択します。モデルの詳細ページに Deployment ID が表示されます。

といいつつ、このあたり、私には分かりにくかったので最終的には、プロジェクトの マイ アセット > モデル + エンドポイント を確認すると endpoint も deployment-id も設定されたエンドポイントが取得できます。

結果 、Deployment ID は gpt-4o でした。あくまで私の場合です。

また、 HTTP Header には api-key が必要で、こちらから使います。

送るデータの話

ほんとここは 2024/12/20 の情報です。今後整いそうです。

さて、送るデータなんですが、リンクにあった

Azure OpenAI Service REST API reference - Azure OpenAI | Microsoft Learn

のほうで、

{
 "prompt": [
  "tell me a joke about mango"
 ],
 "max_tokens": 32,
 "temperature": 1.0,
 "n": 1
}

で、素直にやっていたところ、Unsupported data type が来てしまってうまくいきませんでした。

いろいろ調べてみたところ、Azure OpenAI Service supported programming languages - Azure AI services | Microsoft Learn の JapaScript のほうでは

const result = await client.chat.completions.create({ messages, model: '', max_tokens: 100 });

みたいに解説されていて、これはもしや本家の API Reference - OpenAI API のデータ形式である、

{
    "messages": [
      {
        "role": "user",
        "content": "Hello!"
      }
    ]
  }

みたいな形式がよさそうと推測しました。

結果当たっていたので、一旦はオッケー。

Node-RED で組んでみる

出来上がったフローはこちらです。 http request ノードで POST 送信をしつつ、その前の API 設定と書かれている change ノードで http request で送る設定をします。

API 設定と書かれている change ノードの設定です。

まず、

  • msg.url
    • 今回の Deployment ID や API バージョンを設定した自分のプロジェクト用のエンドポイント
  • msg.headers.api-key
    • 今回のプロジェクトの API キー
  • msg.payload
    • {} で、以降にオブジェクトを設定するために初期化してます

  • msg.payload.messages
    • メッセージをぶら下げるために [] で空の配列を準備
  • msg.payload.messages.0.role
    • user を設定します
  • msg.payload.messages.0.content
    • 「こんにちは!」とこちらからのプロンプトを入れます

http request ノードの中身です。

  • メソッド
    • POST
  • 出力形式
    • JSON オブジェクト

で指定します。

動かしてみる

inject ノードのボタンを押して動かします。

無事 API から返答が帰ってきて msg.payload.choices[0].message.content に返答が帰ってきました!