2017 年 1 月

第 32 卷,第 1 期

此文章由机器翻译。

认知服务 - 使用 LUIS 进行自然语言交互

通过Ashish Sahu

针对技术领域已在最近几年中相当从根本上更改。计算能力从移动 Pc 到智能手机和服饰,将更多的功能添加到这些设备时。这一改进的技术也已更改我们与我们的设备交互的方式。已用软件实现和输入的方法从触笔更改为仅仅两根手指点击替换物理键盘。这是时间的迟早会寻找更加轻松的方法与我们的计算设备进行交互,我们开始之前。

语音是我们如何彼此交互,现在,我们已在几乎可以使用语音还与我们的所有智能设备进行交互。Bot 框架和认知服务生成 2016年大会上的最近启动是实现该愿景努力的步骤。其中惊人的认知服务,语言理解智能服务 (LUIS) 为您提供的功能,以理解自然语言查询并返回可操作的信息,您可以将绑定代码来改善用户体验。

在本文中,我将探索 LUIS 的功能,并看看您可以使用它在您的应用程序和服务中的不同方式。

LUIS 工作是如何?

LUIS 由 Microsoft research 开发构建在交互式机器学习和语言理解研究。"机器学习"(McGraw Hill,1997年) 通过 Tom Mitchell 本书定义了作为机器学习︰

"计算机程序是说要了解如何执行某项任务 T 从经验 E,如果在任务 T,其性能测量的性能指标 P,提高与随着时间的推移体验 E。"

像任何其他机器学习模式,LUIS 是这一概念的迭代。它使用一个语言模型和训练示例集来分析口语并返回仅,作为开发人员,可用于让用户更满意的值得关注的部分。

LUIS,除了使用您自己的具有特定用途的语言模型,您还可以利用同一预先存在并预构建由 Bing 和 Cortana 的语言模型。

LUIS 有非常具体的用例,您可以利用 LUIS 您具有需要允许用户与您的应用程序使用语音交互的任何位置。大多数数字助手、 启用语音的应用程序/设备和机器人属于此类别中,但您可以自由地使用您的想象力。

其中使用 LUIS?

与您的应用程序和服务使用 LUIS 需要初始设置。完成所需做一些准备工作由了解方案和预期将会发生应用程序和用户之间的交互组成。了解和预期交互将帮助您构建的语言模型以使用与 LUIS 并提出了基本的自然语句来训练 LUIS 来对它们进行分析。

语言模型

语言模型是特定于 LUIS 应用程序。它们构成了解用户时,意味着什么与您的应用程序和服务的基础。有两个核心部分语言模型 –"颜色"和"实体。 LUIS 应用程序使用的颜色和实体来处理自然语言查询和派生意图和感兴趣的主题的帮助下的用户的训练示例,也称为"语句。" LUIS 应用程序始终包含默认的方法名为"None。 此方法获取映射到无法映射到任何其他方法的所有语句。在应用程序的上下文,方法是用户想要实体获取筛选主题为您的应用程序和服务设计为处理的同时执行的操作。

一个示例,了解这将很难想象购物应用程序和以下模型︰

"intents": [
  {
    "name": "ShowItems"
  }
  {
    "name": "BuyItems"
  }
],
"entities": [
  {
    "name": "Item"
  }
]

大部分购物应用程序中所花费的时间可能是待售项,并且当有人谈及"显示红色 scarves"模型将作为与实体项意向和红色 scarves 到 ShowItems 映射此语句。在同一时间可以映射到 BuyItems 意向的语句,并因此启动结帐过程,当有人谈及,"I 'd like to 现在付费。"

意向

LUIS 方法还支持操作绑定,这样就可以将参数绑定到您的方法。仅当这些参数,它还提供了时,将触发可操作的方法。特别是,当操作绑定使用机器人,LUIS 可以以交互方式查询来自用户的参数。

根据示例和学习,LUIS 启动检测中向其发布的查询的意图。但是,因为语言查询计算机应用程序比较棘手,LUIS 还分数它们之间 0 和 1 以指示其信心;更高作用域表示较高置信度。

实体

