見出し画像

[生成AI]共感型カウンセラーボットを作成する - Alexa音声アシスタント編

割引あり

この記事では、Amazon Alexaのスキル開発と生成AI(ChatGPT、Claude、Gemini)を活用して、音声対話型のAIアプリを無料で作成する方法を紹介します。音声アシスタントとして、日本で広く利用されているAlexaスキルを使います。

Alexaスキル開発は初心者にも扱いやすく、Amazonのリソースとガイドラインに従えば簡単にスキルを構築できます。全世界で何億台ものデバイスがAlexaに対応しています。これらデバイスと生成AIを連携させることで、多くのユーザーにリッチな対話機能を提供できます。

開発にはプログラミング言語Pythonの基礎知識が必要ですが、本記事ではステップバイステップで丁寧に解説します。Alexa開発者コンソールを使うことで、プログラミングを始める障壁となっている環境構築なしに開発を始められます。

これから作成するアプリは次のようなものです。Alexa開発者コンソールでデバッグした様子をスクリーンショットしました。このようにユーザーが対話の中で自分の問題を解決していきます。

図1 これから作成するアプリイメージ

免責事項

本記事で提供するプログラムコードや手順は、あくまで参考例です。開発環境などの違いにより、記事通りに動作しない可能性があります。特に、Alexa開発者コンソールはアップデートされるため、UIの変更や設定方法の変更などにより、記事の内容と異なる部分が出てくる可能性があります。本記事は、2023年3月時点の情報に基づいて作成されています。

また、本記事で提供するプログラムを実行した結果、発生した損害や問題について、著者は一切の責任を負いません。各種サービスの利用料金などは、読者ご自身の責任で管理してください。特に、生成AIのAPIは、使用量に応じて課金されるサービスです。APIの呼び出し回数やデータ転送量によっては、高額な料金が発生する可能性がありますので、ご注意ください。

本記事で作成するアプリケーションは、あくまでサンプルコードです。より少ない手順で生成AIを使ったアプリを動作させることを目的として作成されています。実際に運用する場合は、セキュリティ面や性能面でさらなる改善が必要です。必要に応じて、より強固な認証方式を検討してください。

各種のアカウントやアクセスキーの管理は、読者ご自身の責任で行ってください。アクセスキーを紛失したり、第三者に漏洩したりすることがないよう、十分にご注意ください。

以上の点を予めご了承の上、本記事をご活用ください。本記事が、読者の皆様のアプリケーション開発の一助となれば幸いです。


記事概要

この記事では、以下の3つのステップを通して、Amazon Alexaのスキル開発と生成AI連携により、音声対話AIアプリを作成する方法を解説します。

  1. 音声アシスタントと生成AI連携

    • Alexaスキルの基本と、生成AI連携を解説します。

  2. 基本的なAlexaスキル開発の流れ

    • ユーザーの発言(音声)を受け取り、その発言をテキスト(文字情報)として次の処理に渡すための設定を学びます。

  3. 生成AIを活用した実用的なスキルの作り方

    • カウンセリングAIアプリの作り方を例に、生成AIの活用方法を学びます。

上記の手順に従えば、初心者でも無理なく音声対話AIアプリが開発できます。Alexaの公式ツールと生成AIを組み合わせることで、より高度な対話機能を実現できます。

さらに視覚的な理解を深めるため、各ステップではイラストやスクリーンショットを用いた分かりやすい解説を心がけています。音声AIアシスタントの可能性を体験し、プログラミングの面白さを実感して下さい。

第1部 音声アシスタントと生成AI連携

音声アシスタント(Alexaスキル)の仕組みについて、日常生活でどのように使用するかを具体的な応答例と共に探ります。

図2 Alexaスキル

Alexaスキルは、私たちの言葉を理解し、応答するために二つの主要な要素を組み合わせています。一つ目は、「音声ユーザーインターフェイス(対話モデル)」です。これは、私たちが話しかけた時に、Alexaが何を聞き取り、どのように解釈するかを決定します。二つ目は、「アプリケーションロジック」です。これは私たちのリクエストに対する具体的な処理を担います。

