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

Bot Framework中Terms属性控制配料选择不符合预期,求排查

排查Bot Framework FormFlow中"everything except pickles"解析异常的问题

我来帮你定位这个FormFlow的Terms属性和排除逻辑问题!结合你的代码和FormFlow的工作机制,问题大概率出在枚举的Terms配置和字段的多选/排除逻辑支持上,下面一步步分析:

1. 核心问题:枚举Terms属性的错误配置

你给Everything枚举值添加的Terms里包含了except、but这类否定操作词,这会让FormFlow错误地把这些词当成Everything的同义词,而不是用来识别“排除某项”的逻辑标识。

比如输入“everything except pickles”时,FormFlow可能会把“except”也识别为触发Everything的关键词,同时又把“pickles”添加到配料列表里,最终结果就和预期不符了。

修正后的枚举定义

把否定操作词从Everything的Terms中移除,只保留表示“全部”的同义词:

public enum ToppingOptions
{
    [Terms("all", "everything")]
    Everything = 1,
    Avocado,
    BananaPeppers,
    Cucumbers,
    GreenBellPeppers,
    Jalapenos,
    Lettuce,
    Olives,
    Pickles,
    RedOnion,
    Spinach,
    Tomatoes
}

2. 确保FormFlow支持多选和排除逻辑

你的Toppings字段是List<ToppingOptions>(多选类型),但需要在FormBuilder里明确配置字段的多选支持,并且确保FormFlow能正确解析否定性的输入:

修正后的BuildForm方法

[Serializable]
public class SandwichOrder
{
    [Prompt("Which {&} would you like? You can say 'everything except pickles' or list specific toppings. {||}")]
    [Describe("toppings")]
    public List<ToppingOptions> Toppings;

    public static IForm<SandwichOrder> BuildForm()
    {
        return new FormBuilder<SandwichOrder>()
            .Message("Welcome to the simple sandwich order bot!")
            // 明确配置Toppings字段为多选,并启用否定解析支持
            .Field(nameof(SandwichOrder.Toppings), field =>
                field.SetAllowsMultiple(true)
                     // 可选:自定义验证逻辑,处理Everything和排除项的组合
                     .SetValidate(async (state, value) =>
                     {
                         var selectedToppings = value as List<ToppingOptions>;
                         var validateResult = new ValidateResult { IsValid = true };

                         if (selectedToppings?.Contains(ToppingOptions.Everything) == true)
                         {
                             // 获取所有配料(排除Everything本身)
                             var allToppings = Enum.GetValues(typeof(ToppingOptions))
                                 .Cast<ToppingOptions>()
                                 .Where(t => t != ToppingOptions.Everything)
                                 .ToList();

                             // 移除用户指定要排除的配料
                             var excludedToppings = selectedToppings.Where(t => t != ToppingOptions.Everything).ToList();
                             validateResult.Value = allToppings.Except(excludedToppings).ToList();
                         }
                         else
                         {
                             validateResult.Value = selectedToppings;
                         }

                         return validateResult;
                     }))
            .Build();
    }
}

3. 额外验证点

  • 确保你的Bot Framework版本是支持否定解析的较新版本(FormFlow在早期版本中对排除逻辑的支持有限)。
  • 在模拟器中测试时,输入要清晰,比如避免拼写错误,确保“pickles”和枚举值的名称/拼写完全匹配。

按照上面的修改后,再测试“everything except pickles”,应该就能得到正确的配料列表(所有配料除了pickles)了!

内容的提问来源于stack exchange,提问作者Jason Evans

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:58:59