ボットでの言語生成テンプレートの使用Use language generation templates in your bot

適用対象: SDK v4APPLIES TO: SDK v4

言語生成 (LG) テンプレートによって、ボット開発者はさまざまなメッセージやメディアを簡単にユーザーに送信できます。Language generation (LG) templates make it easy for bot developers to send a variety of messages and media to users. この記事では、LG テンプレートを利用して、シンプルなテキスト メッセージとカードを送信する方法と、ユーザーからのテキスト入力を評価する方法について説明します。This article shows you how to leverage LG templates to send simple text messages and cards, and how to evaluate text input from users.

前提条件Prerequisites

サンプルについてAbout the sample

この LG コア ボット サンプルでは、空港のフライト予約アプリケーションの例を示しています。This LG core bot sample shows an example of an airport flight booking application. これは LUIS サービスを使用してユーザー入力を認識し、認識した最上位の LUIS の意図を返します。It uses a LUIS service to recognize the user input and return the top recognized LUIS intent.

この記事では、ボットで LG テンプレートを使用するためのボトムアップ方式を採用しています。This article uses a bottom up approach to using LG templates in your bots. 学習内容:You will learn how to:

ファイルでテンプレートを呼び出すCall templates in files

.lg ファイルでテンプレートを使用するには、ボット ロジックでそれらを参照する必要があります。To use templates in .lg files you need to reference them in your bot logic. 次の手順では、作成する LG テンプレートを Templates オブジェクトに読み込むことによって、メイン ボット ロジックでそれらを参照する方法を示しています。The instructions below show you how the LG templates you will create are referenced in your main bot logic by loading them into a Templates object. この例では、welcomeCard.lg のテンプレートを使用しています。The example uses the templates from welcomeCard.lg.

Microsoft.Bot.Builder.LanguageGeneration パッケージがあることを確認します。Make sure you have the Microsoft.Bot.Builder.LanguageGeneration package. 次のスニペットを追加して、パッケージを読み込みます。Add the following snippet to load the package:

Bots/DialogAndWelcomeBot.csBots/DialogAndWelcomeBot.cs

using Microsoft.Bot.Builder.LanguageGeneration;

パッケージを読み込んだ後に、 _templates というプライベート Templates オブジェクトを作成します。After loading the package create a private Templates object called _templates:

private Templates _templates;

_templates オブジェクトは、lg ファイルでテンプレートを参照するために使用します。The _templates object is used to reference templates in your .lg files.

クロスプラットフォーム サポートのパスを結合し、コードに次を追加して、welcomeCard.lg を含むパスを解析します。Combine the path for cross-platform support and parse the path that contains welcomeCard.lg by adding the following to your code:

string[] paths = { ".", "Resources", "welcomeCard.lg" };
string fullPath = Path.Combine(paths);
_templates = Templates.ParseFile(fullPath);

これで、次に示すように、名前で welcomeCard.lg からテンプレートを参照できるようになりました。Now you can can reference templates from the welcomeCard.lg by name, seen below:

foreach (var member in membersAdded)
{
    // Greet anyone that was not the target (recipient) of this message.
    // To learn more about Adaptive Cards, see https://aka.ms/msbot-adaptivecards for more details.
    if (member.Id != turnContext.Activity.Recipient.Id)
    {
        await turnContext.SendActivityAsync(ActivityFactory.FromObject(_templates.Evaluate("WelcomeCard", actions)));
    }
}

呼び出し SendActivityAsync()WelcomeCard テンプレートがどのように参照されているかに注意してください。Notice how the WelcomeCard template is referenced in the call SendActivityAsync().

ボットでテンプレートを参照できるようになったので、LG ファイルでのテンプレートの作成を開始します。Now that your bot can reference templates, it's time to starting creating templates in LG files. LG を使用することで、さまざまな会話を簡単に追加できます。By using LG you easily add conversational variety.

シンプルな応答テンプレートを作成するCreate a simple response template

シンプルな応答テンプレートには、コンポジションと拡張に使用する 1 つ以上のテキストのバリエーションが含まれています。A simple response template includes one or more variations of text that are used for composition and expansion. 提供されているバリエーションの 1 つが、LG ライブラリによってランダムに選択されます。One of the variations provided will be selected at random by the LG library.

PromptForDestinationCityPromptForDepartureCityConfirmPrefix など、BookingDialog.lg 内のシンプルな応答テンプレートによって、フライト予約プロンプトにバリエーションが追加されます。The simple response templates in BookingDialog.lg, like PromptForDestinationCity, PromptForDepartureCity, and ConfirmPrefix, add variety to flight booking prompts.

Resources/BookingDialog.lgResources/BookingDialog.lg

