Azureを使ってRealTime APIのAudio RAGを試す
はじめに
OpenAI DevDayでchatGPTのAdvanced Voice ModeのAPI版ことRealTime APIが発表されました。
Azure OpenAIでも利用可能となり、Azure Ai Serachと組み合わせてVoice to VoiceでRAGを試せるサンプルアプリが公開されているのでこれを試します。
以下のリポジトリです。
ちなみに以下のようになります(公式のサンプル動画)****。
前提条件
- Azure利用登録(サブスクリプション作成)が済んでいること
環境は以下です。
- windows
- docker desktop
- cursor(vscode)
- vscode Dev Containers拡張機能
概要
READMEの案内に従い進めます。
大まかには
- Azure側の準備
- Azure OpenAI
- Storage Account
- AI Search
↓
- アプリの起動
- .envの準備
- dev containers起動
- アプリ起動コマンド
の流れです。
先日見たときはDevContainersはなかったのですが今日見たところ追加されていたのでせっかくなのでこれを利用します。
local環境で起動する方法もREADMEに記載されているのでlocal起動したい方は参考にしてください。
Azure側の準備
gpt-4o-realtimeデプロイを作成(Azure OpenAI)
AzurePortalからAzure OpenAIのリソースを作成します。
このときリージョンはRealTime APIの対応リージョンを選んでください。今回はEast us2を選びます。
※上記の「名前」は後で使うのでコピーしておいてください。
作成が終わったら作成したAzureOpenAIのリソーストップ画面から「Azure OpenAI Studioに移動する」をクリックしてAzure OpenAI Studioに移動します。
Azure OpenAI Studioが開いたらサイドバーから「モデルカタログ」を選び、「gpt-4o-realtime-preview」を選びます。
開いた画面で「デプロイ」を選びます。
gpt-4o-realtime-previewのデプロイ画面が開きます。設定はデフォルトです。
下の画面では1分あたりの要求レート数が0になっていますが、はじめて作成する場合は0以外が選べると思います。
(私は同じリージョンですでに上限いっぱいのデプロイを作成しているので0しか選べなくなっています。)
デプロイが終わると以下の画面が開くので「キー」をコピーしておいてください。
同様にしてembedding用のモデルもデプロイしておいてください。今回は「text-embedding-ada-002」にしています。
検索したいpdfのアップロード(Storage Account)
まずはpdfアップロード用のStorage Accountを作成します。
Azureポータルから「Storage Account」と検索してStorage Accountを作成します。
映っていませんが「基本」以外の項目はデフォルトです。
作成が終わったら「構成」タブから「BLOB匿名アクセスを許可する」を有効化します。
セキュリティ的に本来非推奨ですが、今回はデモ目的なのでこれでいきます。
次にpdfを格納するコンテナを作成します。「ストレージブラウザー」>「Blobコンテナー」からコンテナを追加します。
匿名アクセスレベルは「コンテナー」にしています。
作成したコンテナを選択し、「アップロード」からpdfをアップロードします。
今回は「負けヒロインが多すぎる」のwikpediaをpdfにしたものをアップします。
RAG用のインデックスの作成(Azure AI Search)
次はpdfをインデックスにしておくためにAI Searchを作成します。
Azureポータル上から「AI Search」と検索し、AI Searchのリソースを作成します。
今回は以下のように作成します。
AI Searchは少し高めなので価格レベルは「Free」にしています。ただ、Freeにするとサンプルがそのまま動作しないのとRAGの精度が落ちるのできちんと実用性を評価するのであれば価格レベルを上げることをおススメします。
作成できたら作成したAI Searchリソースのトップ画面から「データのインポートとベクター化」を設定します。
画面に従い操作します。
Blob Storageを選択
作成したコンテナの情報を入力(Blobフォルダーは空でいい)
ベクトル化に使うembeddingモデルの指定
次の「画像をベクター化してエンリッチする」と「詳細設定」はデフォルトのまま進み最後に「作成」を押します。
ここまで操作すると先ほどStorageAccountにアップロードしておいたpdfがベクトル化されたうえでAI Searchにインデックスとして登録されます。
出てきた画面で「検索」を押すと以下のようにインデックスが作成されていることがわかります。
作成されたインデックスの名前は後で使うのでコピーしておいてください。(vector-17280~の部分です。)
最後にAI Searchリソースのトップ画面からurlを、キー画面から「プライマリ管理者キー」をコピーしてAzure側の準備は終わりです。
アプリの準備
powershellでgit clone
git clone https://github.com/Azure-Samples/aisearch-openai-rag-audio
cursorでフォルダを開きapp/backend/
に.env
を作成します。以下の公式サンプルを参考にAzureで作成した値、取得した値で書き換えます。
AZURE_OPENAI_ENDPOINT=wss://<your instance name>.openai.azure.com
AZURE_OPENAI_DEPLOYMENT=gpt-4o-realtime-preview
AZURE_OPENAI_API_KEY=<your api key>
AZURE_SEARCH_ENDPOINT=https://<your service name>.search.windows.net
AZURE_SEARCH_INDEX=<your index name>
AZURE_SEARCH_API_KEY=<your api key>
左下の「><」を押して「コンテナで再度開く」を押し、DevContainerを起動します。
少し待つと新しいVscode(Cursor)画面が開きます。
普通はこのままアプリを起動すればよいのですが、今回はAI SearchをFreeで作ってしまったので少し変更が必要です。
app/backend/ragtools.py
のsemantic
の部分をsimple
に変更します。
変更したらアプリを起動します。
cd app
./start.sh
エラーがなければ少し待った後以下が表示されます。
======== Running on http://localhost:8765 ========
http://localhost:8765/
にアクセスし、以下の画面が開けば成功です。
さっそく、マイクボタンを押して会話を始めます。
マイクボタンは自分が話し終わったときにオフにする必要はありません。1回押したらすべての会話が終わるまでそのままで大丈夫です。
会話を始めて負けヒロインが多すぎるの内容について尋ねると以下のように参照がデータ表示されて音声で回答が返ってきます。
ちなみに「ヒロインは誰?」と聞いたら、「⼋奈⾒杏菜さんです。」とのことでした。
まあ、合ってるか、、
おわりに
sampleとは言いつつも、Azureのリソースをひととおり使い、アプリもreactとpythonで書かれているかなり真似のしがいがある本格サンプルです。
これをベースにいろいろ手を加えていくのもいいかもな、、と少し思っています。
以上です、ありがとうございました。
Discussion