例えば、朝の準備中に「Alexa、今日の天気は?」と尋ねたとしましょう。この瞬間から、Alexaスキルのしくみが活動を開始します。あなたの質問は、まず対話モデルを通じて処理され、Alexaは「天気」に関するリクエストとして認識します。対話モデルは、音声認識と自然言語処理の2つの技術が組み合わされています。音声認識がまず私たちの発話を文字に変換し、自然言語処理がその文章の意味を解釈するのです。

次に、このリクエストはアプリケーションロジックに送信され、そこで今日の天気情報の取得が行われます。そして、Alexaは「今日は晴れ時々曇り、最高気温は25度です」といった具体的な応答を返します。

この処理の裏では、アプリケーションロジックがクラウド上で動作しており、開発者はこのロジックをAlexaプラットフォーム、AWS、あるいは自身のサーバー上に構築することができます。この柔軟性により、天気予報だけでなく、ニュースの読み上げ、音楽の再生、家電の制御など、さまざまなスキルを創造することが可能になります。

さらにこのシステムを発展させ、生成AIのAPIサービスを接続することで、Alexaスキルは次のレベルへと進化します。この統合により、Alexaはプログラムされた応答だけでなく、幅広い自由な質問に対しても、リアルタイムで答えられるようになります。

音声アシスタントと生成AIの統合

図3 Alexaスキルと生成AIの連携

音声アシスタントは、生成AIの技術と連携することで、より高度な会話機能を実現しています。この2つの技術を橋渡しする重要な役割を果たすのが、APIと呼ばれる仕組みです。

APIとは、異なるシステム同士でデータをやり取りするための窓口のようなものです。例えば、Alexaスキルで「旅行の準備に役立つ情報を教えて」と尋ねれば、次のような流れでデータのやり取りが行われます。

  1. Alexaがユーザーの質問を文字データに変換(対話モデル)

  2. APIを通じて質問データを生成AIに送信(アプリケーションロジック)

  3. 生成AIが質問に対する回答データを作成

  4. 生成AIの回答データをAPIでAlexaに送り返す(アプリケーションロジック)

  5. Alexaが回答データを音声に変換して出力(対話モデル)

このようにAPIが入り口と出口の役割を果たすことで、Alexaと生成AIがスムーズにデータをやり取りでき、自然な会話が可能になるのです。

旅行の質問に対して、生成AIは「旅行に役立つガイドブックの選び方」「パスポートや海外旅行保険の準備」「エコノミークラス症候群に気をつける」など、さまざまな回答が期待できます。APIなしではこうした自由な回答は得られません。

APIの仕組みを利用すれば、Alexaスキルにさまざまな先端技術を組み込むことができます。ぜひ次の項で、実際のAPI活用方法を確認していきましょう。

第2部 基本的なAlexaスキル開発の流れ

音声アシスタントの開発を開始する前に、いくつかの準備が必要です。まず、開発環境を整える必要があります。これには、Amazon開発者アカウントの作成が含まれます。開発環境は、自前で準備する必要のない、ウェブエディターを使用します。

Amazon開発者アカウントの作成

Amazon開発者アカウントを作成すると、Alexa Skills Kit(ASK)を使ってAlexaスキルを作成し、公開することができます。Alexaの開発・公開は無料で行うことができます。Alexa Developer Official Site(Amazon Alexa Voice AI | Alexa Developer Official Site)にブラウザで接続してください。

図4 Alexa開発者サイト

「Sign In」ボタンを押して、アカウントの作成を開始します。

図5 Alexa開発者サインイン

「お持ちのAmazonアカウント(amazon.co.jp)」でアカウントでログインすることで開発者アカウントを申請します。Amazonからログインしたメールアドレスに確認コードが送られてくるので、そのコードを入力することにより、アカウントを作成できます。

次に、開発者登録情報を登録します。登録した開発者情報は簡単には変更できません。もしスキルの公開まで視野に入れているのであれば、公式の開発者アカウント作成ガイドを参照しながら、アカウントを作成することをおすすめします。

以上で、Amazon開発者アカウントの作成が終了しました。これで、音声アシスタントの開発が始められるようになります。次に、新規スキルを作成する方法を解説します。