# PromptForDestinationCity
- Where would you like to travel to?
- What is your destination city?

たとえば、上記の PromptForDepartureCity への呼び出しによって、次の 2 つの可能なテキスト プロンプトのいずれかが生成されます。For example, a call to PromptForDepartureCity, seen above, will produce one of the two possible text prompts:

  • Where would you like to travel to?Where would you like to travel to?
  • What is your destination city?What is your destination city?

メモリを参照するReference memory

もっと複雑なテンプレートと同様に、シンプルな応答テンプレートでメモリを参照できます。Like more complex templates, simple response templates can reference memory. BookingDialog.LG では、シンプルな ConfirmMessage 応答テンプレートで、DestinationOrigin、および TravelDate の各プロパティを参照しています。In BookingDialog.LG the ConfirmMessage simple response template references the Destination, Origin, and TravelDate properties:

Resources/BookingDialog.lgResources/BookingDialog.lg

# ConfirmMessage
- I have you traveling to: ${Destination} from: ${Origin} on: ${TravelDate}
- on ${TravelDate}, travelling from ${Origin} to ${Destination}

ユーザーが Origin に「Seattle」、Destination に「Paris」、TravelDate に「05/24/2020」と入力すると、ボットによって、次のいずれかの結果が生成されます。If the user enters Seattle for the Origin, Paris for the Destination, and 05/24/2020 for the TravelDate, your bot will produce one of the following results:

  • I have you traveling to:Paris from:Seattle on:05/24/2020I have you traveling to: Paris from: Seattle on: 05/24/2020
  • on 05/24/2020, travelling from Seattle to Parison 05/24/2020, travelling from Seattle to Paris

条件付き応答テンプレートを作成するCreate a conditional response template

条件付き応答テンプレートを使用して、条件に基づいて選択されたコンテンツを作成できます。A conditional response template lets you author content that's selected based on a condition. すべての条件は、アダプティブ式を使用して表します。All conditions are expressed using adaptive expressions.

BookingDialog.lg 内の PromptForMissingInformation テンプレートは、if-else テンプレートの例です。The PromptForMissingInformation template in BookingDialog.lg is an example of an if-else template. if-else テンプレートでは、連鎖している条件の順序に基づいてコレクションを選択するテンプレートを作成できます。The if-else template lets you build a template that picks a collection based on a cascading order of conditions. テンプレートでは、プロパティが null に設定されている場合、ユーザーが情報を入力するように求められます。In the template, the user is prompted for pieces of information if their properties are set to null:

Resources/BookingDialog.lgResources/BookingDialog.lg

# PromptForMissingInformation
- IF: ${Destination == null}
  - ${PromptForDestinationCity()}
- ELSEIF: ${Origin == null} 
  - ${PromptForDepartureCity()}
- ELSEIF: ${TravelDate == null}
  - ${PromptForTravelDate()}
- ELSE: 
  - ${ConfirmBooking()}

プロパティが null の場合、ボットによって、そのプロパティに関連付けられているテンプレートが呼び出されます。If a property is null then the bot will call the template associated with that property. すべてのプロパティが null 以外の値の場合、ConfirmBooking テンプレートが呼び出されます。If all properties are non-null values then the ConfirmBooking template is called.

他のテンプレートを参照するReference other templates

テンプレート内のバリエーションによって、他のテンプレートを参照できます。Variations in templates can reference other templates. 上記の例では、プロパティが null の場合、テンプレートによって、不足している情報の入力を求める関連テンプレートが呼び出されます。In the example above, if a property is null then the template calls the relevant template to prompt for the missing information.

たとえば、Destinationnull に等しい場合、${PromptForDestinationCity()} によって不足しているフライトの到着地情報を取得するための PromptforDestinationCity テンプレートが 呼び出されます。For example, if Destination equals null, then the PromptforDestinationCity template would be called via ${PromptForDestinationCity()} to obtain the missing flight destination information. どのプロパティも null でない場合、テンプレートによって ConfirmBooking プロンプトが呼び出されます。If none of the properties are null then the template calls the ConfirmBooking prompt.

カード テンプレートを作成するCreate a cards template

言語生成テンプレートでは、カードとメディアを使用して、さらに豊富な会話エクスペリエンスを作成できます。Language generation templates can use cards and media to create a richer conversational experience. welcomeCard.lg では、初めてボットを起動したときに表示される アダプティブ カードを作成するために 4 つのテンプレートが使用されています。In welcomeCard.lg, four templates are used to create the Adaptive Card that displays when you first start the bot.

Adaptive Card では、アダプティブカード JSON オブジェクトを定義します。Adaptive Card defines an Adaptive card JSON object:

Resources/welcomeCard.lgResources/welcomeCard.lg