LUIS 实体,如下所述,是您的用户感兴趣的主题。如果您正在构建新闻应用程序,实体将映射到的新闻主题,并发生天气应用程序,它们映射到其最基本的迭代中的位置。

LUIS active 学习也将启动在您添加新的语句,您会看到经过彩色编码以直观地显示映射的相应实体时显示。

实体可以拥有子元素,则可以单独映射每个到各个部分的语句。您还可以支持复合实体,共同构成了单个实体的特性的集合。

为便于理解,名为"车辆"的实体可以具有称为"汽车"和"Suv,"其他名称之间的子实体。此关系可帮助您将多个实体映射到更大的类别。对于"复合实体,"的各个部分将表示一个单个实体的它的各种属性。名为汽车的复合实体的一个示例是 2016年黑色 Ford Mustang,年、 颜色、 品牌和型号信息组成。

预生成的实体

与任何编程语言中的数据类型类似,LUIS 服务包括一组多个公共实体的实体,因此无需转,考虑每个可能的术语您的用户可能会引发着您。一些示例包括日期、 时间、 数字和地理实体的最常见变体。可以在您的应用程序中包括的预建的实体,并在您标记的活动中使用它们。请记住预建的实体的行为,不能更改。

LUIS 文档中找不到预建的实体的详尽列表。

虽然可能要添加很多在模型中的方法和实体 (以及预建的实体),但需要注意的一点是使其保持简单而精确。可以以最明显的语句开头,并添加多个文件以使其为您的用户更自然。但请记住之前想要构建的体验的思维极大地增强用户体验和不断发展的进一步的体验中。如果没有预先规划并在您的模型中更改颜色或多个实体,您必须要标记所有语句并再次重新训练您的模型。

让我们生成内容 !

它是与 LUIS 让滑水感觉的时间,而构建某些内容。在本文中,我将介绍在库存应用程序。我将构建一个语言模型使用意向和实体、 训练该模型,然后在使用该命令由 Bot Framework bot 并使用 REST 终结点的通用 Windows 平台 (UWP) 应用程序,LUIS 公开,以便我能够使用所有功能。

为了简单起见,我们将用以衣服的清单。首先,登录到在 luis.ai LUIS 门户并创建新的应用程序。

此清单应用程序,将使用它来跟踪库存的股票和实现此目的,您要添加的第一个目的是 ListItems。会将此意向映射到用户的意图所在查询清单作为一个整体或项的所有语句。

当您创建将意向时,LUIS 应用程序还将要求的示例语句。此语句是第一个的自然语言查询,以触发此目的。单击"颜色"旁边的"+"按钮,然后添加"列表项。"形式的意图的名称 示例语句将为简化︰ "显示我的清单。"

保存此意向将您带到"新语句"屏幕。图 1显示以及映射到它在它旁边的下拉菜单中的列表项意图示例语句。

语句和意图的示例
图 1 示例语句和意图的

单击提交按钮将此语句添加到您 LUIS 的应用程序。LUIS 可以开始处理其神奇功能为您之前,必须添加多个此类语句,以帮助 LUIS 更准确地了解意图。请记住,语句必须项目中的一个形式的同一个意图图 1,但同时,它们应该是请求股票时,用户会自然地说︰ "显示股票"说到一点。

现在,两个语句添加到您的应用程序后,单击左下角以查看是否 LUIS 应用程序具有足够的信息来了解何时触发 ListItems 意向训练按钮。框架以及触发器定期对其自身的、 培训。添加几个示例后培训您的模型可以帮助您提前确定模型的任何问题并采取纠正措施。因为 LUIS 框架还提供了活动的学习,您将受益于培训中,如示例语句将进行评分会自动为您添加它们。

展望未来,与您的应用程序,也很自然要询问有关您正在存储,因此还认为有关示例,如"显示的红色 scarves stocks"和"多少衬衫我们有库存?"特定商品的库存

但是,这些查询是不同于你已添加到目前为止。这些查询中包含的条款"红色 scarves"和"衬衫。" 这意味着您需要超过您的意图,列表项,以向您的用户返回正确的结果。您需要一个称为"项目,"将映射到这些条款才能语言模型中添加更多的智能实体。

