ほりひログ

所属組織の製品 (Azure とか) に関連する内容が多めだけど、個人の見解であって、所属組織を代表する公式情報ではないです。

Azure Functions OpenAI Extensionのモデルを呼び出しごとに切り替えてみる

Hack Azure #16 Microsoft Build 2024 Recap

激ツヨが過ぎるメンバーが、Buildで発表されたAzure FunctionsのFlex Consumption*1やCosmos DBのベクトル検索などを熱く語る場だった。

www.youtube.com

その中でAzure Functions OpenAI Extensionを使った関数の実装について「モデルの切り替えはちょっとテッキーなことが必要」と触れられてた*2ので、どういうことか試してみた。

サンプルを見てみる

まずはAzure Functions OpenAI Extensionにあるサンプルを確認。

github.com

OpenAIの入力バインディングmodelというパラメータがありここにデプロイ名を指定する*3

このサンプルの場合%CHAT_MODEL_DEPLOYMENT_NAME%という値が入っている。
この%~~%環境変数を参照するための書式なので、このサンプルでは環境変数CHAT_MODEL_DEPLOYMENT_NAMEに設定されたデプロイ名を使うことになっている。

環境変数なのでプロセス自体を再起動しないと切り替えられないし、複数の環境変数を用意してもバインディングのパラメータに設定できる環境変数は一つなので、それぞれに対応した関数を複数用意することになる。

なので、ここを環境変数ではなく、呼び出しごとに値が変えられるものにしてみる。

呼び出しごとにデプロイを切り替えてみる

とりあえず検証はTypeScriptで。
ChatですらないCompletions APIのラッパー関数を作ってみた。

github.com

バインド式を使って、パスの一部からプロンプトを、そしてdeploymentというクエリーパラメータからOpenAIモデルのデプロイ名を取ってきている。
このエンドポイント設計のセンスはひとまず目を瞑ってもらって、これをエンドポイントにHTTP GETすると、クエリーで指定のデプロイを使って一問一答する。

deploymentパラメータに別のデプロイ名を指定すると、そっちを使うように動くので、バインド式を使えば呼び出しごとにデプロイを切り替えることはできそうだ。

ただし呼び出しごとにAOAIリソース自体を切り替えることはできてない。
これはAzure Functions OpenAI Extensionが使うOpenAI(Azure OpenAI)のエンドポイントが環境変数AZURE_OPENAI_ENDPOINTから取ってきているから。

あくまで一つのAOAIリソースにあるいくつかのデプロイの中で切り替えている、という点に注意。

もちろん関数処理のコードでもデプロイ名は取れるので、関数の処理をモデルごとにより詳細に切り替えることは可能だろう。

まとめ

Azure Functions OpenAI Extensionでバインド式を使えば、一個の関数でもデプロイ名を呼び出しごとに切り替えることができることはわかった。

今回はサクッと検証したかったので、URLにデプロイ名とかプロンプトを書いたが、どうしてもリクエストボディとして指定したければ、一度Blobに保存してそれをトリガーに別の関数を起動する、とかでできなくはない*4

そもそもとして

「Hack Azure で言ってたのはそういうことじゃないんだよ」であれば、コメントでもX上でもご指摘を。


*1:このブログでも書いた。https://uncaughtexception.hatenablog.com/entry/2024/05/22/082716

*2:https://youtu.be/nVjtKbjWiJg?t=2217

*3:パラメータ名がOpenAI由来の"model"で、でも使うのはデプロイ名、というのがずっとモヤモヤする

*4:APIが非同期になる、とか設計上考えることは多い