生成AIでもっとスマートなスピーカーを作りたい!第一弾【生成AIとの対話編】

はじめに

こんにちは、AIコンサルティンググループの清水です。

皆さんはスマートスピーカーをどのくらい活用していますか?私は朝の目覚ましや天気予報、家の家電の操作などに使っており、欠かせない存在になっています。

そんなスマートスピーカーですが、不便なところもいくつかあります。それは、ある程度定型文で指示する必要があるところです。 曖昧な質問をすると、「すみません、よくわかりません」と返されてしまいます。

そこで生成AIを使って柔軟に回答してもらおうと思います。最終ゴールは、家電操作やネットの検索なども対話で柔軟に判断して、ツールを実行する"もっとスマートなスピーカー"です!

今回はそんな「生成AIを使って”もっとスマートなスピーカー”を作りたい」シリーズの第一弾として、生成AIと自由に対話をする部分を作成しました!

技術構成

技術構成としては、以下の図のようになっています。 今回の実装範囲は、図の緑枠内の部分です。音声で指示を出し、生成AIからの応答をAlexaに喋ってもらいます。

全体のシステム構成

なお、システム内の各要素はそれぞれ以下の役割を持ちます。

  • Alexa Skill:ユーザの音声入力をテキストとして受け取る。また、生成AIの応答テキストを音声で伝える。

  • Azure Functions:Alexaからテキストが送信されたことを検知し、生成AIのAPIへテキストを送信し、その応答をAlexaに返信するスクリプトを実行する。

  • Azure OpenAI Service:Azure Functionsからの入力を受けて回答を送信する。

関数の実行については、Azure Functionsではなく、AWS Lambdaでも問題ありません。

Alexaとの対話部分(AlexaスキルとAzure Functionsとの連携)

最初にユーザが話しかけて、Alexaが何か応答したり、オウム返しするようなものを作っていきます。 まずは、Alexaの応答内容を決めるAzure Functionsから作成しました。
Azure Functionsの公式クイックスタートを参考に、環境構築をしました。VS Codeとの連携はしやすく、手元での検証もできるので便利です。 Azure Functionsのサンプルテンプレートには、HTTPリクエストから関数を実行できるHTTP トリガーがあり、こちらをもとに動作チェックをしました。 その後、Alexaスキルと連携しました。以下の図のようにスキルの呼びかけ名(今回はアシスタントの略で「アシタン」にしています)を言うと起動して、「ようこそ、Alexaスキルへ」を返すようにしました。

参考:Visual Studio Code を使用して Python 関数を作成する - Azure Functions | Microsoft Learn

Azure Functionsと連携したAlexa Skill開発

しかし、Alexaの応答に関して、単語を会話ごとに変えることは容易なのですが、オウム返しのような会話ごとに自由な文を応答させることは少し難しいので、さらに調査が必要でした。 Alexa側の仕組みもいろいろと変更されているようで、新しい記事をめぐり、Developer Console上や起動する関数を修正すると、上手く動作するようになりました。 最終的に、スキルの呼び出し名「アシタン」を投げかけて起動し、続けて質問を投げるとオウム返しのように返事してくれるようになりました。

参考:アレクサスキルで自由入力の手順 【2024/11版】 #Alexa - Qiita

生成AIとの対話部分(Azure FunctionsとAzure OpenAI Serviceとの連携)

次は、オウム返しから中身のあるスマートな回答を生成AIからもらえるようにします。 まずは、Azure OpenAI Serviceとの連携をします。連携自体はすぐに出来ましたが、そのままだと聞きづらい文章でしたので「あなたは音声AIアシスタントです。読み上げやすいような文章で端的に回答してください。」というようなシステムプロンプトにしています。また、起動中のみ対話履歴を覚えるようにしていて、終了すると前の対話内容は忘れるようになっています。 本当は対話履歴をずっと含ませたいですが、どこかに対話履歴を保存することも検討する必要があり、シンプルな形にしています。

Alexa経由での生成AIとの対話の図

Azure OpenAI Serviceのコンテンツフィルター処理

上手くスマートな回答がきて喜んでいましたが、「電気を消して」で試してみると、以下の図のようにコンテンツフィルターで回答してもらえませんでした。 今回は生成AIのAPIは、Azure OpenAI Serviceを使いましたが、その中にコンテンツフィルター機能というものがあります。本来はユーザーの有害な指示を拒否するためのものですが、今回のように短文だと、解釈の幅が広がり、有害なコンテンツとして検出されていました。今回だと、「電気」というワードが自傷行為に含まれやすいのだと思います。

参考:Azure OpenAI Service のコンテンツのフィルター処理 - Azure OpenAI | Microsoft Learn

Azure OpenAI Serviceでのコンテンツフィルター処理

フィルターオフをしたいところですが、安全性が大きく低下するため、チャットに送るテキストに「音声AIアシスタントへの質問:」のように文脈を追記する形をとることで、問題なく動作することができました。

チャットで文脈を補う例

まとめ

”もっとスマートなスピーカー”の第一歩として、対話部分のみを作成しました。

次回は、柔軟にツールを使いこなせるようなスマートなスピーカーとしてAlexaを成長させていきたいと思います!

ご相談を希望される方は、お気軽にこちらのお問い合わせフォームからご連絡ください。

AITCお問い合わせフォーム

筆者
AIコンサルティンググループ
清水大輝