可以将这些语句添加到您 LUIS 的应用程序和更高版本,标签实体,但这种情况下,会将实体添加第一个和语句。单击实体旁边的"+"按钮,并将此实体的项。

现在,可以添加之前提到的这些查询,并在同一时间用意图和实体进行标记。为此,只需添加您语句并如果意图尚未已映射的分数,选择相关方法,然后单击该术语"衬衫"映射具有项实体。

从对其进行标记的列表中选择项目项。添加已经提到过的其他示例 —"显示的红色 scarves stocks"— 而不是映射只是"scarves",选择"红色"和"scarves"同时作为项的实体。注意: 收藏浏览器中,边缘时,不允许您 LUIS 门户中选择多个单词。使用您选择的任何其他浏览器执行此操作。

还要注意的术语"红色 scarves"处在复合实体的类别中,因为它们表示一个单个实体一起 — scarves,在其中有红色。如前面所述,复合实体将进行多个部分,但表示一个单位的对象,如"黑色鞋"和"2016 Ford Mustang。" 但是,为了简单起见,您要将它们视为单个实体。

再次来训练该模型并查看活动学习在 LUIS 是否介入。现在,尝试添加语句如,"多少 wallets 做我们中的股价图、"或"显示我的股票 trousers"。

您可能会发现结果感兴趣。请注意,术语"wallets"获取映射到项实体,但"trousers"不会。不要慌,这只是表明 LUIS 需要几个更多示例,要弄明白遵循相同的模式的语句。若要做到这一点,将"trousers"映射到项实体,并为模型定型一次。

若要测试这一点,请尝试将"显示红色衬衫的股票"显示大受青睐的股票"添加并验证红色 shirts 和短裤获取映射到正确的颜色和实体。我希望您的实际效果并不会因我到目前为止。

使用门户中的建议部分,您还可以获取建议 Cortana 日志中的各个方法和实体。

一旦意向和实体获取正确映射,您可以将移动到上 LUIS 您之旅的下一个阶段。

LUIS 使用实际的应用程序

此 LUIS 应用程序现在; 不是适用于您的用户您需要从您的应用程序和服务连接到此应用程序。由于通过 REST 终结点公开 LUIS 应用程序且以 JSON 格式返回响应后,您可以使用从任何平台或编程语言的 LUIS 服务,可以使用 HTTPS 协议进行连接和分析 JSON 响应。

注意: LUIS 门户还公开了从"My Application"部分,以进行脱机更改并将其导回的 JSON 文档形式导出 LUIS 应用程序的导出功能。在与 LUIS Api 和 C# SDK 结合使用,您可以在您开发运营流程,以及集成 LUIS。

您还需要先发布 LUIS 应用程序之后才能开始调用它从您的应用程序,这因为它变得越来越一样简单,︰ 只需单击发布按钮,然后再次单击发布 Web 服务按钮。

请注意,REST 终结点 URI 还包括您 LUIS 应用程序 ID 和订阅密钥。保护这些信息,尽量就像任何其他凭据,否则会导致服务中断和财务影响。

一旦已发布应用程序,您应能够通过在查询输入框中键入任何其他示例中对其进行测试和测试您的模型的准确性。通过输入"多少 ties 方面我们拥有在库中?"来进行这种尝试,然后按键盘上的 Enter 键。

这将打开一个新的浏览器窗口,并应采用 JSON 格式获得响应,如中所示图 2

图 2 测试 LUIS 应用程序

{
 "query": "how many ties do we have in the stock?"
 "intents": [{
  "intent": "ListItems",
  "score": 0.9999995
 }, {
  "intent": "None",
  "score": 0.0582637675
 }],
 "entities": [{
  "entity": "ties",
  "type": "Item",
  "startIndex": 9,
  "endIndex": 12,
  "score": 0.903107
 }]
}

