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

LUIS多重复预构建实体识别及.NET代码实现往返航班实体映射

关于LUIS多实体识别与航班预订场景的.NET代码实现方案

嘿,咱们一步步拆解你的问题哈!

首先回答第一个问题:LUIS能识别utterance中的多个相同预构建实体吗?

当然可以!LUIS完全支持识别同一条 utterance 里的多个同类型预构建实体,比如你提到的Builtin.DateTimeV2和Builtin.DateTimeV2.TimeRange。只要 utterance 里的内容符合预构建实体的匹配规则,LUIS会把所有匹配到的实体都返回,每个实体还会附带在文本中的位置、具体值、类型等关键信息,这也是咱们后续代码处理的基础。

重点解决:.NET代码处理出发/返程时间关联的问题

针对你说的「出发无时间范围、返程含时间范围」的场景,咱们可以通过提取实体+上下文关联+业务兜底的思路来实现精准输出。下面是具体的代码实现和优化建议:

1. 先定义一个用于存储预订结果的模型类

这个类用来规整最终要输出的格式,方便后续使用:

public class FlightBookingInfo
{
    // 自定义目的地实体
    public string FromDestination { get; set; }
    public string ToDestination { get; set; }
    
    // 出发时间相关
    public string DepartureDate { get; set; }
    public string DepartureTimeRange { get; set; }
    
    // 返程时间相关
    public string ReturnDate { get; set; }
    public string ReturnTimeRange { get; set; }
}

2. 编写实体处理逻辑

核心思路是先提取所有实体,再根据 utterance 的语义顺序、关键词(比如「return」「返程」)来绑定出发/返程的时间关联:

using Microsoft.Bot.Builder.AI.Luis;
using Newtonsoft.Json.Linq;

public FlightBookingInfo ProcessFlightBookingResult(RecognizerResult luisResult)
{
    var bookingInfo = new FlightBookingInfo();
    
    // 第一步:提取自定义目的地实体
    bookingInfo.FromDestination = luisResult.Entities["FromDestination"]?
        .FirstOrDefault()?.ToString() ?? "未指定出发地";
    bookingInfo.ToDestination = luisResult.Entities["ToDestination"]?
        .FirstOrDefault()?.ToString() ?? "未指定目的地";
    
    // 第二步:提取所有预构建的日期/时间范围实体
    var dateTimeEntities = luisResult.Entities["datetimeV2"]?
        .Select(e => e["values"].FirstOrDefault() as JObject)
        .ToList();
    var timeRangeEntities = luisResult.Entities["datetimeV2.TimeRange"]?
        .Select(e => e["values"].FirstOrDefault() as JObject)
        .ToList();
    
    // 第三步:处理日期关联(默认按utterance顺序,第一个是出发日,第二个是返程日)
    if (dateTimeEntities?.Count >= 2)
    {
        bookingInfo.DepartureDate = dateTimeEntities[0]["value"].ToString();
        bookingInfo.ReturnDate = dateTimeEntities[1]["value"].ToString();
    }
    else if (dateTimeEntities?.Count == 1)
    {
        // 只有一个日期时,默认是出发日,返程日留空提示补充
        bookingInfo.DepartureDate = dateTimeEntities[0]["value"].ToString();
        bookingInfo.ReturnDate = "请补充返程日期";
    }
    else
    {
        // 无日期时的业务兜底
        bookingInfo.DepartureDate = "尽快出发";
        bookingInfo.ReturnDate = "请补充返程日期";
    }
    
    // 第四步:处理时间范围关联(重点针对「出发无时间、返程有时间」的场景)
    var utteranceText = luisResult.Text.ToLower();
    bool hasReturnKeyword = utteranceText.Contains("返程") || utteranceText.Contains("return") || utteranceText.Contains("back");
    
    if (timeRangeEntities?.Count == 1)
    {
        if (hasReturnKeyword)
        {
            // 有返程关键词,唯一的时间范围绑定到返程
            bookingInfo.ReturnTimeRange = timeRangeEntities[0]["value"].ToString();
            bookingInfo.DepartureTimeRange = "任意时间";
        }
        else
        {
            // 无返程关键词,默认绑定到出发
            bookingInfo.DepartureTimeRange = timeRangeEntities[0]["value"].ToString();
            bookingInfo.ReturnTimeRange = "任意时间";
        }
    }
    else if (timeRangeEntities?.Count >= 2)
    {
        // 两个时间范围,按顺序绑定出发/返程
        bookingInfo.DepartureTimeRange = timeRangeEntities[0]["value"].ToString();
        bookingInfo.ReturnTimeRange = timeRangeEntities[1]["value"].ToString();
    }
    else
    {
        // 无时间范围时的兜底
        bookingInfo.DepartureTimeRange = "任意时间";
        bookingInfo.ReturnTimeRange = "任意时间";
    }
    
    return bookingInfo;
}

3. 进阶优化建议(让识别更精准,减少代码判断)

上面的代码是基于现有实体的处理方案,如果你想进一步提高准确率,可以在LUIS控制台做以下配置:

  • 给预构建实体添加角色:给DateTimeV2实体添加DepartureDateTime和ReturnDateTime两个角色,然后通过模式(Patterns)或者示例 utterance 训练LUIS,让它直接识别出哪个时间属于出发、哪个属于返程。这样代码里不用靠顺序判断,直接根据角色提取即可,更可靠。
  • 添加模式匹配:比如创建模式预订从 {FromDestination} 到 {ToDestination} 的航班,{datetimeV2:DepartureDateTime} 出发,{datetimeV2:ReturnDateTime} {datetimeV2.TimeRange:ReturnTimeRange} 返回,强化LUIS对实体关联的识别能力。
  • 添加短语列表:把「出发」「返程」「去程」「回程」这类关键词添加到短语列表,提升LUIS的语义理解。

内容的提问来源于stack exchange,提问作者PavanKumar GVVS

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:24:16