はじめに
Azure OpenAIを使うなら、マネージドIDでセキュアに利用したいですよね。キーとか持ちたくないです。関連情報は色々とあるもののNodejsのFunctionからという情報があまり見つからなかったので、こちらに記事として残します。
マネージドIDをつかうAzure FunctionのNodejsのコード
例外処理も何もいれないで素のChatGPTからの返り値をそのままメッセージとして返してるコードです。ポイントは、@azure/identity
をつかって、new DefaultAzureCredential()
をいれてクライアントを作ってるところくらいでしょうか
環境変数としては1.エンドポイントと2.モデル名を持っています。(キーはありません)
なお、利用したライブラリは@azure/openai
です。なんか色々あるんですが、ここにもある通り一番公式っぽいのでそれを使いました。
クイック スタート: Azure OpenAI Service で ChatGPT と GPT-4 の使用を開始する
マネージドIDについてはこちらに情報があります。
https://learn.microsoft.com/ja-jp/javascript/api/overview/azure/openai-readme?view=azure-node-preview#using-an-azure-active-directory-credential
ここではAzure AD認証として、テナントIDとかの環境変数が~とか書いてますが、マネージドIDでやるのでAADにまつわる環境変数は不要です。
module.exports = async function (context, req) {
const { OpenAIClient } = require("@azure/openai");
const { DefaultAzureCredential } = require("@azure/identity");
const client = new OpenAIClient(
process.env.OPENAI_API_ENDPOINT, //ここにエンドポイント
new DefaultAzureCredential()
);
const messages = [
{ role: "system", content: "You are an AI assistant." },
{ role: "user", content: "Hello" },
];
const result = await client.getChatCompletions(process.env.OPENAI_ENGINE, messages); //ここにモデル名
let message;
for (const choice of result.choices) {
message = choice.message;
}
context.res = {
status: 200,
body: { message: message },
headers: {
"Content-Type": "application/json",
},
};
};
Azure FunctionでマネージドIDを有効にする
ポータルからだと、「関数アプリ」の「ID」から状態を「オン」にして保存するだけです。
Azure OpenAI Servcieでロールを設定する
Azure OpenAI Service の「アクセス制御(IAM)」から「+追加」します。
割り当てるロールは、公式に書いてある通り「Cognitive Service ユーザ」を選びます。(OpenAI ユーザの方がよさそうですが、公式に書いてあるほうで)
その上で、マネージドIDとして先に割り当てたFunctionを指定します。
以上です。
まとめ
キーをつかわずにAzure Function(nodejs)からAzure OpenAIサービスが呼び出せます。
{
"message": {
"role": "assistant",
"content": "Hello! I'm an AI assistant, ready to help you with any questions or tasks you may have. How can I assist you today?"
}
}
これだけではありますが、javascriptの場合いくつもoepnaiのライブラリがあってちょっと混乱したので、整理のためにまとめてみました。Azure App Servcie とかでも基本同じ流れですし、pythonや.NETならまた違うライブラリ違う記述方法になりますね。
あとはFunctionにAAD認証をつけたりVNETにいれたり、Azure OpenAIはプライベートエンドポイントを使うなどすればガチガチの環境のできあがりですが、ひとまずマネージドIDを使うとキー漏洩からは安心ということで。