#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 в будущем.