Alexa新規スキルの作成

図6 Alexa開発者コンソール

Alexaスキル開発サイトに、Amazon開発者アカウントでログインします。ログインしたら、「コンソール」ボタンを押して、開発者コンソールに入ります。

図7 新規スキルの作成

開発者コンソールにアクセスしたら、「スキルを作成」ボタンをクリックしてください。するとスキル作成ページに移動します。表示言語が英語の場合は、画面左下から「日本語」を選択してください。

図8 スキル名

スキル作成(名前、ロケール)のページに移動しました(上の図)。スキル名は、機械学習(マシーンラーニング)を使ったカウンセリングスキルとして、「カウンセリングマシーン」と名付けました(名前は任意です。読者で自由につけてください)。

スキルの名前づけは、明確で覚えやすいこと(Alexaが認識しやすいこと)、ユニークなこと(既存のスキルと重ならないこと)などが重要になります。基本的に単語2つを合体した名前を使用します。特にマイクで音声によるテストを行うときには、スキルの名前によって認識しないことがあります。良い名前は、スキルの成功に大きく寄与します。スキルの目的や機能を最もよく表す名前を考えてみてください。

プライマリーロケールは、「日本語」を選びます。Alexaは多言語対応スキルを開発することができますが、主となる(プライマリー)ローケールをここで指定します。

画面右上の「次へ」をクリックして、次の設定に進みます。

図9 Alexaスキルエクスペリエンス

スキル作成(エクスペリエンス、モデル、ホスティングサービス)のページに移動しました。エクスペリエンスのタイプは「その他」を選びます。

モデルは、自由に開発を進めることができる「カスタム」を選びます。

ホスティングサービスは、「Alexa-hosted (Python)」を選びます。これを選ぶと、エンドポイント(アプリケーションロジックを処理するサーバー)を開発者が準備する必要がなくなり、開発の手間が激減します。

 画面右上の「次へ」をクリックして、テンプレートの設定画面に移動します。

図10 Alexaスキルテンプレート

スキル作成(テンプレート)のページで、「スクラッチで作成」を選びます。このテンプレートは最低限のコードがあらかじめ記載されているスキルが自動作成されます。開発者はこのテンプレートをもとに必要な機能を追加して、スキルを改造していくことができます。画面右上の「次へ」をクリックして、「選択内容を確認する」画面に移動します。

図11 Alexaスキル審査

スキル作成のための最後の画面です。ここに表示された設定内容が正しければ、画面右上の「スキルを作成する」をクリックして、スキルのビルドを開始します。数十秒待つと、自動的にスキルの開発画面に移動します。

図12 Alexa新規スキル

以上で、新規スキルの作成が完了しました。このスキルに含まれる基本機能を基に、開発者はさらにカスタマイズして独自の機能を加えることが可能です。次に、呼び出し名を確認します。右のメニューから「呼び出し」を選択して下さい。

呼び出しの設定

図13 Alexaスキル呼び出し

スキルの呼び出しのページを開いています。「スキルの呼び出し名」が、先ほど設定したスキル名を一緒であることを確認して下さい。もし違っていたら、スキル名「カウンセリングマシーン」を入力して、「スキルをビルド」ボタンをクリックします。以上で、呼び出しの設定は完了です。

開発途中で、スキル名を変更したいときも、図13の画面で設定を行って下さい。新しいスキル名を入力してからビルドし直すと、スキル名が更新されます。

次に、対話モデルのインテントの設定を行います。インテントとは、対話モデルで読み取った「ユーザーの意図(知りたいこと、やりたいことなど)」のことです。

インテントの設定

これから実装するのは、「カウンセラー」ロジックです。例えば、ユーザーの悩みや質問に対して共感的に受け入れて、ユーザーが自分の問題に気づくように導きます。そのためには、ユーザーの発語をそのままAlexaスキル(アプリケーションロジック)に渡す必要があります。まず、対話モデル(インテント)の設定から開始しましょう。

図14 Alexaスキルインテント

