You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:47:29