
LINEとGoogle Cloudを連携して対話サービスを作成する(第2回)
前回は、LINEとGoogle Cloudを連携してLINEからの入力でGemini AIが回答する仕組みを構築しました。
今回はDialogflow CXで会話フローを管理して、サービスとしてブラッシュアップしていきたいと思います。
基本説明
Dialogflow CXで使う主な項目は以下です。
- Flow: 会話の大きな流れを定義する単位
- Page: フローの中で特定の会話を処理する単位
- Route: 会話の遷移条件を定義
- Intent: ユーザーの意図を判定
- Entity: 文章から特定のデータを抽出
この中でIntentとEntityは分かりづらく感じました。
Intentはユーザーからの入力例を複数設定しトレーニングさせることで類似する入力を判別できるようになります。
EntityはIntent内で特定の単語を抽出したい場合に設定します。
Entityの抽出条件を「曖昧(Fuzzy Matching)」に設定すると、似たワードも認識 できるようになります。抽出したEntityは条件分岐に使用し、会話の流れを制御します。
会話の中では誤字脱字や異なる表現が多いため、IntentとEntityを適切に設定することでユーザーの発話のぶれを吸収し、より正確な意図を把握できるようになります。

構築
フローを作成する
Defalut Start Flowはデフォルトで用意されているフローです。main-flowを呼んでその中で会話処理を行います。
各サービスを提供しているページから「Defalut Start Flow」に戻れように設定してあります。

今回は会話フローを管理することが目的のため、翻訳サービスや音声テキスト変換サービスは未実装です。翻訳APIはCloud Translation API、音声テキスト変換APIはSpeech-to-Textを使用し、前回ブログのGemini AIと同様の方法でAPIエンドポイントを作成することで利用可能になる想定です。
作成したAPIエンドポイントはFulfillment(ユーザへの応答)項目のWebhook settingsに設定することで呼び出すことができます。

Page詳細
Service Selectページでは、IntentとEntityで各サービスページに遷移するようにRouteの条件を設定しています。Gemini AIページでは「戻る」などの発話をback-intentにマッチさせ最初のフローにへ戻れるように設定しています。それ以外の発話はすべて、Gemini AIへの質問として扱いうためにno-matchイベントで「Gemini AI」APIのwebhookを呼ぶようにしました。
翻訳ページや音声テキスト変換ページはAPI未実装のため、最初のフローに戻るようにしてあります。

Intent/Entityを設定する
Service Selectページで設定したIntentとEntitiyですが、ここでは例として、Gemini-AI Page遷移用のものについて説明します。Intentには、ユーザーが発話する可能性のあるフレーズを複数登録します。gemini-intentでは、そのフレーズ内のキーワードをEntity(@service
)と関連付けることで、Routeの制御に活用できるようにしています。

Entityの設定では、gemini-intentで生成AIに関連する入力がされることを想定し、Synonyms(同義語)を登録します。
登録された同義語は、「生成AI」というマッピング先に関連付けられます。

具体的な動きとしてユーザーが「geminiを使いたい」と発話すると、gemini-intentにマッチし、生成AIページへ遷移します。発話内の「gemini」は @service
エンティティの「生成AI」にマッピングされます。
このEntityの値を利用し、Select PageのRouteで「 $session.params.service = 生成AI
」として条件を指定して、複数のIntentにマッチしてしまった場合の対策を行っております。同様に「chatGTPを使いたい」といった別表現でも「生成AI」としてマッピングされます。
LINEでの動作確認
以上の設定によるLINEでの入出力となります。一連の流れが確認できるかと思います。「音声テキスト変換サービス」の入力で「音声にしようか」と入力しても次のページに進まないのはIntentのトレーニングフレーズが不足しているせいです。また、こういった場合のためにイベントハンドラーで適切な入力を求めるメッセージを表示してます。正規のシステムではないため、修正せずにこのままにします。

まとめ
今回Dialogflow CX上にGemini AIを含む対話フローを作成し、基本的なサービス連携を確認しました。
当初、返答メッセージ自体にIF条件を設定して出し分けようとしましたが、Routeに常時成立する条件を設定しているとユーザー入力を待たずに次のステップへ進んでしまい、想定する遷移ができずハマりました。ユーザーの入力に応じた遷移を実現するには、Route条件を「ユーザー入力による判定」として明確に設定する必要があるようです。ここではIntentとEntityを組み合わせてRoute条件を制御することにより、意図した流れを実現できました。また、ユーザー入力をある程度制限したりガイドする方法も有効だと思います。
配送の荷物追跡LINEサービスで見られる問合せ番号の入力なども、こうした仕組みを利用しているのかもしれません。
現状は試作段階ですが、目的は達成できたため、このあたりでこのテーマは一旦終了したいと思います。
コメントを残す