🙌

Azureを使ってRealTime APIのAudio RAGを試す

2024/10/04に公開

はじめに

OpenAI DevDayでchatGPTのAdvanced Voice ModeのAPI版ことRealTime APIが発表されました。

Azure OpenAIでも利用可能となり、Azure Ai Serachと組み合わせてVoice to VoiceでRAGを試せるサンプルアプリが公開されているのでこれを試します。

以下のリポジトリです。

https://github.com/Azure-Samples/aisearch-openai-rag-audio

ちなみに以下のようになります(公式のサンプル動画)****。

https://youtu.be/vXJka8xZ9Ko

前提条件

  • Azure利用登録(サブスクリプション作成)が済んでいること

環境は以下です。

  • windows
  • docker desktop
  • cursor(vscode)
  • vscode Dev Containers拡張機能

概要

READMEの案内に従い進めます。

https://github.com/Azure-Samples/aisearch-openai-rag-audio#voicerag-an-application-pattern-for-rag--voice-using-azure-ai-search-and-the-gpt-4o-realtime-api-for-audio

大まかには

  • 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を選びます。

Azure OpenAIのリソース作成

※上記の「名前」は後で使うのでコピーしておいてください。

作成が終わったら作成したAzureOpenAIのリソーストップ画面から「Azure OpenAI Studioに移動する」をクリックしてAzure OpenAI Studioに移動します。

Azure Open AIトップ画面

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を作成します。

Storage Account作成

映っていませんが「基本」以外の項目はデフォルトです。

作成が終わったら「構成」タブから「BLOB匿名アクセスを許可する」を有効化します。

Storage Account構成

セキュリティ的に本来非推奨ですが、今回はデモ目的なのでこれでいきます。

次にpdfを格納するコンテナを作成します。「ストレージブラウザー」>「Blobコンテナー」からコンテナを追加します。

コンテナ追加

匿名アクセスレベルは「コンテナー」にしています。

作成したコンテナを選択し、「アップロード」からpdfをアップロードします。

アップロード

今回は「負けヒロインが多すぎる」のwikpediaをpdfにしたものをアップします。

アップロード画面

RAG用のインデックスの作成(Azure AI Search)

次はpdfをインデックスにしておくためにAI Searchを作成します。

Azureポータル上から「AI Search」と検索し、AI Searchのリソースを作成します。

今回は以下のように作成します。

AI Search作成

AI Searchは少し高めなので価格レベルは「Free」にしています。ただ、Freeにするとサンプルがそのまま動作しないのとRAGの精度が落ちるのできちんと実用性を評価するのであれば価格レベルを上げることをおススメします。

作成できたら作成したAI Searchリソースのトップ画面から「データのインポートとベクター化」を設定します。

データのインポートとベクター化

画面に従い操作します。

Blob Storageを選択

Blob Storageを選択

作成したコンテナの情報を入力(Blobフォルダーは空でいい)

作成したコンテナの情報を入力

ベクトル化に使うembeddingモデルの指定

ベクトル化に使うembeddingモデルの指定

次の「画像をベクター化してエンリッチする」と「詳細設定」はデフォルトのまま進み最後に「作成」を押します。

ここまで操作すると先ほどStorageAccountにアップロードしておいたpdfがベクトル化されたうえでAI Searchにインデックスとして登録されます。

出てきた画面で「検索」を押すと以下のようにインデックスが作成されていることがわかります。

インデックス確認

作成されたインデックスの名前は後で使うのでコピーしておいてください。(vector-17280~の部分です。)

最後にAI Searchリソースのトップ画面からurlを、キー画面から「プライマリ管理者キー」をコピーしてAzure側の準備は終わりです。

AI Searchのurl

AI Searchのキー

アプリの準備

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.pysemanticの部分をsimpleに変更します。

query type変更

変更したらアプリを起動します。

cd app
./start.sh

エラーがなければ少し待った後以下が表示されます。

======== Running on http://localhost:8765 ========

http://localhost:8765/にアクセスし、以下の画面が開けば成功です。

アプリ画面

さっそく、マイクボタンを押して会話を始めます。

マイクボタンは自分が話し終わったときにオフにする必要はありません。1回押したらすべての会話が終わるまでそのままで大丈夫です。

会話を始めて負けヒロインが多すぎるの内容について尋ねると以下のように参照がデータ表示されて音声で回答が返ってきます。

検索ヒット画面

ちなみに「ヒロインは誰?」と聞いたら、「⼋奈⾒杏菜さんです。」とのことでした。

まあ、合ってるか、、

おわりに

sampleとは言いつつも、Azureのリソースをひととおり使い、アプリもreactとpythonで書かれているかなり真似のしがいがある本格サンプルです。

これをベースにいろいろ手を加えていくのもいいかもな、、と少し思っています。

以上です、ありがとうございました。

Discussion