该响应包括传递给 LUIS 应用程序,以及使用的方法和在查询中检测到的实体的查询字符串。此外包括了为每个单独的评分信息。这些分数很重要,因为它们是直接的语言模型和培训正在执行的指示符。当你添加多个语句,以及对您的模型进行任何更改,此对话框中还提供一个选项以发布更新。每个培训课程很重要,因为它将继续使用较旧的定型模型,并从 HTTP 终结点响应将延迟您的预期值后,请更新 LUIS 应用程序。

分析性能的语言模型

添加太多的语言的变体可能会导致错误,可能会强制您可以更改语言模型。若要解决这些问题,LUIS 门户的功能的性能分析部分。您可以使用此部分来了解 LUIS 应用程序的检测方法和实体时的执行方式。在本部分中,可以获取意向和实体的所有的彩色编码的性能概述。

具体取决于培训、 示例和使用的语言模型,LUIS 应用程序可能还会遇到问题无法正确地映射意向或多个实体时。可能还存在其中添加多个语句类型却是一头 LUIS 服务的情况。向下钻取使用性能分析的性能,可以轻松地跟踪这些问题。下拉菜单中,还可以向下钻取到各个意图和实体的分析。

此外可以在您的语言模型中获取对应于实体的类似信息。

此信息,以及在门户中,查看标签部分可以帮助您查看和分析您的语言模型的任何错误。

从 C# UWP/ASP.NET 应用程序调用 LUIS

如果您正在构建 UWP 应用程序或使用 C# 的 ASP.NET Web 应用程序,则可以使用的类中表示图 3进行反序列化 JSON 响应。

图 3 个类以反序列化 JSON 响应

public class LUISResponse 
{ 
    public string query { get; set; } 
    public lIntent[] intents { get; set; } 
    public lEntity[] entities { get; set; } 
} 

public class lIntent 
{ 
    public string intent { get; set; } 
    public float score { get; set; } 
} 

public class lEntity 
{ 
    public string entity { get; set; } 
    public string type { get; set; } 
    public int startIndex { get; set; } 
    public int endIndex { get; set; } 
    public float score { get; set; } 
}

中的代码图 4在 C# UWP 或 ASP.NET 应用程序可以使用这些类以获得的意图并使用实体的信息。

图 4 代码,用于获取意向和实体信息

private async Task LUISParse(string queryString) 
{ 
    using (var client = new HttpClient()) 
    { 
        string uri = 
          "https://api.projectoxford.ai/luis/v1/application?id=<YOUR LUIS APP ID> 
            &subscription-key=<YOUR LUIS APP KEY>&q=" + queryString; 
        HttpResponseMessage msg = await client.GetAsync(uri); 
        if (msg.IsSuccessStatusCode) 
        { 
            var jsonResponse = await msg.Content.ReadAsStringAsync(); 
            var _Data = JsonConvert.DeserializeObject<LUISResponse>(jsonResponse); 
            var entityFound = _Data.entities[0].entity;   
            var topIntent = _Data.intents[0].intent; 
        } 
    } 
}

根据您的需求,您可以通过一个循环来提取不同类型的多个实体,以及关于在查询字符串中检测到方法的分数信息运行响应。

使用随 Bot 框架 LUIS

如果您在使用 Bot 框架来构建 bot 并希望使用 LUIS 添加自然语言智能,您会高兴地知道,Bot SDK 中的 Microsoft.Bot.Builder 命名空间就非常容易地与 LUIS 应用程序连接并筛选出的颜色和实体。在您的 Bot Framework 解决方案 MessageController,添加以下行以将所有传入的消息路由到名为 LuisConnect 类︰

await Microsoft.Bot.Builder.Dialogs.Conversation.SendAsync(activity,
  () => new LuisConnect());

现在将在您的项目中调用 LuisConnect.cs 类文件添加和更改的代码,如中所示图 5

图 5 添加此类文件 LuisConnect.cs

using System;
using System.Net.Http;
using System.Threading.Tasks;
using System.Web.Http;
using Microsoft.Bot.Connector;

namespace BotApp2
{
    [LuisModel("<application-id>", "<subscription-key>")]
    [Serializable]
    public class Luis : LuisDialog<object>
    {
        [LuisIntent("")]
        public async Task None(IDialogContext context, LuisResult result)
        {
            stringmessage = 
              "I’m sorry I didn't understand. Try asking about stocks or inventory.";
            await context.PostAsync(message); context.Wait(MessageReceived);
        }