開発者コンソールの左側のメニューから「対話モデル / インテント」を選択してください。これにより、メインエリアにインテントの一覧が表示されます。

Alexaスキル開発では、「インテント」の設定は不可欠です。インテントとは、ユーザーの意図を識別し、どのような応答を返すべきかを定義するための仕組みです。たとえば、ユーザーが特定の行動を求める時、そのリクエストを理解して適切に対応するための指示をAlexaスキル(アプリケーションロジック)に提供します。

リストには、HelloWorldIntentのようなカスタムインテントと、AMAZON.〜のようなビルドインインテントの2種類のインテントが初めから設定されているはずです。

では、カスタムインテントを改造していきます。「HelloWorldIntent」をクリックして、HelloWorldIntentの設定画面に移動してください。

図15 Alexaスキルインテントの設定

HelloWorldIntentの設定画面を開いています。既にいくつかのサンプル発話(ハローなど)が登録されていますが、新しいカスタム発話を試すために、これらのサンプルを削除しましょう。削除するには、各サンプルの横にあるゴミ箱アイコンをクリックします。次に、「{message}」というサンプル発話を追加します。「{message}」の波括弧で囲まれた部分は、ユーザーからの任意の発言を捉える「スロット」として機能します。このスロットは、ユーザーの発言をアプリケーションロジックに渡すために使用されます。

インテントスロットにおいて「スロットタイプ」を指定することで、スロットが受け取る情報の種類を定義します。スロットタイプには、開発者がカスタマイズできる「カスタムスロットタイプ」と、Alexaが提供する「ビルドインスロットタイプ」があります。今回は、ユーザーの任意の発話を捉えたいので、「AMAZON.Color」にします。

Alexaスキル開発で「ユーザーの発語全て」を捉えることは、挑戦的な作業です。通常、特定の情報を捉えるために「AMAZON.Date(日付)」や「AMAZON.City(都市名)」などのビルドインスロットタイプが使用されます。しかし、今回のスキルでは、ユーザーの自由形式の発言をそのまま取得する必要があります。

ところが、現在のAlexaスキルの仕様では、完全に自由形式の発言を取得できるスロットタイプは提供されていません。以前は「AMAZON.SearchQuery」などの自由形式のスロットタイプが存在していましたが、現在は使用できなくなっています。

そこで、本スキルでは代替案として、「AMAZON.Color」スロットタイプを使用しています。このスロットタイプは本来、色を表す語句を取得するために使われますが、実際にはほとんどの発言をキャッチすることができます。これを利用することで、ユーザーの自由な発言を取得し、それをそのままアプリケーションロジックに渡すことが可能になります。

このように、Alexaスキルの制約の中で、適切なスロットタイプを選択し、創意工夫することが求められるのです。本記事で、自由形式のスロットを使った理由は、次のコラムを参照して下さい。

補足:自由形式のスロットを使用する理由

従来のAlexaスキルでは、事前に設定したインテント(意図)とスロット(質問の要素)に基づいて応答が決まっていました。例えば、「今日の東京の天気は?」と聞けば天気情報を返すよう設計されていました。この例では、インテントはWeatherIntent、スロットはdate=今日、lacation=東京、となります。これが本来のAlexaスキルの設計になります。

しかし、最新のAIテクノロジーを取り入れることで、音声アシスタントはさらに賢くなり、自由な会話が可能になってきました。その鍵を握るのが、ChatGPTなどの生成AIです。

AI搭載の音声アシスタントなら、「東京の天気だけでなく、旅行の準備で気をつけることも教えて」といった要求にも、的確に答えられます。インテントやスロットにとらわれずに、あらゆる話題に対応できるのが最大の利点です。自由形式のスロットでユーザーの発語すべてをキャッチするのは、このためです。

生成AIは、ユーザーの発話の文脈を理解し、必要な情報を自在に生成できる知的システムです。音声アシスタントと連携することで、あたかも人間と対話しているかのような自然な会話を実現できるのです。

以上で、HelloWorldIntentの設定は完了しました。変更を保存したら、「スキルをビルド」ボタンを押して、対話モデルの設定を適用させましょう。次に、アプリケーションロジックのコードを調整します。

