Alexa 有一个非常好的自然语言处理引擎。但是,市场上还有其他 NLP 引擎可以使用,并且这些引擎包含越来越多的功能。
先决条件
在这里你有这个项目中使用的技术:
Node.js v12.x
视觉工作室代码
Azure 帐户
前言
Alexa 的 NLP 涵盖了 99% 的最常见用户用例,我们可以使用其引擎创建强大的 Alexa Skills。然而,事实上,NLP 引擎 MS LUIS 已经发展了很多,在那里我们可以找到很多我们在 Alexa 中找不到的功能,例如它的预建域或其预建实体、子实体和正则表达式实体.
设置我们的 Alexa 技能
我们需要做的第一件事是建立我们的交互模型。为此,我们将创建OrderIntent
.在这个例子中,这个意图只有一个话语和一个槽。此插槽将具有以下AMAZON.SearchQuery
类型:
根据定义,AMAZON.SearchQuery
槽是一种与其他槽略有不同的槽,有了这个槽,我们将能够识别构成搜索查询的不太可预测的输入。它基本上是一个搜索查询,就像您可能输入到标准搜索引擎中一样。要使用此插槽,您必须在您的话语中添加一个载体短语。在这种情况下,我使用了I want
.所以基本上我们将在我们说完之后将 Alexa 识别的所有内容发送到 MS LUISI want...
。
创建 Azure 认知服务
要通过 Amazon Alexa Skill 与 Microsoft LUIS 应用程序交互,我们需要创建一些 Azure 资源。
为此,我们需要在Azure 门户上创建一个自然语言理解服务和认知服务:
注意:确保您在创建过程中检查了预测和创作服务。
在此之后,请确保复制端点。我们将使用此端点与 MS LUIS 进行交互。您可以在Keys and Endpoint部分找到创建后的端点:
另外,请确保您已复制region
和Key 1
(这是我们将在接下来的步骤中使用的订阅 ID)!
创建 MS LUIS 应用程序
创建 Azure 资源后,必须在Luis 门户上创建 MS Luis 应用程序:
注意:确保您使用在上一步中创建的预测端点。
现在我们有了 MS LUIS 应用程序,让我们在这里添加交互模型:
构建实体和意图后,必须训练模型并将 LUIS 应用发布到Staging
.
从 Alexa Skill 调用 MS LUIS
现在我们已经设置好了一切,让我们来编写我们的代码吧!为了与来自 Alexa Skill Lambda 编写的 Node.JS 的 MS LUIS 进行交互,我们将使用名为@azure/cognitiveservices-luis-runtime
.您可以在此处找到该软件包的完整文档。
首先,我们必须创建我们的OrderIntentHandler
which 是将管理来自以下所有请求的处理程序OrderIntent
:
constOrderIntentHandler={canHandle(handlerInput){returnAlexa.getRequestType(handlerInput.requestEnvelope)==='IntentRequest'&&Alexa.getIntentName(handlerInput.requestEnvelope)==='OrderIntent';},asynchandle(handlerInput){predictionRequest.query=Alexa.getSlotValueV2(handlerInput.requestEnvelope,'luisquery').value;varresult=awaitclient.prediction.getSlotPrediction(appId,'Staging',predictionRequest,{verbose:true,showAllIntents:true});varspeak=intentDispatcher(result.prediction.topIntent,result.prediction.entities)returnhandlerInput.responseBuilder.speak(speak).reprompt(speak).getResponse();}};
正如您在上面的代码中看到的,我们从我们AMAZON.SearchQuery
调用的槽中获取值luisquery
,然后我们使用client
和 函数将该值发送到 MS LUISgetSlotPrediction
。
要构建客户端,我们需要 3 个属性:
MS LUIS 应用程序 ID:您可以在 LUIS 门户上的 LUIS 应用程序中找到此值。
MS 订阅 ID。这个 MS 订阅 ID 是我们必须在上一步中获得的 ID。
MS LUIS 预测终点。此端点是我们必须在上一步中获得的端点。
当我们拥有这些属性时,我们可以像这样创建我们的 MS LUIS 客户端:
require('dotenv').config({path:'.env'})const{CognitiveServicesCredentials}=require("@azure/ms-rest-azure-js");const{LUISRuntimeClient}=require("@azure/cognitiveservices-luis-runtime");letsubscriptionKey=process.env["subscription-key"];constcreds=newCognitiveServicesCredentials(subscriptionKey);constclient=newLUISRuntimeClient(creds,process.env["endpoint"]);constappId=process.env["app-id"];//replacethiswithyourappId.constpredictionRequest={query:"",options:{datetimeReference:newDate(),preferExternalEntities:true}};
我们将从 MS LUIS 收到的结果将由以下人员管理intentDispatcher
:
functionintentDispatcher(intent,entities){varresult='';switch(intent){case'PizzaIntent':result=`Okay,Iwillgiveyou${entities['number']}Pizzas`break;case'BurgerIntent':result=`Okay,Iwillgiveyou${entities['number']}Burgers`break;default:result='SorryIdidn\'tcatchyou'break;}returnresult;}
最后结果
就是这样,您可以运行完整的代码。Alexa 使用 LUIS 作为其 NLP 引擎:
资源
官方 Alexa Skills Kit Node.js SDK
官方 Alexa Skills Kit 文档
官方 Express 适配器文档
官方 Microsoft Azure SDK 文档
结论
如您所见,我们可以在我们的 Alexa Skills 中以简单的方式集成其他 NLP 引擎。这个例子只是一个实验和一个简单的展示,但我建议你只使用 Alexa 内置的 NLP,因为你可以使用AMAZON.SearchQuery
.
我希望这个示例项目对你有用。您可以在此处找到代码。