Bot Framework中如何从RootDialog向LuisDialog传递数据
解决LuisDialog接收Forward传递数据的问题
我来帮你理清这个问题的解决思路~你当前用context.Forward(new Luis(), Resume, UserName, CancellationToken.None);传递的用户名,其实并不是直接存放在LuisResult里的,得换个正确的方式获取,下面一步步给你说明:
1. 哪个意图会接收传递的数据?
当你调用Forward方法时,LuisDialog会先把你传递的UserName当作第一条输入消息,发送给LUIS服务进行意图识别,最终匹配到的意图(比如你训练的Greeting、None或者其他自定义意图)会触发对应的处理方法。不过更稳妥的方式是,你可以在LuisDialog的初始化阶段就捕获这个数据,不用依赖意图匹配结果。
2. 如何获取传递的数据?
这里有两种实用的方法,根据你的需求选择:
方法一:重写LuisDialog的StartAsync方法存数据
在你的LuisDialog类里重写StartAsync方法,在这里捕获Forward过来的初始消息,把它存入对话状态,之后所有意图方法都能轻松调用:
protected override async Task StartAsync(IDialogContext context) { // 获取Forward传递过来的用户名 var userName = context.Activity.Text; // 将用户名存入对话状态,方便后续所有意图方法使用 context.UserData.SetValue<string>("StoredUserName", userName); // 继续执行LuisDialog的默认逻辑,开始意图识别 await base.StartAsync(context); }
之后在任意意图处理方法里,就可以这样取出用户名:
[LuisIntent("Greeting")] public async Task GreetingIntent(IDialogContext context, LuisResult result) { string userName; if (context.UserData.TryGetValue<string>("StoredUserName", out userName)) { await context.PostAsync($"嗨,{userName}!很高兴见到你~"); } else { await context.PostAsync("你好呀!"); } context.Wait(MessageReceived); }
方法二:在Resume回调中直接处理
如果你不需要在LuisDialog内部使用这个用户名,只是想在Forward流程结束后处理数据,也可以直接在Resume方法里操作:
private async Task Resume(IDialogContext context, IAwaitable<object> result) { // 这里可以直接使用你原本的UserName变量,同时处理LuisDialog返回的结果 await context.PostAsync($"刚才传递的用户名是:{UserName}"); }
关键提醒
要注意哦,LuisResult的作用是存储LUIS识别出的意图、实体、置信度这些识别结果,你通过Forward传递的初始消息是存放在context.Activity.Text中的,并不是LuisResult的属性,所以别在LuisResult里找这个用户名啦~
内容的提问来源于stack exchange,提问作者Soufien Hajji
相关产品推荐
相关产品推荐

