如何跟踪LUIS的Gratitude意图是否已触发(Facebook渠道)
如何跟踪LUIS感谢意图是否已针对用户触发?
核心思路很简单:我们需要为每个用户存储一个状态标记,记录是否已经向他们展示过「是否需要联系您」的提示。根据你的需求(同会话或跨会话都不能重复触发),可以选择两种常见的实现方式:
1. 单会话内跟踪(使用DialogContext的UserData)
如果只需要在当前对话会话中避免重复提示,DialogContext.UserData就足够了——它会在会话生命周期内保存用户相关的数据。
修改你的代码如下:
[LuisIntent ("Gratitude")] public async Task Gratitude(IDialogContext context, IAwaitable<IMessageActivity> message, LuisResult result) { // 从用户会话数据中读取标记,默认值为false bool hasPromptedContact = context.UserData.GetValueOrDefault<bool>("HasPromptedContact"); if(!hasPromptedContact) { // 触发提示后,立即将标记设为true,避免后续重复触发 context.UserData.SetValue("HasPromptedContact", true); PromptDialog.Choice( context, ResumeAfterGratitude, new[] { "Yes", "No"}, "Thank you. Would you like us to contact you?", promptStyle: PromptStyle.Keyboard, attempts: 4 ); } else { await context.PostAsync("Glad to help"); } }
2. 跨会话跟踪(使用持久化用户状态)
如果需要用户下次再来对话时也不会重复看到这个提示,就需要把标记存储到持久化存储中(比如Azure Table Storage、SQL数据库,或者Bot Framework的用户状态服务)。
以Bot Framework v3的BotStateService为例,代码大概是这样:
// 确保你已经初始化了BotStateService(通常在Global.asax或依赖注入中配置) private readonly IBotStateService _botStateService; // 构造函数注入BotStateService public YourDialog(IBotStateService botStateService) { _botStateService = botStateService; } [LuisIntent ("Gratitude")] public async Task Gratitude(IDialogContext context, IAwaitable<IMessageActivity> message, LuisResult result) { var userActivity = await message; // 获取用户唯一标识(通常用From.Id) string userId = userActivity.From.Id; // 从持久化用户状态中读取标记 var userData = await _botStateService.UserState.GetUserDataAsync(context, userId, CancellationToken.None); bool hasPromptedContact = userData.GetValueOrDefault<bool>("HasPromptedContact"); if(!hasPromptedContact) { // 更新标记并保存到持久化存储 userData.SetValue("HasPromptedContact", true); await _botStateService.UserState.SetUserDataAsync(context, userId, userData, CancellationToken.None); PromptDialog.Choice( context, ResumeAfterGratitude, new[] { "Yes", "No"}, "Thank you. Would you like us to contact you?", promptStyle: PromptStyle.Keyboard, attempts: 4 ); } else { await context.PostAsync("Glad to help"); } }
额外提示
- 标记的键名(比如
HasPromptedContact)可以自定义,只要语义清晰、唯一就行 - 如果后续有场景需要重置这个标记(比如用户再次询问车辆详情后又发感谢,你想重新触发提示),只需在对应的意图方法中把标记设回
false即可 - 持久化存储时,一定要用稳定的用户唯一标识(比如用户的ID,而不是会话ID),确保跨会话能正确识别同一用户
内容的提问来源于stack exchange,提问作者Norwen
相关产品推荐
相关产品推荐