第3部 生成AIを活用した実用的なスキル作成

ここから実用的なスキルの作成に入っていきます。これから作成するのは「カウンセリングアプリ」です。ユーザーの自由な質問に的確な回答を返すためにはChatGPTをはじめとする生成AIの利用は欠かせません。生成AIのAPIを利用する準備として、生成AIサービス(ChatGPT、Claude、Gemini)のアカウントとAPIキーの作成を行って下さい。(APIキーの作成がお済みの方は、この部分は飛ばして、コードエディタまで進んでください)

初めに、ChatGPT APIを使用するために必要なOpenAI APIキーを作成する手順を説明します。

OpenAI APIキーの作成

OpenAI APIキーを作成するには、以下の手順を実行します。次に示す図は、OpenAIのウェブサイトで新しいAPIキーを作成している様子です。Nameとして、用途や分類を登録しておくと、APIキーの管理に役立ちます。

図16 OpenAI APIキーの作成
  1. OpenAIのウェブサイト(https://openai.com/)にアクセスし、アカウントを作成またはログインします。

  2. ダッシュボードにアクセスし、「API keys」セクションに移動します。

  3. 「Create new secret key」ボタンをクリックして、新しいAPIキーを生成します。

  4. 生成されたAPIキーをコピーし、安全な場所に保存します。このキーは後で使用するので、忘れないようにしてください。

APIキーを作成したら、PythonスクリプトからChatGPT APIを呼び出すことができます。次に、Anthropic APIキーとGoogle AI APIキーの作成手順を説明します。

Anthropic APIキーの作成

Anthropic APIキーを作成するには、以下の手順を実行します。次の図は、Anthropicのウェブサイトで新しいAPIキーを作成している様子です。Nameとして、用途や分類を登録しておくと、APIキーの管理に役立ちます。

図17 Anthropic APIキーの作成
  1. Anthropicのウェブサイト(https://www.anthropic.com/)にアクセスし、アカウントを作成またはログインします。

  2. ダッシュボードにアクセスし、「API」セクションに移動します。

  3. 「Generate API Key」ボタンをクリックして、新しいAPIキーを生成します。

  4. 生成されたAPIキーをコピーし、安全な場所に保存します。

Google AI APIキーの作成

Google AI APIキーを作成するには、以下の手順を実行します。初回のAPIキー作成時には、新しいGCP(Google Cloud Platform)プロジェクトを作成する必要があります。2回目以降のAPIキー作成時には、次の図に示すように既存のプロジェクト「Generative Language Client」を選択してください。

図18 Google AI APIキーの作成
  1. Google Cloud Platformのウェブサイト(https://console.cloud.google.com/)にアクセスし、アカウントを作成またはログインします。

  2. Googel AI Studioのウェブサイト(https://aistudio.google.com/)にアクセスして、左サイドバーから「Get API Key」セクションを選びます。

  3. 「Create API Key in new project」を選択します(初回のみ)。

  4. 生成されたAPIキーをコピーし、安全な場所に保存します。

  5. 2つ目以降のAPIキーを作成するときは、「Create API Key」から、プロジェクト名「Generative Language Client」を選んでください。現時点では、APIキーに識別のための名前をつけることはできないので、作成したキーの用途などを別途メモしておくことをおすすめします。

これで、3つの生成AIのAPIキーが作成されました。次に、Alexa開発者コンソールに戻り、音声アシスタントをChatGPT APIと連携させるためのコードを記述していきましょう。上メニューから「コードエディタ」を選択して下さい。

コードエディタ

図19 コードエディタ

Alexaスキルの開発において、「コードエディタ」の使用を開始しましょう。このツールにより、開発者は煩雑な開発環境を設定することなく、アプリケーションロジックを実装することが可能です。上メニューの「コードエディタ」をクリックします。

まず、左側のファイルビューアーから「lambda_function.py」を選択して開きます。このファイルはアプリケーションロジックの中心であり、エンドポイントとして機能します。次に、LaunchRequestHandlerクラス(赤枠の部分)とHelloWorldIntentHandlerクラス(青枠の部分)を修正し、ユーザーからの発言を受け取った際に、生成AIで作成した回答を返す「カウンセリング」機能を実装します。具体的には、以下のコードをコピーして、図18の赤枠で囲まれた部分にペーストすることで、コードを修正できます。

ChatGPT連携:LaunchRequestHandlerの書き換え

from ask_sdk_model import Response

logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)

from urllib import request, parse  # ここから(1)
import json
from ask_sdk_model.ui import SimpleCard  # ここまで(1)


class LaunchRequestHandler(AbstractRequestHandler):
    """Handler for Skill Launch."""
    def can_handle(self, handler_input):
        # type: (HandlerInput) -> bool

        return ask_utils.is_request_type("LaunchRequest")(handler_input)

    def handle(self, handler_input):
        # type: (HandlerInput) -> Response
        # セッションアトリビュートを初期化
        attributes = handler_input.attributes_manager.session_attributes  # ここから(2)
        attributes["saved_messages"] = []  # ここまで(2)

        # ウェルカムメッセージ
        reprompt = "あなたの悩みを聞かせてください。"  # ここから(3)
        speak_output = "カウンセリングマシーンへようこそ。" + reprompt  # ここまで(3)

        return (
            handler_input.response_builder
                .speak(speak_output)
                .ask(reprompt)  # (4)
                .response
        )

このコードは、lambda_function.pyの先頭部分のコードです。Pythonの標準ライブラリurllibを使用してOpenAIのChatGPT APIにアクセスするための準備をしています。そして、LaunchRequestHandlerクラスを書き換えて、「セッションアトリビュートの初期化」と「ウェルカムメッセージ」を変更しています。以下、コードの説明を行います。

(1)では、プログラムで使用する外部ライブラリをインポートしています。ChatGPT APIを使って、質問の送信と回答の取得を行う際に使用します。urllib.requestとurllib.parseはURLを開いたり、URLを解析するのに使用されます。jsonはJSON形式のデータを扱うためのモジュールです。これは、Pythonオブジェクト(辞書型)とJSONデータ形式の相互変換に使用されます。

ask_sdk_model.uiはAlexaスキルのUIを構築するためのモジュールです。SimpleCardクラスは、Alexaからユーザーへの音声応答にカード(テキスト情報)を追加する時に使用します。

(2) では、セッション属性(プログラムの実行中に保持する一時的なデータ)を初期化しています。saved_messagesという空のリストを作成しています。

通常のウェブアプリケーションは、ページを切り替えるたびにデータを失ってしまう「ステートレス」な性質があります。しかし、Alexaスキルのようなインタラクティブなアプリケーションでは、過去の会話内容などの情報を記録しておく必要があります。そこでセッション属性が役立ちます。

セッション属性を使えば、ユーザーごとにデータを保存できます。この例では、saved_messagesリストに過去の会話履歴を蓄積していきます。そうすることで、AIアシスタントは前後の文脈を考慮しながら、より適切な応答ができるようになります。ステートレスなウェブアプリでも、このようにセッション属性を活用することで、ユーザー固有の情報を失わずに処理を続行できるのです。

(3) では、Alexaが最初にユーザーに話しかける言葉(speak_output)を設定しています。"カウンセリングマシーンへようこそ。"というメッセージとrepromptを結合しています。repromptは、ユーザーが一定時間応答をしない(話しかけない)ときに、会話を促す言葉のことです。(repromptはタイプミスではなく、Alexa開発においてよく使われている変数名です)

(4) この行では、Alexaに応答を返すための処理を行っています。speak()でAlexaに話させる内容を指定し、ask()で次の質問を設定し、最後に.responseでレスポンスオブジェクトを取得して、リターンしています。この処理によりユーザーに音声の応答が返却されます。

このコードは、Alexaスキルの起動時に実行され、ユーザーに最初の問いかけと、次の質問を求める再プロンプトを発話するための処理を行っています。APIの呼び出し処理は、次のHelloWorldIntentHandlerクラスで実行されます。図18の青枠を次に示すコードで書き直して下さい。

ここから先は

18,411字 / 2画像

この記事が気に入ったらサポートをしてみませんか?