こんにちは、CCCMKホールディングス TECH LABの三浦です。
いつの間にかこの会社に勤めて10年が経っていました。10年前はニューラルネットワークやディープラーニングが少しずつ浸透してきたころで、従来の機械学習とは何が違うのか、といったことを調べていた気がします。あれから10年、ディープラーニングの分野ではTransformerが生まれ、いつの間にか人の思考を代理でこなしてくれるようなAIまで誕生し、技術の進化のスピードにびっくりします。次の10年はどうなるんだろうと色々と考えてしまいます。
さて、今年に入ってからずっと楽しみにしていたのですが、ついにMicrosoftのAzure AI Studioが一般公開(generally available)になりました!
今年一番最初に見た動画がAzure AI Studioのデモ動画で、それがとても面白い内容でずっと気になっていました。
以前プレビュー版を触ってみてまとめた記事がこちらです。
LLMを使ったアプリケーションの開発がAzure AI Studio上で一通り出来そうだなと感じたのですが、実務での活用は一般公開を待ってからにしよう、と考えていました。一部機能はまだプレビューの状態ですが、大部分が一般公開されたので、今回さっそくAzure AI Studioを使ってみたのでその内容をまとめたいと思います。
Azure AI Studio
Azure AI Studioは生成AIを使ったアプリケーションを開発するための統合プラットフォームです。
Azureで生成AIを使った、例えば外部データと接続したRAG(Retrieval-Augmented Generation)の手法を活用したアプリケーションを開発しようとすると結構色々なリソースが必要になり、そのリソースごとにさらに色々な設定が必要になります。
たとえばデータの格納と検索機能をAzure AI Searchで実装しようとすると、取り込み処理はAzure AI Searchの画面で行いますし、取り込んだ元のデータとインデックスの紐づけも自身で意識しておく必要があります。また使用するLLMはAzure OpenAI Studioで管理する必要がありますし、アプリケーションに対する入力と出力、それから回答時の参照情報をログとして記録したい場合はその処理の実装も必要です。
これら一つ一つはそれほど大きな作業負荷ではないのですが、こういったプロジェクトが複数発生した場合、どのリソースがどのプロジェクトで使われているのかが分かりにくくなったり、リソースの構成が冗長になってしまったりします。
Azure AI Studioを使うことで、プロジェクトごとにはもちろん、複数のプロジェクトで共有したいリソースもAzure AI Studio上で管理することが出来ます。たとえばAzure OpenAI Serviceは複数のプロジェクトで共有し、Azure AI Searchはプロジェクトごとに個別に設定する、といった構成もAzure AI Studioの画面を通して作ることが出来ます。
Azure AI Studioにはリソースの管理以外にもたくさんの機能があるのですが、私が個人的に面白いなと思ったModel catalogとPrompt flowについて次に取り上げたいと思います。
Model catalog
Model catalogにはAzure OpenAI Serviceのgpt系のモデルからMeta社のLlama, Hugging Faceのモデルなど、ローカルで動かせるものを含めて現時点で1,600以上のモデルの情報が格納されています。Model catalogでそれらのモデルの詳細を確認し、使いたいものがあればそれを動かすためのコンピューティングリソースを含めてその場でデプロイすることが出来ます。デプロイが完了したら、APIとしてその推論機能を利用することが出来るようになります。
Model catalogだけでなく、Model benchmarksには各生成AIの性能評価の結果がまとめられており、それを見ながらより精度の高い生成AIを選択することが可能になっています。
モデルのデプロイオプションとしてサーバレスタイプもあります。サーバレスではデプロイしたモデルを従量課金制で利用できるようなのですが、現在日本のリージョンには対応していませんでした。
Prompt flow
Prompt flowはアプリケーションのロジックを開発するための機能です。ノードをつないでグラフとして処理を書くことが出来、基本形のRAGの処理であればコードを書かなくても作ることが出来ました。
基本的な生成AIアプリのロジックを作ってみました。
ここからはAzure AI Studioで2つの基本的な生成AIアプリのロジックを作ってみたのでご紹介したいと思います。1つは自分の書いたブログ記事を参照して回答してくれるボットでもう一つが画像を含んだ質問について回答してくれるボットです。
Azure AI Studioでアプリケーションを開発する場合は、まずProjectを作成する必要があります。1つのProjectの中に複数のアプリケーションを開発することも出来ます。
ブログ記事参照ボット
ここで紹介する作業は使用するLLM(Azure OpenAI Serviceのモデル)のデプロイ、データの取り込み、Prompt flowによるロジックの構築です。
1. LLM(Azure OpenAI Serviceのモデル)のデプロイ
ここではAzure OpenAI Serviceのモデルを使うのですが、そのためにはProjectから使用するAzure OpenAI ServiceリソースへのConnectionを作成します。Connectionの作成はProjectのsettingから行うことが出来ます。
いくつか選択肢が表示され、その中から"Azure OpenAI Service"を選択します。
あとは自身のアカウントに紐づいているAzure OpenAI Serviceのリソースを選択したらConnectionの作成が完了です。
Connectionが出来ると、Model catalogからAzure OpenAI Serviceのモデルを選択し、デプロイ出来るようになります。ブログ記事参照ボットでは回答生成用のLLMに加え、埋め込み表現生成用のLLMが必要です。回答生成用に"gpt-35-turbo-16k", 埋め込み表現生成用に"text-embedding-ada-002 "などを選ぶことが出来ます。
2. データの取り込み
参照させるデータをAzure AI Searchに取り込み、Indexを作成します。"Indexes"というメニューから進めることでデータのアップロードからIndexの作成を行うことが出来ます。
既存のAzure AI Searchを選ぶことも出来ますし、この場でAzure AI Searchの新規リソースの作成も可能です。またIndexの作成にVirtual machineの起動が必要です。様々なオプションから選択することが出来ますが、いずれにせよコストが発生します。
あとは埋め込みモデルがデプロイされたAzure OpenAI Serviceを指定すると、Indexの作成を開始することが出来ます。
3. Prompt flowの作成
Indexの作成が完了したら、アプリケーションのロジック部分をPrompt flowで作成していきます。Prompt flowはいくつか用意されているタイプから選んで作成していきます。今回は"Chat flow"を選択しました。
Prompt flowを実行するため、VMの起動が必要です。VMの起動はPrompt flowの編集画面の右上のボタンをクリックして行うことが出来ます。
VMが起動すると、Prompt flow用の様々なToolを選択することが出来るようになります。"Index Lookup"というツールでIndexから関連情報を取得できるようになります。
予め追加されている"Chat"というノードではLLMに渡すプロンプトを定義することが出来ます。プロンプトの記述はJinjaテンプレートで行います。
テンプレートの中の変数と各ノードの出力を紐づけることで動的にプロントが変更されます。ここでは"{{context}}"という変数に"Index Lookup"の出力結果を埋め込むようにしています。
これで基本的なRAGのロジックは完成です。
右上の"Chat"をクリックすると、作成したPrompt flowの動作を確認することが出来ます。
画像を含んだ質問回答ボット
Azure OpenAI Serviceのgpt-4 vision previewを使うと画像を含んだ質問に回答出来るボットを作ることが出来ます。最後にこのボットをPrompt flowで作ってみた話をご紹介したいと思います。
まず事前にgpt-4 vision previewのデプロイを済ませておきます。そしたら先ほどと同様に、"Chat flow"タイプの新しいPrompt flowを新規作成します。
画像を受け付けるために、テキストだけのChatとは少し異なる対応が必要になります。
1. questionのTypeを"list"にする
Chat flowタイプのPrompt flowのユーザー入力としてあらかじめ"chat_history"と"question"が与えられていますが、"question"の方のTypeを初期値のstringからlistに変更する必要があります。
2. 画像対応のノードを使用する
元々設定されている"Chat"ノードでは画像を受け付けることが出来ないため、画像に対応したノードに変更します。More toolsから選べる"Azure OpenAI GPT-4 Turbo with Vision"を選びます。
ノードの設定ではConnectionやdeployment_nameに使用するgpt-4 vision-previewの値を設定し、Promptを次のように設定します。"question"をstringからlistに変更したので、Jinjaテンプレートのfor文の記述でquestionの値を展開しています。
Prompt flowのoutputの設定を行い、Chatを開始するとこのように画像を含んだ質問と回答を得ることが出来ます。
まとめ
今回は先日一般公開されたAzure AI Studioの機能をいくつか使ってみながら生成AIアプリケーションの開発の手順を試してみました。Azureで生成AIアプリケーションを開発しようとすると色々なリソースの準備が必要になりますが、Azure AI StudioではそれらをAzure AI Studioから行うことが出来る点が便利だと思いました。
今回はModel catalogからAzure OpenAI Serviceのモデルをデプロイしましたが、その他のモデルもデプロイすることが出来ます。そちらも試してみたのですが、Prompt flowからデプロイしたモデルを呼び出す上手な方法を見つけることが出来ませんでした。今後使ってみながら良い方法が見つかったら、また別の記事で紹介させて頂きます。