/POC-Ignite2023-CallAutomation

Ignite Japan 2023 でデモを行った Azure Communication Service Call Automation と Azure OpenAI を連携させた POC シナリオです。

Primary LanguageC#MIT LicenseMIT

Ignite Japan 2023 での発表内容

Video

アーキテクチャー

今回のアーキテクチャーは以下の通りです。

00

簡単な流れは以下の通りです。

  1. ユーザーが Azure Communication Service に登録された電話番号に架電する。
  2. Azure Communication Servicce の Incoming Call をトリガーとしてサーバーサイドアプリケーションの API に Webhook を実行する。
  3. Webhook 要求にサーバーサイドアプリケーションが応答する。
  4. ユーザー発話内容に基づいて Azure Cognitive Service が Speech-to-Text、Azure OpenAI Service からの応答内容に基づいて Text-to-Speech を実行する。
  5. ユーザー発話内容に基づいて Azure OpenAI Service が回答内容を生成する。

構成手順

以下を構成、実装する事で動作確認用環境の構成が可能です。

事前準備

Azure Open AI リソースの作成

  1. 手順ページに則り、Azure Open AI Service リソースを作成します。

  2. 手順ページに則り、モデルを作成します。

    ※本サンプルでは gpt-35-turbo-16k を利用しました。

Azure AI multi-service account リソースの作成

  1. 手順ページに則り、Azure AI multi-service account リソースを作成します。

  2. Azure ポータルより作成した Azure AI multi-service account リソースの [ENDPOINT]値をコピーします。

Event Grid System topic リソースの作成

  1. 手順ページに則り、Azure Communication Service 向け Event Grid System topic リソースを作成します。

Azure Communication Service リソースの作成

  1. 手順ページに則り、Azure Communication Service リソースを作成します。

  2. 手順ページに則り、接続文字列をコピーします。

  3. 手順ページに則り、電話番号を取得します。

  4. 手順ページに則り、Azure AI Service へのアクセス許可を Azure Communication Service マネージド ID に与えます。

Azure DevTunnel の構成

  1. 手順ページに則り、DevTunnel CLI をインストールします。

  2. 以下コマンドを実行し、DevTunnel をホストします。

    devtunnel create --allow-anonymous
    devtunnel port create -p 5165
    devtunnel host

    出力された[Connect via browser:]に続く URL 値をコピーします。

  3. 事前に作成した Event Grid System topic リソースのイベントサブスクリプションを以下のような設定値で作成します。

    01

  4. Event Grid System topic リソースの追加イベントサブスクリプションを以下のような設定値で作成します。

    01-01

Azure Function App の構成

.NET 7.0 SDK の準備

  1. .NET 7.0 のインストールページから、.NET 7.0 SDK をインストールしてください。

Azure CLI の準備

  1. 手順ページに則り、Azure CLI をインストールしてください。

Azure Functions Core Tools の準備

  1. Azure Functions Core Tools の GitHub ページ の Installing より、Azure Functions Core Tools をインストールしてください。

ユーザー認証用のアプリケーションの登録

Microsoft Search API を使用するために、Azure Active Directory アプリケーションを登録します。

  1. 手順ページに則って、ユーザー認証用アプリケーションを登録してください。
  2. 登録したアプリケーションページより、左のナビゲーションバーから「API のアクセス許可」を選択し、以下のアクセス許可を追加してください。必要なアクセス許可は、Microsoft Search API ページ の「エンティティ型にも戸津板検索の範囲設定」よりご確認いただけます。
  3. 登録したアプリケーションページより、左のナビゲーションバーから「証明書とシークレット」を選択し、新しいクライアント シークレットの作成を行ってください。この際に作成されたシークレットの値は後ほど使用するので、控えておいてください。(クライアント シークレットの値は一度しか表示されないので注意してください。)

関数の準備

以下のコマンドでサンプル コードをローカルにクローンしてください。

git clone https://github.com/marumaru1019/POC-MS-Search-Function

Azure リソースの作成と関数のデプロイ

  1. サンプル コードをクローンしたディレクトリまで移動してください。
    cd /path/to/POC-MS-Search-Function
    
  2. Azure にログインしてください。
    az login
    
  3. 任意のリージョンにリソース グループを作成して下さい。リソースグループ名は任意のものを指定してください。
    az group create --name <リソースグループ名> --location <リージョン>
    
  4. 3 で作成したリソースグループとリージョン内に、Blob ストレージを作成して下さい。ストレージアカウント名は任意のものを指定してください。
    az storage account create --name <ストレージアカウント名> --resource-group <リソースグループ名> --location <リージョン> --sku Standard_LRS --allow-blob-public-access false
    
  5. Azure に関数アプリを作成してください。関数アプリ名は任意のものを指定してください。
    az functionapp create --resource-group <リソースグループ名> --consumption-plan-location <リージョン> --runtime dotnet-isolated --functions-version 4 --name <関数アプリ名> --storage-account <ストレージアカウント名>
    
  6. 作成した関数アプリに、ClientId、TenantId、ClientSecret を環境変数として設定してください。クライアント ID、テナント ID、クライアント シークレットは、ユーザー認証用のアプリケーションの登録で作成したものを使用してください。
    az functionapp config appsettings set --name <関数アプリ名> --resource-group <リソースグループ名> --settings ClientId=<クライアント ID> TenantId=<テナント ID> ClientSecret=<クライアント シークレット>
    
  7. Azure に関数をデプロイしてください。
    func azure functionapp publish <関数アプリ名>
    

実行

構成ファイルの定義

[appsettings.json]ファイルを以下の通り環境値に置き換えます。

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  "DevTunnelUri": "コピーした Azure DevTunnel URL",
  "CognitiveServiceEndpoint": "Azure AI multi-service account の Endpoint",
  "AcsConnectionString": "Azure Communication Service の接続文字列",
  "AzureOpenAIServiceKey": "AOAI KEY",
  "AzureOpenAIServiceEndpoint": "AOAI ENDPOINT",
  "AzureOpenAIDeploymentModelName": "AOAI モデル名",
  "FunctionsEndpoint": "Function URL",
  "WeatherApiKey": "OpenWeatherMapのAPIキー"
}

アプリケーションの実行

  1. ルートフォルダーで以下コマンドを実行します。

    dotnet run
  2. 以下のような出力が表示されるとサーバーサイドアプリケーションの実行完了です。

    02

動作確認

  1. 取得した電話番号に対して架電を行います。

  2. 任意の質問を問いかけ、日本語で応答があれば動作確認完了です。