# AdaptiveCard
- ```
{
  "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
  "type": "AdaptiveCard",
  "version": "1.0",
  "body": [
    {
      "type": "Image",
      "url": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQtB3AwMUeNoq4gUBGe6Ocj8kyh3bXa9ZbV7u1fVKQoyKFHdkqU",
      "size": "stretch"
    },
    {
      "type": "TextBlock",
      "spacing": "medium",
      "size": "default",
      "weight": "bolder",
      "text": "${HeaderText()}",
      "wrap": true,
      "maxLines": 0
    },
    {
      "type": "TextBlock",
      "size": "default",
      "isSubtle": true,
      "text": "Now that you have successfully run your bot, follow the links in this Adaptive Card to expand your knowledge of Bot Framework.",
      "wrap": true,
      "maxLines": 0
    }
  ],
  "actions": [
    ${join(foreach(actions, item, cardActionTemplate(item.title, item.url, item.type)), ',')}
  ]
}
```

このカードによって、イメージが表示され、一連の推奨されるアクションであるカード ヘッダー用の LG テンプレートが使用されます。This card displays an image, and uses LG templates for the card header a set of suggested actions.

actions は、cardActionTemplate(title, url, type) を呼び出し、DialogAndWelcomeBot.csOnMembersAddedAsync() メソッドから titleurl、および type を取得することによって入力されます。The actions are filled in by calling cardActionTemplate(title, url, type) and obtaining thetitle, url, and type from the OnMembersAddedAsync() method in DialogAndWelcomeBot.cs:

Bots/DialogAndWelcomeBot.csBots/DialogAndWelcomeBot.cs

// Actions to include in the welcome card. These are passed to LG and are then included in the generated Welcome card.
var actions = new {
    actions = new List<Object>() {
        new {
            title = "Get an overview",
            url = "https://docs.microsoft.com/en-us/azure/bot-service/?view=azure-bot-service-4.0"
        },
        new {
            title = "Ask a question",
            url = "https://stackoverflow.com/questions/tagged/botframework"
        },
        new {
            title = "Learn how to deploy",
            url = "https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-howto-deploy-azure?view=azure-bot-service-4.0"
        }
    }

title は、推奨されるアクション ボタンのテキストです。url は、ボタンがクリックされたときに開かれる url です。The title is the text in the suggested action button, and the url is the url opened when the button is clicked.

最後に、WelcomeCard では AdaptiveCard テンプレートを呼び出して、アダプティブ カード JSON オブジェクトを返します。Finally the WelcomeCard calls the AdaptiveCard template to return the Adaptive card JSON object.

Resources/welcomeCard.lgResources/welcomeCard.lg

# WelcomeCard
[Activity
    Attachments = ${json(AdaptiveCard())}
]

ActivityAttachment() 関数の詳細については、LG ライブラリからの関数の挿入に関するページを参照してくださいFor more information about the ActivityAttachment() function, read inject functions from the LG library

ボットに LUIS を追加するAdd LUIS to your bot

ボット ロジックと LG テンプレートを更新したら、LUIS をボットに追加する準備ができます。After updating your bot logic and LG templates you are ready to add LUIS to your bot. 以下のセクションの手順に従って、ボットに LUIS を追加します。Follow the steps in the sections below to add LUIS to your bot:

ボットのテストTest the bot

最新の Bot Framework Emulator をダウンロードしてインストールします。Download and install the latest Bot Framework Emulator.

  1. ご自身のマシンを使ってローカルでサンプルを実行します。Run the sample locally on your machine. 手順については、README ファイルで C# サンプルJS サンプル、または Python サンプルを参照してください。If you need instructions, refer to the readme file for the C# Sample, JS Sample or Python Sample.

  2. エミュレーターで、"パリに移動する" や "パリからベルリンに移動する" などのメッセージを入力します。In the Emulator, type a message such as "travel to Paris" or "going from Paris to Berlin". FlightBooking.json ファイルの任意の発話を、意図 "Book flight" のトレーニングに使用します。Use any utterance found in the file FlightBooking.json for training the intent "Book flight".

LUIS の予約の入力

LUIS から返された最上位の意図が "Book flight" に解決されると、お使いのボットは、旅行の予約を作成するための情報が十分に確保されるまで質問を続けます。If the top intent returned from LUIS resolves to "Book flight" your bot will ask additional questions until it has enough information stored to create a travel booking. 予約を作成できたら、その予約情報をユーザーに返します。At that point it will return this booking information back to your user.

LUIS の予約の結果

この時点で、コードのボット ロジックはリセットされ、引き続き追加の予約を作成できます。At this point the code bot logic will reset and you can continue to create additional bookings.

追加情報Additional Information