        [LuisIntent("ListItems")]
        public async Task ListInventory(IDialogContext context, LuisResult result)
        {
            string message = "";
            if (result.Entities.Count != 0 && result.Intents.Count 0 )
                message = $ "detected the intent \ "{ result.Intents[0].Intent}\"
                for \"{result.Entities[0].Entity}\". Was that right?";
                wait context.PostAsync(message); conext.Wait(MessageReceived);
        }

        public async Task Start Async(IDialogContext context)
        {
            context.Wait(MessageReceived);
        }
    }
}

运行您的本地 bot 并尝试询问问题如"显示的股票衬衫,"或,"多少安全带我们有库存?",您应该获取适当的响应与意图和从 bot 返回实体。

有关中的代码最有趣的部分图 5是只需要标签 [LuisIntent] 与您的方法和 SDK 会负责调用 LUIS 应用程序和从 LUIS 服务得到的结果。这就非常快速而又简单启动在应用程序中添加的语言智能。

使其更好

本文的重点是让您熟悉 LUIS 和集成的工作原理,因此我没有使用真正简单的示例。有两个部件 LUIS 绑定以使工作更轻松︰ 正则表达式和短语列表功能。

像名称所示,正则表达式功能可帮助在匹配您的说法,例如,但产品代码中的重复模式。短语列表功能可以作为可互换的词或短语列表,用于在您的语句中查找。例如,在应用程序,我们有开始使用"显示股票,"语句"找到我的股票,""数量",依次类推。在开始调用 InventoryQueries 短语列表中添加这些短语将不再需要单独为与这些语句的更多示例模型定型。我要将此给您探索和体验。

未来

产品 LUIS 已准备好在您的应用程序中使用,但仍改进,并且经常添加新功能。有没有涉及到在此门户中,但可用于公共预览版的一些功能。它们是令人兴奋和仍处于开发阶段︰

  • 与 Bot 集成框架与 Slack: 您可以试用此项在预览版门户中发布 LUIS 应用程序时。这一集成,可以快速将与 Microsoft Bot 框架与 Slack 的集成 LUIS。
  • 对话框支持︰ LUIS 中的对话框支持允许您添加会话的智能 LUIS 应用程序中,以便它可以请求来自用户自己的详细信息如果查询所需的更多消息提供通过在第一个用户。例如,航班应用程序会提示的差旅日期如果用户要求有关的只是城市名称的航班信息
  • 操作执行︰ 此功能可以满足使用右从 LUIS 应用程序的内置和自定义通道的用户触发操作。

这些功能都令人兴奋,并启用更自然的会话交互应用程序中不费吹灰之力。他们需要靠自己的深度探索,并且我希望能够做到这一点很快。

总结

我希望您现在知道了 LUIS 可为您做什么,如何轻松地开始利用它更自然的人机交互元素添加到您的应用程序。

在本文中,我通过了 LUIS 服务的基础知识。我创建了 LUIS 应用程序、 生成和定型语言模型,以帮助您了解公司要求的内容时用户的含义。我还介绍了在其中从您的应用程序,Web 服务以及在您 bot 中可以使用这个 LUIS 应用程序的方式。可以在 GitHub 上找到包含 LUIS 模型、 UWP 应用程序和本文中提到的 bot 示例代码的示例项目bit.ly/2eEmPsy


Ashish Sahu是高级的技术推广人员,在 Microsoft India 与开发人员体验一起使用时,帮助 Isv 和创业公司解决技术难题,采用最新技术,并且发展到下一级其解决方案。 他可以致电ashish.sahu@microsoft.com

衷心感谢以下 Microsoft 技术专家对本文的审阅: Srikantan Sankaran
Srikantan Sankaran 是从在印度,基于外班加罗尔 DX 团队的技术推广人员。他与印度的众多独立软件开发商合作,帮助他们在 Microsoft Azure 上生成和部署解决方案。