Hack Azure #16 Microsoft Build 2024 Recap
激ツヨが過ぎるメンバーが、Buildで発表されたAzure FunctionsのFlex Consumption*1やCosmos DBのベクトル検索などを熱く語る場だった。
その中でAzure Functions OpenAI Extensionを使った関数の実装について「モデルの切り替えはちょっとテッキーなことが必要」と触れられてた*2ので、どういうことか試してみた。
サンプルを見てみる
まずはAzure Functions OpenAI Extensionにあるサンプルを確認。
OpenAIの入力バインディングで model
というパラメータがありここにデプロイ名を指定する*3。
このサンプルの場合%CHAT_MODEL_DEPLOYMENT_NAME%
という値が入っている。
この%~~%
は環境変数を参照するための書式なので、このサンプルでは環境変数CHAT_MODEL_DEPLOYMENT_NAME
に設定されたデプロイ名を使うことになっている。
環境変数なのでプロセス自体を再起動しないと切り替えられないし、複数の環境変数を用意してもバインディングのパラメータに設定できる環境変数は一つなので、それぞれに対応した関数を複数用意することになる。
なので、ここを環境変数ではなく、呼び出しごとに値が変えられるものにしてみる。
呼び出しごとにデプロイを切り替えてみる
とりあえず検証はTypeScriptで。
ChatですらないCompletions APIのラッパー関数を作ってみた。
バインド式を使って、パスの一部からプロンプトを、そして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"で、でも使うのはデプロイ名、というのがずっとモヤモヤする