Как получить доступ к состоянию из файла LG в функции генерации языка в botframework

#c# #botframework

#c# #botframework

Вопрос:

В соответствии с этими статьями из файла LG вы должны иметь возможность напрямую обращаться к состоянию бота, не передавая значения в качестве области видимости: https://docs.microsoft.com/en-us/composer/concept-language-generation
https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-concept-language-generation?view=azure-bot-service-4.0amp;tabs=csharp

т. е. его упомянули:

Генерация языка достигается с помощью: файла lg на основе Markdown, который содержит шаблоны и их состав. Полный доступ к памяти текущего бота, чтобы вы могли привязать язык к состоянию памяти.

Один из примеров выглядит так, как будто они могут получить доступ к переменной ‘name’ из UserState:

 # greetingTemplate
- Hello ${user.name}, how are you?
- Good morning ${user.name}.It's nice to see you again.
- Good day ${user.name}. What can I do for you today?
 

Я протестировал это несколькими способами, но я просто не могу получить доступ к памяти состояния пользователя из файла LG. Возможно ли это?

Ответ №1:

k

Дело не в том, что вы можете напрямую получить доступ к состоянию бота, а в том, что память (и ее области) в адаптивных / композиторских ботах хранятся в состоянии и могут храниться и доступны через области и LG. Ключевым словом в предоставленном вами фрагменте статьи является «память» (в данном случае это относится к адаптивным областям памяти и их значениям).

Например, я могу запросить у пользователя его имя и сохранить его user.name . Но это не то же самое, что turn.activity.from.name (что не является чем-то из состояния, но часто сохраняется в состоянии). user.name по умолчанию не заполняется. Конечно, вы могли бы взять это значение из turn.activity.from.name и сохранить в user.name (возможно, в зависимости от канала, или иметь другую логику и т.д.)

Вы можете протестировать это немного подробнее, используя это:

Диалоговое окно:

 {
  "$kind": "Microsoft.AdaptiveDialog",
  "$designer": {
    "id": "7zj5aK",
    "name": "GatherUserInfo",
    "description": ""
  },
  "autoEndDialog": true,
  "defaultResultProperty": "dialog.result",
  "triggers": [
    {
      "$kind": "Microsoft.OnBeginDialog",
      "$designer": {
        "name": "BeginDialog",
        "description": "",
        "id": "A25t0H"
      },
      "actions": [
        {
          "$kind": "Microsoft.TextInput",
          "$designer": {
            "id": "SOE0Ku"
          },
          "disabled": false,
          "maxTurnCount": 3,
          "alwaysPrompt": false,
          "allowInterruptions": false,
          "prompt": "${TextInput_Prompt_SOE0Ku()}",
          "unrecognizedPrompt": "",
          "invalidPrompt": "",
          "defaultValueResponse": "",
          "property": "user.name"
        },
        {
          "$kind": "Microsoft.TextInput",
          "$designer": {
            "id": "3sNA0B"
          },
          "disabled": false,
          "maxTurnCount": 3,
          "alwaysPrompt": false,
          "allowInterruptions": false,
          "prompt": "${TextInput_Prompt_3sNA0B()}",
          "unrecognizedPrompt": "",
          "invalidPrompt": "",
          "defaultValueResponse": "",
          "property": "user.gender"
        },
        {
          "$kind": "Microsoft.NumberInput",
          "$designer": {
            "id": "SsEiOF"
          },
          "defaultLocale": "en-us",
          "disabled": false,
          "maxTurnCount": 3,
          "alwaysPrompt": false,
          "allowInterruptions": false,
          "prompt": "${NumberInput_Prompt_SsEiOF()}",
          "unrecognizedPrompt": "",
          "invalidPrompt": "",
          "defaultValueResponse": "",
          "property": "user.age"
        },
        {
          "$kind": "Microsoft.SendActivity",
          "$designer": {
            "id": "CD7TVN"
          },
          "activity": "${SendActivity_CD7TVN()}"
        }
      ]
    }
  ],
  "generator": "GatherUserInfo.lg",
  "recognizer": "GatherUserInfo.lu.qna",
  "id": "GatherUserInfo"
}
 

LG:

 # TextInput_Prompt_SOE0Ku()
 - What is your name?
# TextInput_Prompt_3sNA0B()
 - What is your gender?
# NumberInput_Prompt_SsEiOF()
 - What is your age?
# SendActivity_CD7TVN()
 - Your name is ${user.name}, you are ${user.gender} and your age is ${user.age}. You are also ${turn.activity.from.name}
 

И с помощью эмулятора вы можете увидеть что-то подобное в cosmos:

 {
    "id": "emulator*2fusers*2fa1464f41-f237-42dd-ad01-ca8fb150b97a",
    "realId": "emulator/users/a1464f41-f237-42dd-ad01-ca8fb150b97a",
    "document": {
        "$type": "System.Collections.Generic.Dictionary`2[[System.String, System.Private.CoreLib],[System.Object, System.Private.CoreLib]], System.Private.CoreLib",
        "name": "DanaVCosmos",
        "gender": "MaleCosmos",
        "age": 45
    },
 

Комментарии:

1. Спасибо, Дана. Должен сказать, я немного смущен. Какой формат диалога вы там разместили? Это форма BF Composer? Также, если user.name предполагается, что это сработает, тогда я должен настроить средство доступа UserState как user, а затем добавить к нему поле строкового типа с именем «name»?

2. Да, от композитора. Если вы нажмете «показать код» в Composer, вы можете получить этот формат json. Это фактический декларативный диалог. Извините; возможно, я неправильно предположил, что вы используете Composer, поскольку вы ссылались на статью Composer, но вы также помечены как c #. Используете ли вы декларативные диалоговые окна или кодируете их в dotnet / c #?

3. Да, на самом деле это делается в VisualStudio с помощью C #. Но планирую проверить composer в будущем.