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

Bot Framework中Suggested Actions实体提取需求:兼容自定义输入

解决Bot中Suggested Actions+自由输入+实体提取的需求

我之前也碰到过这个痛点!GitHub上的Choice Prompt示例确实太局限了——它强制用户只能从给定选项里选,完全没法支持“既给快速回复选项,又允许用户自由输入并提取实体”的场景。下面给你一套实际可用的方案:

核心思路

不用Choice Prompt,而是直接发送带Suggested Actions的普通消息,这样用户既可以点击快速回复按钮,也能在输入框里自由打字。之后统一处理用户的回复文本,再从中提取需要的实体。

具体实现步骤(以Bot Framework C#为例)

1. 发送带Suggested Actions的提问消息

先构建快速回复选项,然后和提问文本一起发送给用户:

// 定义快速回复按钮
var suggestedActions = new SuggestedActions()
{
    Actions = new List<CardAction>()
    {
        new CardAction(ActionTypes.PostBack, "Yeah!", value: "Yeah!"),
        new CardAction(ActionTypes.PostBack, "No", value: "No")
    }
};

// 发送带快速回复的提问
await turnContext.SendActivityAsync(
    MessageFactory.Text("你喜欢披萨吗?", suggestedActions: suggestedActions), 
    cancellationToken
);

这里用PostBack类型的按钮,点击后会把按钮的value作为文本发送给Bot,和用户手动输入的效果完全一致,方便后续统一处理。

2. 统一处理用户回复(点击/输入都兼容)

不管用户是点击快速回复,还是自由输入文本,Bot都会收到一条文本消息,直接获取并处理即可:

// 获取用户输入的文本(点击快速回复的话,这里拿到的就是按钮的value)
var userInput = turnContext.Activity.Text;

// 先处理快速回复的场景
if (userInput.Equals("Yeah!", StringComparison.OrdinalIgnoreCase))
{
    await turnContext.SendActivityAsync("太好了!披萨确实是yyds😋");
}
else if (userInput.Equals("No", StringComparison.OrdinalIgnoreCase))
{
    await turnContext.SendActivityAsync("好吧,每个人口味不同~");
}
else
{
    // 处理用户自由输入的场景,比如输入"Yes, and Burger too"
    var extractedFoods = ExtractFoodEntities(userInput);
    if (extractedFoods.Any())
    {
        await turnContext.SendActivityAsync($"原来你不仅喜欢披萨,还喜欢{string.Join("、", extractedFoods)}!");
    }
    else
    {
        await turnContext.SendActivityAsync($"我收到你的回复啦:{userInput}");
    }
}

3. 实体提取逻辑(自定义或用AI服务)

你可以自己写正则表达式提取实体,也可以用LUIS、Dialogflow这类AI服务来做更精准的识别。下面是一个简单的正则提取示例:

private List<string> ExtractFoodEntities(string input)
{
    // 匹配常见食物,你可以根据需求扩展正则规则
    var foodRegex = new Regex(@"(burger|pizza|fries|sandwich|noodles)", RegexOptions.IgnoreCase);
    var matches = foodRegex.Matches(input);
    // 去重后返回提取到的实体
    return matches.Select(m => m.Value.ToLower()).Distinct().ToList();
}

为什么不用Choice Prompt?

Choice Prompt的设计初衷是引导用户从固定选项中选择,如果用户输入非选项内容,它会自动重复提示,完全限制了自由输入的可能性。而我们需要的是Suggested Actions作为“辅助选项”,不限制用户的输入自由,所以直接发送带快速回复的普通消息才是正确的方向。

内容的提问来源于stack exchange,提问作者Sebastian Felix Schwarz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:48:26