如何使用 REST API 更新 LUIS 模型
重要
LUIS 将于 2025 年 10 月 1 日停用,从 2023 年 4 月 1 日开始,你将无法创建新的 LUIS 资源。 建议将 LUIS 应用程序迁移到对话语言理解,以便从持续的产品支持和多语言功能中受益。
在本文中,你要将示例言语添加到披萨应用并训练该应用。 示例话语是映射到意向的对话式用户文本。 通过提供意向的示例话语,可以教 LUIS 识别用户提供的文本类型属于哪种意向。
先决条件
示例话语 JSON 文件
示例言语采用特定格式。
text
字段包含示例话语的文本。 intentName
字段必须对应于 LUIS 应用中的现有意向名称。 entityLabels
字段是必填的。 如果不想标记任何实体,请提供一个空数组。
如果 entityLabels 数组不为空,则 startCharIndex
和 endCharIndex
需要标记 entityName
字段中引用的实体。 该索引从零开始。 如果标签的起始或结尾位于文本中的空白处,则添加话语的 API 调用将失败。
[
{
"text": "order a pizza",
"intentName": "ModifyOrder",
"entityLabels": [
{
"entityName": "Order",
"startCharIndex": 6,
"endCharIndex": 12
}
]
},
{
"text": "order a large pepperoni pizza",
"intentName": "ModifyOrder",
"entityLabels": [
{
"entityName": "Order",
"startCharIndex": 6,
"endCharIndex": 28
},
{
"entityName": "FullPizzaWithModifiers",
"startCharIndex": 6,
"endCharIndex": 28
},
{
"entityName": "PizzaType",
"startCharIndex": 14,
"endCharIndex": 28
},
{
"entityName": "Size",
"startCharIndex": 8,
"endCharIndex": 12
}
]
},
{
"text": "I want two large pepperoni pizzas on thin crust",
"intentName": "ModifyOrder",
"entityLabels": [
{
"entityName": "Order",
"startCharIndex": 7,
"endCharIndex": 46
},
{
"entityName": "FullPizzaWithModifiers",
"startCharIndex": 7,
"endCharIndex": 46
},
{
"entityName": "PizzaType",
"startCharIndex": 17,
"endCharIndex": 32
},
{
"entityName": "Size",
"startCharIndex": 11,
"endCharIndex": 15
},
{
"entityName": "Quantity",
"startCharIndex": 7,
"endCharIndex": 9
},
{
"entityName": "Crust",
"startCharIndex": 37,
"endCharIndex": 46
}
]
}
]
创建 Pizza 应用
创建披萨应用。
- 选择 pizza-app-for-luis-v6.json,打开
pizza-app-for-luis.json
文件的 GitHub 页面。 - 右键单击或长按“原始”按钮,然后选择“将链接另存为”,将 保存到计算机。
- 登录到 LUIS 门户。
- 选择我的应用。
- 在“我的应用”页面上,选择“+ 新建用于对话的应用” 。
- 选择“导入为 JSON”。
- 在“导入新应用”对话框中,选择“选择文件”按钮 。
- 选择下载的
pizza-app-for-luis.json
文件,然后选择“打开”。 - 在“导入新应用”对话框的“名称”字段中,输入 Pizza 应用的名称,然后选择“完成”按钮 。
随即导入应用。
如果看到一个对话框“如何创建有效的 LUIS 应用”,关闭该对话框。
训练并发布 Pizza 应用
Pizza 应用中应会显示“意向”页面,其中显示了一个意向列表。
在 LUIS 网站的右上方,选择“训练”按钮。
当“训练”按钮处于禁用状态时,即表示训练完成。
若要在聊天机器人或其他客户端应用程序中接收 LUIS 预测,需要将应用发布到预测终结点。
在右上方的导航栏中选择“发布”。
选择“生产”槽,然后选择“完成” 。
在通知中选择“访问终结点 URL”,以转到“Azure 资源”页 。 只有你拥有与应用关联的预测资源时,才能看到 URL。 还可以单击“管理”来找到“Azure 资源”页 。
向披萨应用添加创作资源
- 选择“管理”。
- 选择“Azure 资源”。
- 选择“创作资源”。
- 选择“更改创作资源”。
如果你有创作资源,请输入你的创作资源的租户名称、订阅名称以及 LUIS 资源名称。
如果你没有创作资源:
- 选择“新建资源”。
- 输入租户名称、资源名称、订阅名称和 Azure 资源组名称。
现在 Pizza 应用可以使用了。
记录 Pizza 应用的访问值
若要使用新的披萨应用,你需要该披萨应用的应用 ID、授权密钥和授权终结点。 若要获取预测,需要单独的预测终结点和预测密钥。
若要查找这些值:
- 在“意向”页面,选择“管理” 。
- 在“应用程序设置”页面,记录“应用 ID” 。
- 选择“Azure 资源”。
- 选择“创作资源”。
- 从“创作资源”和“预测资源”选项卡,记录“主键” 。 此值是你的创作密钥。
- 记录“终结点 URL”。 此值是你的创作终结点。
以编程方式更改模型
使用项目和名为
csharp-model-with-rest
的文件夹创建一个面向 C# 语言的新控制台应用程序。dotnet new console -lang C# -n csharp-model-with-rest
更改为创建的
csharp-model-with-rest
目录,并使用以下命令安装所需的依赖项:cd csharp-model-with-rest dotnet add package System.Net.Http dotnet add package JsonFormatterPlus
将 Program.cs 改写为以下代码:
//
// This quickstart shows how to add utterances to a LUIS model using the REST APIs.
//
using System;
using System.IO;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using System.Collections.Generic;
using System.Linq;
// 3rd party NuGet packages
using JsonFormatterPlus;
namespace AddUtterances
{
class Program
{
//////////
// Values to modify.
// YOUR-APP-ID: The App ID GUID found on the luis.azure.cn Application Settings page.
static string appID = "PASTE_YOUR_LUIS_APP_ID_HERE";
// YOUR-AUTHORING-KEY: Your LUIS authoring key, 32 character value.
static string authoringKey = "PASTE_YOUR_LUIS_AUTHORING_SUBSCRIPTION_KEY_HERE";
// YOUR-AUTHORING-ENDPOINT: Replace this endpoint with your authoring key endpoint.
// For example, "https://your-resource-name.cognitiveservices.azure.cn/"
static string authoringEndpoint = "PASTE_YOUR_LUIS_AUTHORING_ENDPOINT_HERE";
// NOTE: Replace this your version number.
static string appVersion = "0.1";
//////////
static string host = String.Format("{0}luis/authoring/v3.0-preview/apps/{1}/versions/{2}/", authoringEndpoint, appID, appVersion);
// GET request with authentication
async static Task<HttpResponseMessage> SendGet(string uri)
{
using (var client = new HttpClient())
using (var request = new HttpRequestMessage())
{
request.Method = HttpMethod.Get;
request.RequestUri = new Uri(uri);
request.Headers.Add("Ocp-Apim-Subscription-Key", authoringKey);
return await client.SendAsync(request);
}
}
// POST request with authentication
async static Task<HttpResponseMessage> SendPost(string uri, string requestBody)
{
using (var client = new HttpClient())
using (var request = new HttpRequestMessage())
{
request.Method = HttpMethod.Post;
request.RequestUri = new Uri(uri);
if (!String.IsNullOrEmpty(requestBody))
{
request.Content = new StringContent(requestBody, Encoding.UTF8, "text/json");
}
request.Headers.Add("Ocp-Apim-Subscription-Key", authoringKey);
return await client.SendAsync(request);
}
}
// Add utterances as string with POST request
async static Task AddUtterances(string utterances)
{
string uri = host + "examples";
var response = await SendPost(uri, utterances);
var result = await response.Content.ReadAsStringAsync();
Console.WriteLine("Added utterances.");
Console.WriteLine(JsonFormatter.Format(result));
}
// Train app after adding utterances
async static Task Train()
{
string uri = host + "train";
var response = await SendPost(uri, null);
var result = await response.Content.ReadAsStringAsync();
Console.WriteLine("Sent training request.");
Console.WriteLine(JsonFormatter.Format(result));
}
// Check status of training
async static Task Status()
{
var response = await SendGet(host + "train");
var result = await response.Content.ReadAsStringAsync();
Console.WriteLine("Requested training status.");
Console.WriteLine(JsonFormatter.Format(result));
}
// Add utterances, train, check status
static void Main(string[] args)
{
string utterances = @"
[
{
'text': 'order a pizza',
'intentName': 'ModifyOrder',
'entityLabels': [
{
'entityName': 'Order',
'startCharIndex': 6,
'endCharIndex': 12
}
]
},
{
'text': 'order a large pepperoni pizza',
'intentName': 'ModifyOrder',
'entityLabels': [
{
'entityName': 'Order',
'startCharIndex': 6,
'endCharIndex': 28
},
{
'entityName': 'FullPizzaWithModifiers',
'startCharIndex': 6,
'endCharIndex': 28
},
{
'entityName': 'PizzaType',
'startCharIndex': 14,
'endCharIndex': 28
},
{
'entityName': 'Size',
'startCharIndex': 8,
'endCharIndex': 12
}
]
},
{
'text': 'I want two large pepperoni pizzas on thin crust',
'intentName': 'ModifyOrder',
'entityLabels': [
{
'entityName': 'Order',
'startCharIndex': 7,
'endCharIndex': 46
},
{
'entityName': 'FullPizzaWithModifiers',
'startCharIndex': 7,
'endCharIndex': 46
},
{
'entityName': 'PizzaType',
'startCharIndex': 17,
'endCharIndex': 32
},
{
'entityName': 'Size',
'startCharIndex': 11,
'endCharIndex': 15
},
{
'entityName': 'Quantity',
'startCharIndex': 7,
'endCharIndex': 9
},
{
'entityName': 'Crust',
'startCharIndex': 37,
'endCharIndex': 46
}
]
}
]
";
AddUtterances(utterances).Wait();
Train().Wait();
Status().Wait();
}
}
}
将以
YOUR-
开头的值替换为你自己的值。信息 目的 YOUR-APP-ID
LUIS 应用 ID。 YOUR-AUTHORING-KEY
32 字符创作密钥。 YOUR-AUTHORING-ENDPOINT
创作 URL 终结点。 例如, https://replace-with-your-resource-name.api.cognitive.azure.cn/
。 在创建资源时设置资源名称。分配的密钥和资源可以在 LUIS 门户的“Azure 资源”页上的“管理”部分中看到。 应用 ID 可以在“应用程序设置”页的同一“管理”部分中找到。
重要
完成后,请记住将密钥从代码中删除,并且永远不要公开发布该密钥。 对于生产来说,请使用安全的方式存储和访问凭据,例如 Azure Key Vault。 有关详细信息,请参阅 Azure AI 服务安全性一文。
生成控制台应用程序。
dotnet build
运行控制台应用程序。
dotnet run
查看创作响应:
Added utterances. [ { "value": { "ExampleId": 1137150691, "UtteranceText": "order a pizza" }, "hasError": false }, { "value": { "ExampleId": 1137150692, "UtteranceText": "order a large pepperoni pizza" }, "hasError": false }, { "value": { "ExampleId": 1137150693, "UtteranceText": "i want two large pepperoni pizzas on thin crust" }, "hasError": false } ] Sent training request. { "statusId": 9, "status": "Queued" } Requested training status. [ { "modelId": "edb46abf-0000-41ab-beb2-a41a0fe1630f", "details": { "statusId": 9, "status": "Queued", "exampleCount": 0 } }, { "modelId": "a5030be2-616c-4648-bf2f-380fa9417d37", "details": { "statusId": 9, "status": "Queued", "exampleCount": 0 } }, { "modelId": "3f2b1f31-a3c3-4fbd-8182-e9d9dbc120b9", "details": { "statusId": 9, "status": "Queued", "exampleCount": 0 } }, { "modelId": "e4b6704b-1636-474c-9459-fe9ccbeba51c", "details": { "statusId": 9, "status": "Queued", "exampleCount": 0 } }, { "modelId": "031d3777-2a00-4a7a-9323-9a3280a30000", "details": { "statusId": 9, "status": "Queued", "exampleCount": 0 } }, { "modelId": "9250e7a1-06eb-4413-9432-ae132ed32583", "details": { "statusId": 9, "status": "Queued", "exampleCount": 0 } } ]
清理资源
完成本快速入门后,请从文件系统中删除项目文件夹。
后续步骤
先决条件
- JDK SE(Java 开发工具包,标准版)
- Visual Studio Code 或你喜欢用的 IDE
示例话语 JSON 文件
示例言语采用特定格式。
text
字段包含示例话语的文本。 intentName
字段必须对应于 LUIS 应用中的现有意向名称。 entityLabels
字段是必填的。 如果不想标记任何实体,请提供一个空数组。
如果 entityLabels 数组不为空,则 startCharIndex
和 endCharIndex
需要标记 entityName
字段中引用的实体。 该索引从零开始。 如果标签的起始或结尾位于文本中的空白处,则添加话语的 API 调用将失败。
[
{
"text": "order a pizza",
"intentName": "ModifyOrder",
"entityLabels": [
{
"entityName": "Order",
"startCharIndex": 6,
"endCharIndex": 12
}
]
},
{
"text": "order a large pepperoni pizza",
"intentName": "ModifyOrder",
"entityLabels": [
{
"entityName": "Order",
"startCharIndex": 6,
"endCharIndex": 28
},
{
"entityName": "FullPizzaWithModifiers",
"startCharIndex": 6,
"endCharIndex": 28
},
{
"entityName": "PizzaType",
"startCharIndex": 14,
"endCharIndex": 28
},
{
"entityName": "Size",
"startCharIndex": 8,
"endCharIndex": 12
}
]
},
{
"text": "I want two large pepperoni pizzas on thin crust",
"intentName": "ModifyOrder",
"entityLabels": [
{
"entityName": "Order",
"startCharIndex": 7,
"endCharIndex": 46
},
{
"entityName": "FullPizzaWithModifiers",
"startCharIndex": 7,
"endCharIndex": 46
},
{
"entityName": "PizzaType",
"startCharIndex": 17,
"endCharIndex": 32
},
{
"entityName": "Size",
"startCharIndex": 11,
"endCharIndex": 15
},
{
"entityName": "Quantity",
"startCharIndex": 7,
"endCharIndex": 9
},
{
"entityName": "Crust",
"startCharIndex": 37,
"endCharIndex": 46
}
]
}
]
以编程方式更改模型
创建一个新文件夹以保存 Java 项目,例如
java-model-with-rest
。创建名为
lib
的子目录,并将以下 Java 库中的内容复制到lib
子目录:创建名为
Model.java
的新文件。 添加以下代码:
//
// This quickstart shows how to add utterances to a LUIS model using the REST APIs.
//
import java.io.*;
import java.net.URI;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
// To compile, execute this command at the console:
// Windows: javac -cp ";lib/*" Model.java
// macOs: javac -cp ":lib/*" Model.java
// Linux: javac -cp ":lib/*" Model.java
// To run, execute this command at the console:
// Windows: java -cp ";lib/*" Model
// macOs: java -cp ":lib/*" Model
// Linux: java -cp ":lib/*" Model
public class Model
{
public static void main(String[] args)
{
try
{
//////////
// Values to modify.
// YOUR-APP-ID: The App ID GUID found on the luis.azure.cn Application Settings page.
String AppId = "PASTE_YOUR_LUIS_APP_ID_HERE";
// YOUR-AUTHORING-KEY: Your LUIS authoring key, 32 character value.
String Key = "PASTE_YOUR_LUIS_AUTHORING_SUBSCRIPTION_KEY_HERE";
// YOUR-AUTHORING-ENDPOINT: Replace this with your authoring key endpoint.
// For example, "https://your-resource-name.cognitiveservices.azure.cn/"
String Endpoint = "PASTE_YOUR_LUIS_AUTHORING_ENDPOINT_HERE";
// NOTE: Replace this your version number. The Pizza app uses a version number of "0.1".
String Version = "0.1";
//////////
// The list of utterances to add, in JSON format.
String Utterances = "[{'text': 'order a pizza', 'intentName': 'ModifyOrder', 'entityLabels': [{'entityName': 'Order', 'startCharIndex': 6, 'endCharIndex': 12}]}, {'text': 'order a large pepperoni pizza', 'intentName': 'ModifyOrder', 'entityLabels': [{'entityName': 'Order', 'startCharIndex': 6, 'endCharIndex': 28}, {'entityName': 'FullPizzaWithModifiers', 'startCharIndex': 6, 'endCharIndex': 28}, {'entityName': 'PizzaType', 'startCharIndex': 14, 'endCharIndex': 28}, {'entityName': 'Size', 'startCharIndex': 8, 'endCharIndex': 12}]}, {'text': 'I want two large pepperoni pizzas on thin crust', 'intentName': 'ModifyOrder', 'entityLabels': [{'entityName': 'Order', 'startCharIndex': 7, 'endCharIndex': 46}, {'entityName': 'FullPizzaWithModifiers', 'startCharIndex': 7, 'endCharIndex': 46}, {'entityName': 'PizzaType', 'startCharIndex': 17, 'endCharIndex': 32}, {'entityName': 'Size', 'startCharIndex': 11, 'endCharIndex': 15}, {'entityName': 'Quantity', 'startCharIndex': 7, 'endCharIndex': 9}, {'entityName': 'Crust', 'startCharIndex': 37, 'endCharIndex': 46}]}]";
// Create the URLs for uploading example utterances and for training.
URIBuilder addUtteranceURL = new URIBuilder(Endpoint + "luis/authoring/v3.0-preview/apps/" + AppId + "/versions/" + Version + "/examples");
URIBuilder trainURL = new URIBuilder(Endpoint + "luis/authoring/v3.0-preview/apps/" + AppId + "/versions/" + Version + "/train");
URI addUtterancesURI = addUtteranceURL.build();
URI trainURI = trainURL.build();
// Add the utterances.
// Create the request.
HttpClient addUtterancesClient = HttpClients.createDefault();
HttpPost addUtterancesRequest = new HttpPost(addUtterancesURI);
// Add the headers.
addUtterancesRequest.setHeader("Ocp-Apim-Subscription-Key",Key);
addUtterancesRequest.setHeader("Content-type","application/json");
// Add the body.
StringEntity stringEntity = new StringEntity(Utterances);
addUtterancesRequest.setEntity(stringEntity);
// Execute the request and obtain the response.
HttpResponse addUtterancesResponse = addUtterancesClient.execute(addUtterancesRequest);
HttpEntity addUtterancesEntity = addUtterancesResponse.getEntity();
// Print the response on the console.
if (addUtterancesEntity != null)
{
System.out.println(EntityUtils.toString(addUtterancesEntity));
}
// Train the model.
// Create the request.
HttpClient trainClient = HttpClients.createDefault();
HttpPost trainRequest = new HttpPost(trainURI);
// Add the headers.
trainRequest.setHeader("Ocp-Apim-Subscription-Key",Key);
trainRequest.setHeader("Content-type","application/json");
// Execute the request and obtain the response.
HttpResponse trainResponse = trainClient.execute(trainRequest);
HttpEntity trainEntity = trainResponse.getEntity();
// Print the response on the console.
if (trainEntity != null)
{
System.out.println(EntityUtils.toString(trainEntity));
}
// Get the training status.
// Create the request.
HttpClient trainStatusClient = HttpClients.createDefault();
HttpGet trainStatusRequest = new HttpGet(trainURI);
// Add the headers.
trainStatusRequest.setHeader("Ocp-Apim-Subscription-Key",Key);
trainStatusRequest.setHeader("Content-type","application/json");
// Execute the request and obtain the response.
HttpResponse trainStatusResponse = trainStatusClient.execute(trainStatusRequest);
HttpEntity trainStatusEntity = trainStatusResponse.getEntity();
// Print the response on the console.
if (trainStatusEntity != null)
{
System.out.println(EntityUtils.toString(trainStatusEntity));
}
}
// Display errors if they occur.
catch (Exception e)
{
System.out.println(e.getMessage());
}
}
}
将以
YOUR-
开头的值替换为你自己的值。信息 目的 YOUR-APP-ID
LUIS 应用 ID。 YOUR-AUTHORING-KEY
32 字符创作密钥。 YOUR-AUTHORING-ENDPOINT
创作 URL 终结点。 例如, https://replace-with-your-resource-name.api.cognitive.azure.cn/
。 在创建资源时设置资源名称。分配的密钥和资源可以在 LUIS 门户的“Azure 资源”页上的“管理”部分中看到。 应用 ID 可以在“应用程序设置”页的同一“管理”部分中找到。
重要
完成后,请记住将密钥从代码中删除,并且永远不要公开发布该密钥。 对于生产来说,请使用安全的方式存储和访问凭据,例如 Azure Key Vault。 有关详细信息,请参阅 Azure AI 服务安全性一文。
在创建
Model.java
文件的同一目录中,在命令提示符下输入以下命令来编译 Java 文件:- 如果使用的是 Windows,请使用此命令:
javac -cp ";lib/*" Model.java
- 如果使用的是 macOS 或 Linux,请使用此命令:
javac -cp ":lib/*" Model.java
- 如果使用的是 Windows,请使用此命令:
通过在命令提示符下输入以下文本从命令行运行 Java 应用程序:
- 如果使用的是 Windows,请使用此命令:
java -cp ";lib/*" Model
- 如果使用的是 macOS 或 Linux,请使用此命令:
java -cp ":lib/*" Model
- 如果使用的是 Windows,请使用此命令:
查看创作响应:
[{"value":{"ExampleId":1137150691,"UtteranceText":"order a pizza"},"hasError":false},{"value":{"ExampleId":1137150692,"UtteranceText":"order a large pepperoni pizza"},"hasError":false},{"value":{"ExampleId":1137150693,"UtteranceText":"i want two large pepperoni pizzas on thin crust"},"hasError":false}] {"statusId":9,"status":"Queued"} [{"modelId":"edb46abf-0000-41ab-beb2-a41a0fe1630f","details":{"statusId":9,"status":"Queued","exampleCount":0}},{"modelId":"a5030be2-616c-4648-bf2f-380fa9417d37","details":{"statusId":9,"status":"Queued","exampleCount":0}},{"modelId":"3f2b1f31-a3c3-4fbd-8182-e9d9dbc120b9","details":{"statusId":9,"status":"Queued","exampleCount":0}},{"modelId":"e4b6704b-1636-474c-9459-fe9ccbeba51c","details":{"statusId":9,"status":"Queued","exampleCount":0}},{"modelId":"031d3777-2a00-4a7a-9323-9a3280a30000","details":{"statusId":9,"status":"Queued","exampleCount":0}},{"modelId":"9250e7a1-06eb-4413-9432-ae132ed32583","details":{"statusId":3,"status":"InProgress","exampleCount":0,"progressSubstatus":"CollectingData"}}]
下面是为提高可读性而进行了格式设置的输出:
[ { "value": { "ExampleId": 1137150691, "UtteranceText": "order a pizza" }, "hasError": false }, { "value": { "ExampleId": 1137150692, "UtteranceText": "order a large pepperoni pizza" }, "hasError": false }, { "value": { "ExampleId": 1137150693, "UtteranceText": "i want two large pepperoni pizzas on thin crust" }, "hasError": false } ] { "statusId": 9, "status": "Queued" } [ { "modelId": "edb46abf-0000-41ab-beb2-a41a0fe1630f", "details": { "statusId": 9, "status": "Queued", "exampleCount": 0 } }, { "modelId": "a5030be2-616c-4648-bf2f-380fa9417d37", "details": { "statusId": 9, "status": "Queued", "exampleCount": 0 } }, { "modelId": "3f2b1f31-a3c3-4fbd-8182-e9d9dbc120b9", "details": { "statusId": 9, "status": "Queued", "exampleCount": 0 } }, { "modelId": "e4b6704b-1636-474c-9459-fe9ccbeba51c", "details": { "statusId": 9, "status": "Queued", "exampleCount": 0 } }, { "modelId": "031d3777-2a00-4a7a-9323-9a3280a30000", "details": { "statusId": 9, "status": "Queued", "exampleCount": 0 } }, { "modelId": "9250e7a1-06eb-4413-9432-ae132ed32583", "details": { "statusId": 3, "status": "InProgress", "exampleCount": 0, "progressSubstatus": "CollectingData" } } ]
清理资源
完成本快速入门后,请从文件系统中删除项目文件夹。
后续步骤
先决条件
- Go 编程语言
- Visual Studio Code
示例话语 JSON 文件
示例言语采用特定格式。
text
字段包含示例话语的文本。 intentName
字段必须对应于 LUIS 应用中的现有意向名称。 entityLabels
字段是必填的。 如果不想标记任何实体,请提供一个空数组。
如果 entityLabels 数组不为空,则 startCharIndex
和 endCharIndex
需要标记 entityName
字段中引用的实体。 该索引从零开始。 如果标签的起始或结尾位于文本中的空白处,则添加话语的 API 调用将失败。
[
{
"text": "order a pizza",
"intentName": "ModifyOrder",
"entityLabels": [
{
"entityName": "Order",
"startCharIndex": 6,
"endCharIndex": 12
}
]
},
{
"text": "order a large pepperoni pizza",
"intentName": "ModifyOrder",
"entityLabels": [
{
"entityName": "Order",
"startCharIndex": 6,
"endCharIndex": 28
},
{
"entityName": "FullPizzaWithModifiers",
"startCharIndex": 6,
"endCharIndex": 28
},
{
"entityName": "PizzaType",
"startCharIndex": 14,
"endCharIndex": 28
},
{
"entityName": "Size",
"startCharIndex": 8,
"endCharIndex": 12
}
]
},
{
"text": "I want two large pepperoni pizzas on thin crust",
"intentName": "ModifyOrder",
"entityLabels": [
{
"entityName": "Order",
"startCharIndex": 7,
"endCharIndex": 46
},
{
"entityName": "FullPizzaWithModifiers",
"startCharIndex": 7,
"endCharIndex": 46
},
{
"entityName": "PizzaType",
"startCharIndex": 17,
"endCharIndex": 32
},
{
"entityName": "Size",
"startCharIndex": 11,
"endCharIndex": 15
},
{
"entityName": "Quantity",
"startCharIndex": 7,
"endCharIndex": 9
},
{
"entityName": "Crust",
"startCharIndex": 37,
"endCharIndex": 46
}
]
}
]
创建 Pizza 应用
创建披萨应用。
- 选择 pizza-app-for-luis-v6.json,打开
pizza-app-for-luis.json
文件的 GitHub 页面。 - 右键单击或长按“原始”按钮,然后选择“将链接另存为”,将 保存到计算机。
- 登录到 LUIS 门户。
- 选择我的应用。
- 在“我的应用”页面上,选择“+ 新建用于对话的应用” 。
- 选择“导入为 JSON”。
- 在“导入新应用”对话框中,选择“选择文件”按钮 。
- 选择下载的
pizza-app-for-luis.json
文件,然后选择“打开”。 - 在“导入新应用”对话框的“名称”字段中,输入 Pizza 应用的名称,然后选择“完成”按钮 。
随即导入应用。
如果看到一个对话框“如何创建有效的 LUIS 应用”,关闭该对话框。
训练并发布 Pizza 应用
Pizza 应用中应会显示“意向”页面,其中显示了一个意向列表。
在 LUIS 网站的右上方,选择“训练”按钮。
当“训练”按钮处于禁用状态时,即表示训练完成。
若要在聊天机器人或其他客户端应用程序中接收 LUIS 预测,需要将应用发布到预测终结点。
在右上方的导航栏中选择“发布”。
选择“生产”槽,然后选择“完成” 。
在通知中选择“访问终结点 URL”,以转到“Azure 资源”页 。 只有你拥有与应用关联的预测资源时,才能看到 URL。 还可以单击“管理”来找到“Azure 资源”页 。
向披萨应用添加创作资源
- 选择“管理”。
- 选择“Azure 资源”。
- 选择“创作资源”。
- 选择“更改创作资源”。
如果你有创作资源,请输入你的创作资源的租户名称、订阅名称以及 LUIS 资源名称。
如果你没有创作资源:
- 选择“新建资源”。
- 输入租户名称、资源名称、订阅名称和 Azure 资源组名称。
现在 Pizza 应用可以使用了。
记录 Pizza 应用的访问值
若要使用新的披萨应用,你需要该披萨应用的应用 ID、授权密钥和授权终结点。 若要获取预测,需要单独的预测终结点和预测密钥。
若要查找这些值:
- 在“意向”页面,选择“管理” 。
- 在“应用程序设置”页面,记录“应用 ID” 。
- 选择“Azure 资源”。
- 选择“创作资源”。
- 从“创作资源”和“预测资源”选项卡,记录“主键” 。 此值是你的创作密钥。
- 记录“终结点 URL”。 此值是你的创作终结点。
以编程方式更改模型
- 创建名为
predict.go
的新文件。 添加以下代码:
//
// This quickstart shows how to add utterances to a LUIS model using the REST APIs.
//
// dependencies
package main
import (
"fmt"
"net/http"
"io/ioutil"
"log"
"strings"
)
// main function
func main() {
//////////
// Values to modify.
// YOUR-APP-ID: The App ID GUID found on the luis.azure.cn Application Settings page.
var appID = "PASTE_YOUR_LUIS_APP_ID_HERE"
// YOUR-AUTHORING-KEY: Your LUIS authoring key, 32 character value.
var authoringKey = "PASTE_YOUR_LUIS_AUTHORING_SUBSCRIPTION_KEY_HERE"
// YOUR-AUTHORING-ENDPOINT: Replace this with your authoring key endpoint.
// For example, "https://your-resource-name.cognitiveservices.azure.cn/"
var endpoint = "PASTE_YOUR_LUIS_AUTHORING_ENDPOINT_HERE"
// NOTE: Replace this your version number. The Pizza app uses a version number of "0.1".
var version = "0.1"
//////////
var exampleUtterances = "[{'text': 'order a pizza', 'intentName': 'ModifyOrder', 'entityLabels': [{'entityName': 'Order', 'startCharIndex': 6, 'endCharIndex': 12}]}, {'text': 'order a large pepperoni pizza', 'intentName': 'ModifyOrder', 'entityLabels': [{'entityName': 'Order', 'startCharIndex': 6, 'endCharIndex': 28}, {'entityName': 'FullPizzaWithModifiers', 'startCharIndex': 6, 'endCharIndex': 28}, {'entityName': 'PizzaType', 'startCharIndex': 14, 'endCharIndex': 28}, {'entityName': 'Size', 'startCharIndex': 8, 'endCharIndex': 12}]}, {'text': 'I want two large pepperoni pizzas on thin crust', 'intentName': 'ModifyOrder', 'entityLabels': [{'entityName': 'Order', 'startCharIndex': 7, 'endCharIndex': 46}, {'entityName': 'FullPizzaWithModifiers', 'startCharIndex': 7, 'endCharIndex': 46}, {'entityName': 'PizzaType', 'startCharIndex': 17, 'endCharIndex': 32}, {'entityName': 'Size', 'startCharIndex': 11, 'endCharIndex': 15}, {'entityName': 'Quantity', 'startCharIndex': 7, 'endCharIndex': 9}, {'entityName': 'Crust', 'startCharIndex': 37, 'endCharIndex': 46}]}]"
fmt.Println("add example utterances requested")
addUtterance(authoringKey, appID, version, exampleUtterances, endpoint)
fmt.Println("training selected")
requestTraining(authoringKey, appID, version, endpoint)
fmt.Println("training status selected")
getTrainingStatus(authoringKey, appID, version, endpoint)
}
// Send the list of utterances to the model.
func addUtterance(authoringKey string, appID string, version string, labeledExampleUtterances string, endpoint string){
var authoringUrl = fmt.Sprintf("%sluis/authoring/v3.0-preview/apps/%s/versions/%s/examples", endpoint, appID, version)
httpRequest("POST", authoringUrl, authoringKey, labeledExampleUtterances)
}
// Request training.
func requestTraining(authoringKey string, appID string, version string, endpoint string){
trainApp("POST", authoringKey, appID, version, endpoint)
}
func trainApp(httpVerb string, authoringKey string, appID string, version string, endpoint string){
var authoringUrl = fmt.Sprintf("%sluis/authoring/v3.0-preview/apps/%s/versions/%s/train", endpoint, appID, version)
httpRequest(httpVerb,authoringUrl, authoringKey, "")
}
func getTrainingStatus(authoringKey string, appID string, version string, endpoint string){
trainApp("GET", authoringKey, appID, version, endpoint)
}
// generic HTTP request
// includes setting header with authoring key
func httpRequest(httpVerb string, url string, authoringKey string, body string){
client := &http.Client{}
request, err := http.NewRequest(httpVerb, url, strings.NewReader(body))
request.Header.Add("Ocp-Apim-Subscription-Key", authoringKey)
fmt.Println("body")
fmt.Println(body)
response, err := client.Do(request)
if err != nil {
log.Fatal(err)
} else {
defer response.Body.Close()
contents, err := ioutil.ReadAll(response.Body)
if err != nil {
log.Fatal(err)
}
fmt.Println(" ", response.StatusCode)
fmt.Println(string(contents))
}
}
将以
YOUR-
开头的值替换为你自己的值。信息 目的 YOUR-APP-ID
LUIS 应用 ID。 YOUR-AUTHORING-KEY
32 字符创作密钥。 YOUR-AUTHORING-ENDPOINT
创作 URL 终结点。 例如, https://replace-with-your-resource-name.api.cognitive.azure.cn/
。 在创建资源时设置资源名称。分配的密钥和资源可以在 LUIS 门户的“Azure 资源”页上的“管理”部分中看到。 应用 ID 可以在“应用程序设置”页的同一“管理”部分中找到。
重要
完成后,请记住将密钥从代码中删除,并且永远不要公开发布该密钥。 对于生产来说,请使用安全的方式存储和访问凭据,例如 Azure Key Vault。 有关详细信息,请参阅 Azure AI 服务安全性一文。
在创建该文件的同一目录中,在命令提示符下输入以下命令来编译 Go 文件:
go build model.go
通过在命令提示符下输入以下文本从命令行运行 Go 应用程序:
go run model.go
查看创作响应:
add example utterances requested body [{'text': 'order a pizza', 'intentName': 'ModifyOrder', 'entityLabels': [{'entityName': 'Order', 'startCharIndex': 6, 'endCharIndex': 12}]}, {'text': 'order a large pepperoni pizza', 'intentName': 'ModifyOrder', 'entityLabels': [{'entityName': 'Order', 'startCharIndex': 6, 'endCharIndex': 28}, {'entityName': 'FullPizzaWithModifiers', 'startCharIndex': 6, 'endCharIndex': 28}, {'entityName': 'PizzaType', 'startCharIndex': 14, 'endCharIndex': 28}, {'entityName': 'Size', 'startCharIndex': 8, 'endCharIndex': 12}]}, {'text': 'I want two large pepperoni pizzas on thin crust', 'intentName': 'ModifyOrder', 'entityLabels': [{'entityName': 'Order', 'startCharIndex': 7, 'endCharIndex': 46}, {'entityName': 'FullPizzaWithModifiers', 'startCharIndex': 7, 'endCharIndex': 46}, {'entityName': 'PizzaType', 'startCharIndex': 17, 'endCharIndex': 32}, {'entityName': 'Size', 'startCharIndex': 11, 'endCharIndex': 15}, {'entityName': 'Quantity', 'startCharIndex': 7, 'endCharIndex': 9}, {'entityName': 'Crust', 'startCharIndex': 37, 'endCharIndex': 46}]}] 201 [{"value":{"ExampleId":1137150691,"UtteranceText":"order a pizza"},"hasError":false},{"value":{"ExampleId":1137150692,"UtteranceText":"order a large pepperoni pizza"},"hasError":false},{"value":{"ExampleId":1137150693,"UtteranceText":"i want two large pepperoni pizzas on thin crust"},"hasError":false}] training selected body 202 {"statusId":9,"status":"Queued"} training status selected body 200 [{"modelId":"edb46abf-0000-41ab-beb2-a41a0fe1630f","details":{"statusId":9,"status":"Queued","exampleCount":0}},{"modelId":"a5030be2-616c-4648-bf2f-380fa9417d37","details":{"statusId":9,"status":"Queued","exampleCount":0}},{"modelId":"3f2b1f31-a3c3-4fbd-8182-e9d9dbc120b9","details":{"statusId":9,"status":"Queued","exampleCount":0}},{"modelId":"e4b6704b-1636-474c-9459-fe9ccbeba51c","details":{"statusId":9,"status":"Queued","exampleCount":0}},{"modelId":"031d3777-2a00-4a7a-9323-9a3280a30000","details":{"statusId":9,"status":"Queued","exampleCount":0}},{"modelId":"9250e7a1-06eb-4413-9432-ae132ed32583","details":{"statusId":9,"status":"Queued","exampleCount":0}}]
下面是为提高可读性而进行了格式设置的输出:
add example utterances requested body [ { 'text': 'order a pizza', 'intentName': 'ModifyOrder', 'entityLabels': [ { 'entityName': 'Order', 'startCharIndex': 6, 'endCharIndex': 12 } ] }, { 'text': 'order a large pepperoni pizza', 'intentName': 'ModifyOrder', 'entityLabels': [ { 'entityName': 'Order', 'startCharIndex': 6, 'endCharIndex': 28 }, { 'entityName': 'FullPizzaWithModifiers', 'startCharIndex': 6, 'endCharIndex': 28 }, { 'entityName': 'PizzaType', 'startCharIndex': 14, 'endCharIndex': 28 }, { 'entityName': 'Size', 'startCharIndex': 8, 'endCharIndex': 12 } ] }, { 'text': 'I want two large pepperoni pizzas on thin crust', 'intentName': 'ModifyOrder', 'entityLabels': [ { 'entityName': 'Order', 'startCharIndex': 7, 'endCharIndex': 46 }, { 'entityName': 'FullPizzaWithModifiers', 'startCharIndex': 7, 'endCharIndex': 46 }, { 'entityName': 'PizzaType', 'startCharIndex': 17, 'endCharIndex': 32 }, { 'entityName': 'Size', 'startCharIndex': 11, 'endCharIndex': 15 }, { 'entityName': 'Quantity', 'startCharIndex': 7, 'endCharIndex': 9 }, { 'entityName': 'Crust', 'startCharIndex': 37, 'endCharIndex': 46 } ] } ] 201 [ { "value": { "ExampleId": 1137150691, "UtteranceText": "order a pizza" }, "hasError": false }, { "value": { "ExampleId": 1137150692, "UtteranceText": "order a large pepperoni pizza" }, "hasError": false }, { "value": { "ExampleId": 1137150693, "UtteranceText": "i want two large pepperoni pizzas on thin crust" }, "hasError": false } ] training selected body 202 { "statusId": 9, "status": "Queued" } training status selected body 200 [ { "modelId": "edb46abf-0000-41ab-beb2-a41a0fe1630f", "details": { "statusId": 9, "status": "Queued", "exampleCount": 0 } }, { "modelId": "a5030be2-616c-4648-bf2f-380fa9417d37", "details": { "statusId": 9, "status": "Queued", "exampleCount": 0 } }, { "modelId": "3f2b1f31-a3c3-4fbd-8182-e9d9dbc120b9", "details": { "statusId": 9, "status": "Queued", "exampleCount": 0 } }, { "modelId": "e4b6704b-1636-474c-9459-fe9ccbeba51c", "details": { "statusId": 9, "status": "Queued", "exampleCount": 0 } }, { "modelId": "031d3777-2a00-4a7a-9323-9a3280a30000", "details": { "statusId": 9, "status": "Queued", "exampleCount": 0 } }, { "modelId": "9250e7a1-06eb-4413-9432-ae132ed32583", "details": { "statusId": 9, "status": "Queued", "exampleCount": 0 } } ]
清理资源
完成本快速入门后,请从文件系统中删除该文件。
后续步骤
先决条件
示例话语 JSON 文件
示例言语采用特定格式。
text
字段包含示例话语的文本。 intentName
字段必须对应于 LUIS 应用中的现有意向名称。 entityLabels
字段是必填的。 如果不想标记任何实体,请提供一个空数组。
如果 entityLabels 数组不为空,则 startCharIndex
和 endCharIndex
需要标记 entityName
字段中引用的实体。 该索引从零开始。 如果标签的起始或结尾位于文本中的空白处,则添加话语的 API 调用将失败。
[
{
"text": "order a pizza",
"intentName": "ModifyOrder",
"entityLabels": [
{
"entityName": "Order",
"startCharIndex": 6,
"endCharIndex": 12
}
]
},
{
"text": "order a large pepperoni pizza",
"intentName": "ModifyOrder",
"entityLabels": [
{
"entityName": "Order",
"startCharIndex": 6,
"endCharIndex": 28
},
{
"entityName": "FullPizzaWithModifiers",
"startCharIndex": 6,
"endCharIndex": 28
},
{
"entityName": "PizzaType",
"startCharIndex": 14,
"endCharIndex": 28
},
{
"entityName": "Size",
"startCharIndex": 8,
"endCharIndex": 12
}
]
},
{
"text": "I want two large pepperoni pizzas on thin crust",
"intentName": "ModifyOrder",
"entityLabels": [
{
"entityName": "Order",
"startCharIndex": 7,
"endCharIndex": 46
},
{
"entityName": "FullPizzaWithModifiers",
"startCharIndex": 7,
"endCharIndex": 46
},
{
"entityName": "PizzaType",
"startCharIndex": 17,
"endCharIndex": 32
},
{
"entityName": "Size",
"startCharIndex": 11,
"endCharIndex": 15
},
{
"entityName": "Quantity",
"startCharIndex": 7,
"endCharIndex": 9
},
{
"entityName": "Crust",
"startCharIndex": 37,
"endCharIndex": 46
}
]
}
]
创建 Node.js 项目
创建一个新文件夹以保存 Node.js 项目,例如
node-model-with-rest
。打开新的命令提示符,导航到你创建的文件夹,并执行以下命令:
npm init
在每个提示符下按 Enter 以接受默认设置。
输入以下命令安装“请求-承诺”模块:
npm install --save request npm install --save request-promise npm install --save querystring
以编程方式更改模型
- 创建名为
model.js
的新文件。 添加以下代码:
//
// This quickstart shows how to add utterances to a LUIS model using the REST APIs.
//
var request = require('request-promise');
//////////
// Values to modify.
// YOUR-APP-ID: The App ID GUID found on the luis.azure.cn Application Settings page.
const LUIS_appId = "PASTE_YOUR_LUIS_APP_ID_HERE";
// YOUR-AUTHORING-KEY: Your LUIS authoring key, 32 character value.
const LUIS_authoringKey = "PASTE_YOUR_LUIS_AUTHORING_SUBSCRIPTION_KEY_HERE";
// YOUR-AUTHORING-ENDPOINT: Replace this with your authoring key endpoint.
// For example, "https://your-resource-name.cognitiveservices.azure.cn/"
const LUIS_endpoint = "PASTE_YOUR_LUIS_AUTHORING_ENDPOINT_HERE";
// NOTE: Replace this your version number. The Pizza app uses a version number of "0.1".
const LUIS_versionId = "0.1";
//////////
const addUtterancesURI = `${LUIS_endpoint}luis/authoring/v3.0-preview/apps/${LUIS_appId}/versions/${LUIS_versionId}/examples`;
const addTrainURI = `${LUIS_endpoint}luis/authoring/v3.0-preview/apps/${LUIS_appId}/versions/${LUIS_versionId}/train`;
const utterances = [
{
'text': 'order a pizza',
'intentName': 'ModifyOrder',
'entityLabels': [
{
'entityName': 'Order',
'startCharIndex': 6,
'endCharIndex': 12
}
]
},
{
'text': 'order a large pepperoni pizza',
'intentName': 'ModifyOrder',
'entityLabels': [
{
'entityName': 'Order',
'startCharIndex': 6,
'endCharIndex': 28
},
{
'entityName': 'FullPizzaWithModifiers',
'startCharIndex': 6,
'endCharIndex': 28
},
{
'entityName': 'PizzaType',
'startCharIndex': 14,
'endCharIndex': 28
},
{
'entityName': 'Size',
'startCharIndex': 8,
'endCharIndex': 12
}
]
},
{
'text': 'I want two large pepperoni pizzas on thin crust',
'intentName': 'ModifyOrder',
'entityLabels': [
{
'entityName': 'Order',
'startCharIndex': 7,
'endCharIndex': 46
},
{
'entityName': 'FullPizzaWithModifiers',
'startCharIndex': 7,
'endCharIndex': 46
},
{
'entityName': 'PizzaType',
'startCharIndex': 17,
'endCharIndex': 32
},
{
'entityName': 'Size',
'startCharIndex': 11,
'endCharIndex': 15
},
{
'entityName': 'Quantity',
'startCharIndex': 7,
'endCharIndex': 9
},
{
'entityName': 'Crust',
'startCharIndex': 37,
'endCharIndex': 46
}
]
}
];
// Main function.
const main = async() =>{
await addUtterances(utterances);
await train("POST");
await train("GET");
}
// Adds the utterances to the model.
const addUtterances = async (utterances) => {
const options = {
uri: addUtterancesURI,
method: 'POST',
headers: {
'Ocp-Apim-Subscription-Key': LUIS_authoringKey
},
json: true,
body: utterances
};
const response = await request(options)
console.log("addUtterance:\n" + JSON.stringify(response, null, 2));
}
// With verb === "POST", sends a training request.
// With verb === "GET", obtains the training status.
const train = async (verb) => {
const options = {
uri: addTrainURI,
method: verb,
headers: {
'Ocp-Apim-Subscription-Key': LUIS_authoringKey
},
json: true,
body: null // The body can be empty for a training request
};
const response = await request(options)
console.log("train " + verb + ":\n" + JSON.stringify(response, null, 2));
}
// MAIN
main().then(() => console.log("done")).catch((err)=> console.log(err));
将以
YOUR-
开头的值替换为你自己的值。信息 目的 YOUR-APP-ID
LUIS 应用 ID。 YOUR-AUTHORING-KEY
32 字符创作密钥。 YOUR-AUTHORING-ENDPOINT
创作 URL 终结点。 例如, https://replace-with-your-resource-name.api.cognitive.azure.cn/
。 在创建资源时设置资源名称。分配的密钥和资源可以在 LUIS 门户的“Azure 资源”页上的“管理”部分中看到。 应用 ID 可以在“应用程序设置”页的同一“管理”部分中找到。
重要
完成后,请记住将密钥从代码中删除,并且永远不要公开发布该密钥。 对于生产来说,请使用安全的方式存储和访问凭据,例如 Azure Key Vault。 有关详细信息,请参阅 Azure AI 服务安全性一文。
在命令提示符处,输入下列命令以运行项目:
node model.js
查看创作响应:
addUtterance: [ { "value": { "ExampleId": 1137150691, "UtteranceText": "order a pizza" }, "hasError": false }, { "value": { "ExampleId": 1137150692, "UtteranceText": "order a large pepperoni pizza" }, "hasError": false }, { "value": { "ExampleId": 1137150693, "UtteranceText": "i want two large pepperoni pizzas on thin crust" }, "hasError": false } ] train POST: { "statusId": 9, "status": "Queued" } train GET: [ { "modelId": "edb46abf-0000-41ab-beb2-a41a0fe1630f", "details": { "statusId": 9, "status": "Queued", "exampleCount": 0 } }, { "modelId": "a5030be2-616c-4648-bf2f-380fa9417d37", "details": { "statusId": 9, "status": "Queued", "exampleCount": 0 } }, { "modelId": "3f2b1f31-a3c3-4fbd-8182-e9d9dbc120b9", "details": { "statusId": 9, "status": "Queued", "exampleCount": 0 } }, { "modelId": "e4b6704b-1636-474c-9459-fe9ccbeba51c", "details": { "statusId": 9, "status": "Queued", "exampleCount": 0 } }, { "modelId": "031d3777-2a00-4a7a-9323-9a3280a30000", "details": { "statusId": 9, "status": "Queued", "exampleCount": 0 } }, { "modelId": "9250e7a1-06eb-4413-9432-ae132ed32583", "details": { "statusId": 9, "status": "Queued", "exampleCount": 0 } } ] done
清理资源
完成本快速入门后,请从文件系统中删除项目文件夹。
后续步骤
先决条件
- Python 3.6 或更高版本。
- Visual Studio Code
示例话语 JSON 文件
示例言语采用特定格式。
text
字段包含示例话语的文本。 intentName
字段必须对应于 LUIS 应用中的现有意向名称。 entityLabels
字段是必填的。 如果不想标记任何实体,请提供一个空数组。
如果 entityLabels 数组不为空,则 startCharIndex
和 endCharIndex
需要标记 entityName
字段中引用的实体。 该索引从零开始。 如果标签的起始或结尾位于文本中的空白处,则添加话语的 API 调用将失败。
[
{
"text": "order a pizza",
"intentName": "ModifyOrder",
"entityLabels": [
{
"entityName": "Order",
"startCharIndex": 6,
"endCharIndex": 12
}
]
},
{
"text": "order a large pepperoni pizza",
"intentName": "ModifyOrder",
"entityLabels": [
{
"entityName": "Order",
"startCharIndex": 6,
"endCharIndex": 28
},
{
"entityName": "FullPizzaWithModifiers",
"startCharIndex": 6,
"endCharIndex": 28
},
{
"entityName": "PizzaType",
"startCharIndex": 14,
"endCharIndex": 28
},
{
"entityName": "Size",
"startCharIndex": 8,
"endCharIndex": 12
}
]
},
{
"text": "I want two large pepperoni pizzas on thin crust",
"intentName": "ModifyOrder",
"entityLabels": [
{
"entityName": "Order",
"startCharIndex": 7,
"endCharIndex": 46
},
{
"entityName": "FullPizzaWithModifiers",
"startCharIndex": 7,
"endCharIndex": 46
},
{
"entityName": "PizzaType",
"startCharIndex": 17,
"endCharIndex": 32
},
{
"entityName": "Size",
"startCharIndex": 11,
"endCharIndex": 15
},
{
"entityName": "Quantity",
"startCharIndex": 7,
"endCharIndex": 9
},
{
"entityName": "Crust",
"startCharIndex": 37,
"endCharIndex": 46
}
]
}
]
创建 Pizza 应用
创建披萨应用。
- 选择 pizza-app-for-luis-v6.json,打开
pizza-app-for-luis.json
文件的 GitHub 页面。 - 右键单击或长按“原始”按钮,然后选择“将链接另存为”,将 保存到计算机。
- 登录到 LUIS 门户。
- 选择我的应用。
- 在“我的应用”页面上,选择“+ 新建用于对话的应用” 。
- 选择“导入为 JSON”。
- 在“导入新应用”对话框中,选择“选择文件”按钮 。
- 选择下载的
pizza-app-for-luis.json
文件,然后选择“打开”。 - 在“导入新应用”对话框的“名称”字段中,输入 Pizza 应用的名称,然后选择“完成”按钮 。
随即导入应用。
如果看到一个对话框“如何创建有效的 LUIS 应用”,关闭该对话框。
训练并发布 Pizza 应用
Pizza 应用中应会显示“意向”页面,其中显示了一个意向列表。
在 LUIS 网站的右上方,选择“训练”按钮。
当“训练”按钮处于禁用状态时,即表示训练完成。
若要在聊天机器人或其他客户端应用程序中接收 LUIS 预测,需要将应用发布到预测终结点。
在右上方的导航栏中选择“发布”。
选择“生产”槽,然后选择“完成” 。
在通知中选择“访问终结点 URL”,以转到“Azure 资源”页 。 只有你拥有与应用关联的预测资源时,才能看到 URL。 还可以单击“管理”来找到“Azure 资源”页 。
向披萨应用添加创作资源
- 选择“管理”。
- 选择“Azure 资源”。
- 选择“创作资源”。
- 选择“更改创作资源”。
如果你有创作资源,请输入你的创作资源的租户名称、订阅名称以及 LUIS 资源名称。
如果你没有创作资源:
- 选择“新建资源”。
- 输入租户名称、资源名称、订阅名称和 Azure 资源组名称。
现在 Pizza 应用可以使用了。
记录 Pizza 应用的访问值
若要使用新的披萨应用,你需要该披萨应用的应用 ID、授权密钥和授权终结点。 若要获取预测,需要单独的预测终结点和预测密钥。
若要查找这些值:
- 在“意向”页面,选择“管理” 。
- 在“应用程序设置”页面,记录“应用 ID” 。
- 选择“Azure 资源”。
- 选择“创作资源”。
- 从“创作资源”和“预测资源”选项卡,记录“主键” 。 此值是你的创作密钥。
- 记录“终结点 URL”。 此值是你的创作终结点。
以编程方式更改模型
- 创建名为
model.py
的新文件。 添加以下代码:
########### Python 3.6 #############
#
# This quickstart shows how to add utterances to a LUIS model using the REST APIs.
#
import requests
try:
##########
# Values to modify.
# YOUR-APP-ID: The App ID GUID found on the luis.azure.cn Application Settings page.
appId = "PASTE_YOUR_LUIS_APP_ID_HERE"
# YOUR-AUTHORING-KEY: Your LUIS authoring key, 32 character value.
authoring_key = "PASTE_YOUR_LUIS_AUTHORING_SUBSCRIPTION_KEY_HERE"
# YOUR-AUTHORING-ENDPOINT: Replace this with your authoring key endpoint.
# For example, "https://your-resource-name.cognitiveservices.azure.cn/"
authoring_endpoint = "PASTE_YOUR_LUIS_AUTHORING_ENDPOINT_HERE"
# The version number of your LUIS app
app_version = "0.1"
##########
# The headers to use in this REST call.
headers = {'Ocp-Apim-Subscription-Key': authoring_key}
# The URL parameters to use in this REST call.
params ={
#'timezoneOffset': '0',
#'verbose': 'true',
#'show-all-intents': 'true',
#'spellCheck': 'false',
#'staging': 'false'
}
# List of example utterances to send to the LUIS app.
data = """[
{
'text': 'order a pizza',
'intentName': 'ModifyOrder',
'entityLabels': [
{
'entityName': 'Order',
'startCharIndex': 6,
'endCharIndex': 12
}
]
},
{
'text': 'order a large pepperoni pizza',
'intentName': 'ModifyOrder',
'entityLabels': [
{
'entityName': 'Order',
'startCharIndex': 6,
'endCharIndex': 28
},
{
'entityName': 'FullPizzaWithModifiers',
'startCharIndex': 6,
'endCharIndex': 28
},
{
'entityName': 'PizzaType',
'startCharIndex': 14,
'endCharIndex': 28
},
{
'entityName': 'Size',
'startCharIndex': 8,
'endCharIndex': 12
}
]
},
{
'text': 'I want two large pepperoni pizzas on thin crust',
'intentName': 'ModifyOrder',
'entityLabels': [
{
'entityName': 'Order',
'startCharIndex': 7,
'endCharIndex': 46
},
{
'entityName': 'FullPizzaWithModifiers',
'startCharIndex': 7,
'endCharIndex': 46
},
{
'entityName': 'PizzaType',
'startCharIndex': 17,
'endCharIndex': 32
},
{
'entityName': 'Size',
'startCharIndex': 11,
'endCharIndex': 15
},
{
'entityName': 'Quantity',
'startCharIndex': 7,
'endCharIndex': 9
},
{
'entityName': 'Crust',
'startCharIndex': 37,
'endCharIndex': 46
}
]
}
]
"""
# Make the REST call to POST the list of example utterances.
response = requests.post(f'{authoring_endpoint}luis/authoring/v3.0-preview/apps/{appId}/versions/{app_version}/examples',
headers=headers, params=params, data=data)
# Display the results on the console.
print('Add the list of utterances:')
print(response.json())
# Make the REST call to initiate a training session.
response = requests.post(f'{authoring_endpoint}luis/authoring/v3.0-preview/apps/{appId}/versions/{app_version}/train',
headers=headers, params=params, data=None)
# Display the results on the console.
print('Request training:')
print(response.json())
# Make the REST call to request the status of training.
response = requests.get(f'{authoring_endpoint}luis/authoring/v3.0-preview/apps/{appId}/versions/{app_version}/train',
headers=headers, params=params, data=None)
# Display the results on the console.
print('Request training status:')
print(response.json())
except Exception as e:
# Display the error string.
print(f'{e}')
将以
YOUR-
开头的值替换为你自己的值。信息 目的 YOUR-APP-ID
LUIS 应用 ID。 YOUR-AUTHORING-KEY
32 字符创作密钥。 YOUR-AUTHORING-ENDPOINT
创作 URL 终结点。 例如, https://replace-with-your-resource-name.api.cognitive.azure.cn/
。 在创建资源时设置资源名称。分配的密钥和资源可以在 LUIS 门户的“Azure 资源”页上的“管理”部分中看到。 应用 ID 可以在“应用程序设置”页的同一“管理”部分中找到。
重要
完成后,请记住将密钥从代码中删除,并且永远不要公开发布该密钥。 对于生产来说,请使用安全的方式存储和访问凭据,例如 Azure Key Vault。 有关详细信息,请参阅 Azure AI 服务安全性一文。
在创建该文件的同一目录中,在命令提示符下输入以下命令来运行文件:
python model.py
查看创作响应:
Add the list of utterances: [{'value': {'ExampleId': 1137150691, 'UtteranceText': 'order a pizza'}, 'hasError': False}, {'value': {'ExampleId': 1137150692, 'UtteranceText': 'order a large pepperoni pizza'}, 'hasError': False}, {'value': {'ExampleId': 1137150693, 'UtteranceText': 'i want two large pepperoni pizzas on thin crust'}, 'hasError': False}] Request training: {'statusId': 9, 'status': 'Queued'} Request training status: [{'modelId': 'edb46abf-0000-41ab-beb2-a41a0fe1630f', 'details': {'statusId': 3, 'status': 'InProgress', 'exampleCount': 0, 'progressSubstatus': 'CollectingData'}}, {'modelId': 'a5030be2-616c-4648-bf2f-380fa9417d37', 'details': {'statusId': 3, 'status': 'InProgress', 'exampleCount': 0, 'progressSubstatus': 'CollectingData'}}, {'modelId': '3f2b1f31-a3c3-4fbd-8182-e9d9dbc120b9', 'details': {'statusId': 3, 'status': 'InProgress', 'exampleCount': 0, 'progressSubstatus': 'CollectingData'}}, {'modelId': 'e4b6704b-1636-474c-9459-fe9ccbeba51c', 'details': {'statusId': 3, 'status': 'InProgress', 'exampleCount': 0, 'progressSubstatus': 'CollectingData'}}, {'modelId': '031d3777-2a00-4a7a-9323-9a3280a30000', 'details': {'statusId': 3, 'status': 'InProgress', 'exampleCount': 0, 'progressSubstatus': 'CollectingData'}}, {'modelId': '9250e7a1-06eb-4413-9432-ae132ed32583', 'details': {'statusId': 3, 'status': 'InProgress', 'exampleCount': 0, 'progressSubstatus': 'CollectingData'}}]
下面是为提高可读性而进行了格式设置的输出:
Add the list of utterances: [ { 'value': { 'ExampleId': 1137150691, 'UtteranceText': 'order a pizza' }, 'hasError': False }, { 'value': { 'ExampleId': 1137150692, 'UtteranceText': 'order a large pepperoni pizza' }, 'hasError': False }, { 'value': { 'ExampleId': 1137150693, 'UtteranceText': 'i want two large pepperoni pizzas on thin crust' }, 'hasError': False } ] Request training: { 'statusId': 9, 'status': 'Queued' } Request training status: [ { 'modelId': 'edb46abf-0000-41ab-beb2-a41a0fe1630f', 'details': { 'statusId': 3, 'status': 'InProgress', 'exampleCount': 0, 'progressSubstatus': 'CollectingData' } }, { 'modelId': 'a5030be2-616c-4648-bf2f-380fa9417d37', 'details': { 'statusId': 3, 'status': 'InProgress', 'exampleCount': 0, 'progressSubstatus': 'CollectingData' } }, { 'modelId': '3f2b1f31-a3c3-4fbd-8182-e9d9dbc120b9', 'details': { 'statusId': 3, 'status': 'InProgress', 'exampleCount': 0, 'progressSubstatus': 'CollectingData' } }, { 'modelId': 'e4b6704b-1636-474c-9459-fe9ccbeba51c', 'details': { 'statusId': 3, 'status': 'InProgress', 'exampleCount': 0, 'progressSubstatus': 'CollectingData' } }, { 'modelId': '031d3777-2a00-4a7a-9323-9a3280a30000', 'details': { 'statusId': 3, 'status': 'InProgress', 'exampleCount': 0, 'progressSubstatus': 'CollectingData' } }, { 'modelId': '9250e7a1-06eb-4413-9432-ae132ed32583', 'details': { 'statusId': 3, 'status': 'InProgress', 'exampleCount': 0, 'progressSubstatus': 'CollectingData' } } ]
清理资源
完成本快速入门后,请从文件系统中删除该文件。