Краткое руководство. Клиентские библиотеки Распознавание речи (LUIS) и REST API
Внимание
LUIS будет прекращена 1 октября 2025 г. и с 1 апреля 2023 г. вы не сможете создать новые ресурсы LUIS. Мы рекомендуем перенести приложения LUIS в понимание общения, чтобы воспользоваться продолжением поддержки продуктов и многоязычными возможностями.
Следуя инструкциям в этом кратком руководстве для языков C#, Python и JavaScript, вы сможете создать приложение ИИ Azure LUIS и отправить в него запрос с помощью клиентских библиотек пакета SDK LUIS. Кроме того, вы можете отправляться запросы через REST API с использованием cURL.
Распознавание речи (LUIS) позволяет применять обработку естественного языка (NLP) к тексту пользователя в разговорном стиле и на естественном языке, чтобы предсказать общий смысл и извлечь соответствующую подробную информацию.
- Клиентская библиотека и REST API для разработки позволяют создавать, редактировать, обучать и публиковать приложения LUIS.
- Клиентская библиотека и REST API для среды выполнения прогнозирования позволяют отправлять запросы к опубликованному приложению.
С помощью клиентских библиотек Распознавания речи (LUIS) для .NET вы можете:
- Создать приложение
- Добавление намерения, сущности, по которой выполнено машинное обучение, с примером речевого фрагмента
- Обучение и публикация приложения.
- Среда выполнения прогнозирующих запросов
Справочная документация | Разработка и Прогнозирование Исходный код библиотеки | Разработка и Прогнозирование NuGet | Пример C#
Необходимые компоненты
- Текущая версия .NET Core и .NET Core CLI.
- Подписка Azure — создайте бесплатную учетную запись.
- Получив подписку Azure, создайте ресурс LUIS на портале Azure, чтобы получить ключ и конечную точку. Дождитесь, пока закончится развертывание, и нажмите кнопку Перейти к ресурсу.
- Для подключения приложения к LUIS для разработки потребуется ключ и конечная точка для созданного ресурса. Ключ и конечная точка будут вставлены в приведенный ниже код в кратком руководстве. Вы можете использовать ценовую категорию "Бесплатный" (
F0
), чтобы поработать со службой.
- Для подключения приложения к LUIS для разработки потребуется ключ и конечная точка для созданного ресурса. Ключ и конечная точка будут вставлены в приведенный ниже код в кратком руководстве. Вы можете использовать ценовую категорию "Бесплатный" (
Установка
Создание нового приложения C#
Создайте консольное приложение .NET Core на C# в предпочитаемой интегрированной среде разработки или редакторе.
В окне консоли (cmd, PowerShell или Bash) выполните команду dotnet
new
, чтобы создать консольное приложение с именемlanguage-understanding-quickstart
. Эта команда создает простой проект Hello World на языке C# с одним файлом исходного кода:Program.cs
.dotnet new console -n language-understanding-quickstart
Измените каталог на созданную папку приложения.
cd language-understanding-quickstart
Чтобы создать приложение, выполните следующую команду:
dotnet build
Выходные данные сборки не должны содержать предупреждений или ошибок.
... Build succeeded. 0 Warning(s) 0 Error(s) ...
Установка библиотек NuGet
В каталоге приложения установите клиентские библиотеки LUIS для .NET с помощью следующих команд:
dotnet add package Microsoft.Azure.CognitiveServices.Language.LUIS.Authoring --version 3.2.0-preview.3
dotnet add package Microsoft.Azure.CognitiveServices.Language.LUIS.Runtime --version 3.1.0-preview.1
Разработка объектной модели
Клиент для разработки LUIS является объектом LUISAuthoringClient, который проходит проверку подлинности в Azure и содержит ваш ключ разработки.
Примеры кода для разработки
После создания используйте клиент для доступа к функциям, включая:
- Приложения — создание, удаление, публикация.
- Примеры речевых фрагментов — добавление, удаление по идентификатору.
- Компоненты — управление списками фраз.
- Модель — управление намерениями и сущностями.
- Шаблоны — управление шаблонами.
- Обучение — обучение приложения и опрос состояния обучения.
- Версии — управление с помощью клонирования, экспорта и удаления.
Объектная модель прогнозирования
Клиент для среды выполнения прогнозирования LUIS представляет собой объект LUISRuntimeClient, который проходит проверку подлинности в Azure и содержит ваш ключ ресурса.
Примеры кода для среды выполнения прогнозирования
После создания используйте клиент для доступа к функциям, включая:
- Прогнозирование по слоту промежуточного хранения или рабочему слоту
- Прогнозирование по версии
Примеры кода
Эти фрагменты кода показывают, как выполнить следующие действия с помощью клиентской библиотеки Распознавания речи (LUIS) для Python:
- Создание приложения
- Добавление намерения
- Добавление сущностей
- Добавление примеров фрагментов речи
- Обучение приложения
- Публикация приложения
- Прогнозирование по слоту
Добавление зависимостей
В каталоге проекта откройте файл Program.cs в предпочитаемом редакторе или интегрированной среде разработки. Замените существующий код using
следующими директивами using
.
using System;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.Azure.CognitiveServices.Language.LUIS.Authoring;
using Microsoft.Azure.CognitiveServices.Language.LUIS.Authoring.Models;
using Microsoft.Azure.CognitiveServices.Language.LUIS.Runtime;
using Microsoft.Azure.CognitiveServices.Language.LUIS.Runtime.Models;
using Newtonsoft.Json;
Добавление стандартного кода
Измените подпись метода
Main
, чтобы разрешить асинхронные вызовы:public static async Task Main()
Добавьте остальную часть кода в метод
Main
для классаProgram
(если не указано иное).
Создание переменных для приложения
Создайте два набора переменных, один из которых вам нужно изменить, а второй оставить таким, как показано в примере кода.
Внимание
Обязательно удалите ключ из кода, когда завершите работу, и ни в коем случае не публикуйте его в открытом доступе. Для рабочей среды используйте безопасный способ хранения и доступа к учетным данным, например Azure Key Vault. Дополнительные сведения см. в статье по безопасности служб ИИ Azure.
Создайте переменные для хранения ключа разработки и имен ресурсов.
var key = "PASTE_YOUR_LUIS_AUTHORING_SUBSCRIPTION_KEY_HERE"; var authoringEndpoint = "PASTE_YOUR_LUIS_AUTHORING_ENDPOINT_HERE"; var predictionEndpoint = "PASTE_YOUR_LUIS_PREDICTION_ENDPOINT_HERE";
Создайте переменные для хранения конечных точек, имени приложения, версии и имени намерения.
var appName = "Contoso Pizza Company"; var versionId = "0.1"; var intentName = "OrderPizzaIntent";
аутентификация клиента;
Теперь создайте объект ApiKeyServiceClientCredentials с помощью ключа и используйте его со своей конечной точкой, чтобы создать объект LUISAuthoringClient.
var credentials = new Microsoft.Azure.CognitiveServices.Language.LUIS.Authoring.ApiKeyServiceClientCredentials(key);
var client = new LUISAuthoringClient(credentials) { Endpoint = authoringEndpoint };
Создание приложения LUIS
Приложение LUIS содержит модель обработки естественного языка (NLP), в том числе намерения, сущности и примеры речевых фрагментов.
Создайте ApplicationCreateObject. Название, язык и региональные параметры являются обязательными свойствами. Вызовите метод Apps.AddAsync. Ответ — это идентификатор приложения.
var newApp = new ApplicationCreateObject
{
Culture = "en-us",
Name = appName,
InitialVersionId = versionId
};
var appId = await client.Apps.AddAsync(newApp);
Создание намерения для приложения
Основным объектом в модели приложения LUIS является намерение. Намерение совпадает с группировкой намерений пользовательских речевых фрагментов. Пользователь может задать вопрос или сделать инструкцию в поисках конкретного намеренного ответа от бота (или другого клиентского приложения). Примерами намерений являются бронирование рейса, запрос о погоде в городе назначения и запрос контактной информации для обслуживания клиентов.
Создайте ModelCreateObject с именем уникального намерения, затем передайте идентификатор приложения, идентификатор версии и ModelCreateObject в метод Model.AddIntentAsync. Ответ — это идентификатор намерения.
Значение intentName
жестко запрограммировано в OrderPizzaIntent
как одна из переменных, описанных в разделе Создание переменных для приложения.
await client.Model.AddIntentAsync(appId, versionId, new ModelCreateObject()
{
Name = intentName
});
Создание сущностей для приложения
Хотя сущности не требуются, они встречаются в большинстве приложений. Сущность извлекает информацию из речевого фрагмента пользователя, необходимую для выполнения намерения пользователя. Существует несколько типов готовых и пользовательских объектов, каждый из которых имеет собственные модели объекта преобразования данных (DTO). Обычные готовые сущности, добавляемые в ваше приложение, включают в себя number, datetimeV2, geographyV2 и ordinal.
Важно знать, что объекты не отмечены намерением. Они могут и обычно относятся ко многим намерениям. Только примеры пользовательских речевых фрагментов помечены для определенного единственного намерения.
Методы создания сущностей являются частью класса Model. Каждый тип сущности имеет собственную модель объекта преобразования данных (DTO), обычно содержащую слово model
в пространстве имен моделей.
Код создания сущности создает сущность машинного обучения с вложенными сущностями и функциями, применяемыми к вложенным сущностям Quantity
.
// Add Prebuilt entity
await client.Model.AddPrebuiltAsync(appId, versionId, new[] { "number" });
// Define ml entity with children and grandchildren
var mlEntityDefinition = new EntityModelCreateObject
{
Name = "Pizza order",
Children = new[]
{
new ChildEntityModelCreateObject
{
Name = "Pizza",
Children = new[]
{
new ChildEntityModelCreateObject { Name = "Quantity" },
new ChildEntityModelCreateObject { Name = "Type" },
new ChildEntityModelCreateObject { Name = "Size" }
}
},
new ChildEntityModelCreateObject
{
Name = "Toppings",
Children = new[]
{
new ChildEntityModelCreateObject { Name = "Type" },
new ChildEntityModelCreateObject { Name = "Quantity" }
}
}
}
};
// Add ML entity
var mlEntityId = await client.Model.AddEntityAsync(appId, versionId, mlEntityDefinition); ;
// Add phraselist feature
var phraselistId = await client.Features.AddPhraseListAsync(appId, versionId, new PhraselistCreateObject
{
EnabledForAllModels = false,
IsExchangeable = true,
Name = "QuantityPhraselist",
Phrases = "few,more,extra"
});
// Get entity and subentities
var model = await client.Model.GetEntityAsync(appId, versionId, mlEntityId);
var toppingQuantityId = GetModelGrandchild(model, "Toppings", "Quantity");
var pizzaQuantityId = GetModelGrandchild(model, "Pizza", "Quantity");
// add model as feature to subentity model
await client.Features.AddEntityFeatureAsync(appId, versionId, pizzaQuantityId, new ModelFeatureInformation { ModelName = "number", IsRequired = true });
await client.Features.AddEntityFeatureAsync(appId, versionId, toppingQuantityId, new ModelFeatureInformation { ModelName = "number"});
// add phrase list as feature to subentity model
await client.Features.AddEntityFeatureAsync(appId, versionId, toppingQuantityId, new ModelFeatureInformation { FeatureName = "QuantityPhraselist" });
Используйте следующий метод для класса, чтобы определить идентификатор вложенной сущности Quantity для назначения ей функций.
static Guid GetModelGrandchild(NDepthEntityExtractor model, string childName, string grandchildName)
{
return model.Children.
Single(c => c.Name == childName).
Children.
Single(c => c.Name == grandchildName).Id;
}
Добавление примера высказывания в намерение
Чтобы определить намерение высказывания и извлечь сущности, приложению нужны примеры речевых фрагментов. Примеры должны быть нацелены на конкретное единственное намерение и должны отмечать все пользовательские объекты. Готовые объекты не нужно отмечать.
Добавьте примеры речевых фрагментов, создав список объектов ExampleLabelObject, по одному объекту для каждого примера высказывания. Каждый пример должен пометить все сущности словарем пар "имя — значение" имени и значения сущности. Значение сущности должно быть точно таким, как оно указано в тексте примера высказывания.
Вызовите Examples.AddAsync с идентификатором приложения, идентификатором версии и примером.
// Define labeled example
var labeledExampleUtteranceWithMLEntity = new ExampleLabelObject
{
Text = "I want two small seafood pizzas with extra cheese.",
IntentName = intentName,
EntityLabels = new[]
{
new EntityLabelObject
{
StartCharIndex = 7,
EndCharIndex = 48,
EntityName = "Pizza order",
Children = new[]
{
new EntityLabelObject
{
StartCharIndex = 7,
EndCharIndex = 30,
EntityName = "Pizza",
Children = new[]
{
new EntityLabelObject { StartCharIndex = 7, EndCharIndex = 9, EntityName = "Quantity" },
new EntityLabelObject { StartCharIndex = 11, EndCharIndex = 15, EntityName = "Size" },
new EntityLabelObject { StartCharIndex = 17, EndCharIndex = 23, EntityName = "Type" }
}
},
new EntityLabelObject
{
StartCharIndex = 37,
EndCharIndex = 48,
EntityName = "Toppings",
Children = new[]
{
new EntityLabelObject { StartCharIndex = 37, EndCharIndex = 41, EntityName = "Quantity" },
new EntityLabelObject { StartCharIndex = 43, EndCharIndex = 48, EntityName = "Type" }
}
}
}
},
}
};
// Add an example for the entity.
// Enable nested children to allow using multiple models with the same name.
// The quantity subentity and the phraselist could have the same exact name if this is set to True
await client.Examples.AddAsync(appId, versionId, labeledExampleUtteranceWithMLEntity, enableNestedChildren: true);
Обучение приложения
После создания модели приложение LUIS необходимо обучить этой версии модели. Обученную модель можно использовать в контейнере или опубликовать в промежуточных или рабочих слотах.
Методу Train.TrainVersionAsync требуется идентификатор приложения и идентификатор версии.
Очень маленькая модель, такая как в этом кратком руководстве, будет обучаться очень быстро. Обучение приложений рабочего уровня должно включать в себя вызов опроса с помощью метода GetStatusAsync, чтобы определить, прошло ли обучение успешно. Ответ представляет собой список объектов ModelTrainingInfo с отдельным состоянием для каждого объекта. Все объекты должны быть успешно обучены, чтобы обучение считалось завершенным.
await client.Train.TrainVersionAsync(appId, versionId);
while (true)
{
var status = await client.Train.GetStatusAsync(appId, versionId);
if (status.All(m => m.Details.Status == "Success"))
{
// Assumes that we never fail, and that eventually we'll always succeed.
break;
}
}
Публикация приложения в рабочий слот
Опубликуйте LUIS, используя метод PublishAsync. При этом публикуется текущая обученная версия в указанный слот в конечной точке. Ваше клиентское приложение использует эту конечную точку для отправки пользовательских высказываний для прогнозирования намерения и извлечения сущности.
await client.Apps.PublishAsync(appId, new ApplicationPublishObject { VersionId = versionId, IsStaging=false});
Аутентификация клиента среды выполнения прогнозирования
Используйте объект ApiKeyServiceClientCredentials с помощью ключа и примените его со своей конечной точкой, чтобы создать объект LUISRuntimeClient.
Внимание
В этом кратком руководстве ключ разработки используется как часть учетных данных среды выполнения. С его помощью можно выполнять некоторые запросы к среде выполнения. Для промежуточного и рабочего уровней кода замените ключ разработки ключом среды выполнения прогнозирования.
var runtimeClient = new LUISRuntimeClient(credentials) { Endpoint = predictionEndpoint };
Получение прогноза из среды выполнения
Добавьте следующий код, который создает запрос к среде выполнения прогнозирования.
Речевой фрагмент пользователя является частью объекта PredictionRequest.
Метод GetSlotPredictionAsync принимает для выполнения запроса несколько обязательных параметров, в том числе идентификатор приложения, имя слота и объект запроса прогнозирования. Есть еще несколько необязательных параметров, например для режимов подробного протоколирования, отображения всех намерений и ведения журнала.
// Production == slot name
var request = new PredictionRequest { Query = "I want two small pepperoni pizzas with more salsa" };
var prediction = await runtimeClient.Prediction.GetSlotPredictionAsync(appId, "Production", request);
Console.Write(JsonConvert.SerializeObject(prediction, Formatting.Indented));
Ответ с прогнозом — это объект JSON, содержащий намерение и все найденные сущности.
{
"query": "I want two small pepperoni pizzas with more salsa",
"prediction": {
"topIntent": "OrderPizzaIntent",
"intents": {
"OrderPizzaIntent": {
"score": 0.753606856
},
"None": {
"score": 0.119097039
}
},
"entities": {
"Pizza order": [
{
"Pizza": [
{
"Quantity": [
2
],
"Type": [
"pepperoni"
],
"Size": [
"small"
],
"$instance": {
"Quantity": [
{
"type": "builtin.number",
"text": "two",
"startIndex": 7,
"length": 3,
"score": 0.968156934,
"modelTypeId": 1,
"modelType": "Entity Extractor",
"recognitionSources": [
"model"
]
}
],
"Type": [
{
"type": "Type",
"text": "pepperoni",
"startIndex": 17,
"length": 9,
"score": 0.9345611,
"modelTypeId": 1,
"modelType": "Entity Extractor",
"recognitionSources": [
"model"
]
}
],
"Size": [
{
"type": "Size",
"text": "small",
"startIndex": 11,
"length": 5,
"score": 0.9592077,
"modelTypeId": 1,
"modelType": "Entity Extractor",
"recognitionSources": [
"model"
]
}
]
}
}
],
"Toppings": [
{
"Type": [
"salsa"
],
"Quantity": [
"more"
],
"$instance": {
"Type": [
{
"type": "Type",
"text": "salsa",
"startIndex": 44,
"length": 5,
"score": 0.7292897,
"modelTypeId": 1,
"modelType": "Entity Extractor",
"recognitionSources": [
"model"
]
}
],
"Quantity": [
{
"type": "Quantity",
"text": "more",
"startIndex": 39,
"length": 4,
"score": 0.9320932,
"modelTypeId": 1,
"modelType": "Entity Extractor",
"recognitionSources": [
"model"
]
}
]
}
}
],
"$instance": {
"Pizza": [
{
"type": "Pizza",
"text": "two small pepperoni pizzas",
"startIndex": 7,
"length": 26,
"score": 0.812199831,
"modelTypeId": 1,
"modelType": "Entity Extractor",
"recognitionSources": [
"model"
]
}
],
"Toppings": [
{
"type": "Toppings",
"text": "more salsa",
"startIndex": 39,
"length": 10,
"score": 0.7250252,
"modelTypeId": 1,
"modelType": "Entity Extractor",
"recognitionSources": [
"model"
]
}
]
}
}
],
"$instance": {
"Pizza order": [
{
"type": "Pizza order",
"text": "two small pepperoni pizzas with more salsa",
"startIndex": 7,
"length": 42,
"score": 0.769223332,
"modelTypeId": 1,
"modelType": "Entity Extractor",
"recognitionSources": [
"model"
]
}
]
}
}
}
}
Выполнение приложения
Запустите приложение с помощью команды dotnet run
из каталога приложения.
dotnet run
С помощью клиентских библиотек Распознавания речи (LUIS) для Node.js вы можете выполнить приведенные ниже задачи.
- Создать приложение
- Добавление намерения, сущности, по которой выполнено машинное обучение, с примером речевого фрагмента
- Обучение и публикация приложения.
- Среда выполнения прогнозирующих запросов
Справочная документация | по разработке и прогнозированию NPM | Образцы
Необходимые компоненты
- Node.js
- Подписка Azure — создайте бесплатную учетную запись.
- Получив подписку Azure, создайте ресурс LUIS на портале Azure, чтобы получить ключ и конечную точку. Дождитесь, пока закончится развертывание, и нажмите кнопку Перейти к ресурсу.
- Для подключения приложения к LUIS для разработки потребуется ключ и конечная точка для созданного ресурса. Ключ и конечная точка будут вставлены в приведенный ниже код в кратком руководстве. Вы можете использовать ценовую категорию "Бесплатный" (
F0
), чтобы поработать со службой.
- Для подключения приложения к LUIS для разработки потребуется ключ и конечная точка для созданного ресурса. Ключ и конечная точка будут вставлены в приведенный ниже код в кратком руководстве. Вы можете использовать ценовую категорию "Бесплатный" (
Установка
Создание приложения JavaScript
В окне консоли создайте каталог для приложения и перейдите в него.
mkdir quickstart-sdk && cd quickstart-sdk
Инициализируйте каталог как приложение JavaScript, создав файл
package.json
.npm init -y
Создайте файл с именем
index.js
для своего кода JavaScript.touch index.js
Установка библиотек NPM
В каталоге приложения установите зависимости с помощью следующей команды, выполняемой построчно.
npm install @azure/ms-rest-js
npm install @azure/cognitiveservices-luis-authoring
npm install @azure/cognitiveservices-luis-runtime
Файл package.json
должен выглядеть следующим образом:
{
"name": "quickstart-sdk",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"@azure/cognitiveservices-luis-authoring": "^4.0.0-preview.3",
"@azure/cognitiveservices-luis-runtime": "^5.0.0",
"@azure/ms-rest-js": "^2.0.8"
}
}
Разработка объектной модели
Клиент для разработки LUIS является объектом LUISAuthoringClient, который проходит проверку подлинности в Azure и содержит ваш ключ разработки.
Примеры кода для разработки
После создания используйте клиент для доступа к функциям, включая:
- Приложения — Добавить, Удалить, Опубликовать
- Примеры речевых фрагментов — добавление по пакетам, удаление по идентификатору.
- Компоненты — управление списками фраз.
- Модель — управление намерениями и сущностями.
- Шаблоны — управление шаблонами.
- Обучение — обучение приложения и опрос состояния обучения.
- Версии — управление с помощью клонирования, экспорта и удаления.
Объектная модель прогнозирования
Клиент для разработки LUIS является объектом LUISAuthoringClient, который проходит проверку подлинности в Azure и содержит ваш ключ разработки.
Примеры кода для среды выполнения прогнозирования
После создания используйте клиент для доступа к функциям, включая:
- Прогнозирование по слоту
staging
илиproduction
- Прогнозирование по версии
Примеры кода
Эти фрагменты кода показывают, как выполнить следующие действия с помощью клиентской библиотеки Распознавания речи (LUIS) для Python:
- Создание приложения
- Добавление намерения
- Добавление сущностей
- Добавление примеров фрагментов речи
- Обучение приложения
- Публикация приложения
- Прогнозирование по слоту
Добавление зависимостей
Откройте файл index.js
в предпочитаемом редакторе или названной интегрированной среде разработки и добавьте следующие зависимости.
const msRest = require("@azure/ms-rest-js");
const LUIS_Authoring = require("@azure/cognitiveservices-luis-authoring");
const LUIS_Prediction = require("@azure/cognitiveservices-luis-runtime");
Добавление стандартного кода
Добавьте метод
quickstart
и его вызов. Этот метод охватывает большую часть оставшегося кода. Он вызывается в конце файла.const quickstart = async () => { // add calls here } quickstart() .then(result => console.log("Done")) .catch(err => { console.log(`Error: ${err}`) })
Добавьте оставшийся код в метод quickstart, если не указано иное.
Создание переменных для приложения
Создайте два набора переменных, один из которых вам нужно изменить, а второй оставить таким, как показано в примере кода.
Внимание
Обязательно удалите ключ из кода, когда завершите работу, и ни в коем случае не публикуйте его в открытом доступе. Для рабочей среды используйте безопасный способ хранения и доступа к учетным данным, например Azure Key Vault. Дополнительные сведения см. в статье по безопасности служб ИИ Azure.
Создайте переменные для хранения ключа разработки и имен ресурсов.
const authoringKey = 'PASTE_YOUR_LUIS_AUTHORING_SUBSCRIPTION_KEY_HERE'; const authoringEndpoint = "PASTE_YOUR_LUIS_AUTHORING_ENDPOINT_HERE"; const predictionEndpoint = "PASTE_YOUR_LUIS_PREDICTION_ENDPOINT_HERE";
Создайте переменные для хранения конечных точек, имени приложения, версии и имени намерения.
const appName = "Contoso Pizza Company"; const versionId = "0.1"; const intentName = "OrderPizzaIntent";
аутентификация клиента;
Теперь создайте объект CognitiveServicesCredentials с помощью ключа и используйте его со своей конечной точкой, чтобы создать объект LUISAuthoringClient.
const luisAuthoringCredentials = new msRest.ApiKeyCredentials({
inHeader: { "Ocp-Apim-Subscription-Key": authoringKey }
});
const client = new LUIS_Authoring.LUISAuthoringClient(
luisAuthoringCredentials,
authoringEndpoint
);
Создание приложения LUIS
Приложение LUIS содержит модель обработки естественного языка (NLP), в том числе намерения, сущности и примеры речевых фрагментов.
Создайте метод AppsOperation добавления объекта, чтобы создать приложение. Название, язык и региональные параметры являются обязательными свойствами.
const create_app_payload = {
name: appName,
initialVersionId: versionId,
culture: "en-us"
};
const createAppResult = await client.apps.add(
create_app_payload
);
const appId = createAppResult.body
Создание намерения для приложения
Основным объектом в модели приложения LUIS является намерение. Намерение совпадает с группировкой намерений пользовательских речевых фрагментов. Пользователь может задать вопрос или сделать инструкцию в поисках конкретного намеренного ответа от бота (или другого клиентского приложения). Примерами намерений являются бронирование рейса, запрос о погоде в городе назначения и запрос контактной информации для обслуживания клиентов.
Используйте метод model.add_intent с именем уникального намерения, затем передайте идентификатор приложения, идентификатор версии и новое имя намерения.
Значение intentName
жестко запрограммировано в OrderPizzaIntent
как одна из переменных, описанных в разделе Создание переменных для приложения.
await client.model.addIntent(
appId,
versionId,
{ name: intentName }
);
Создание сущностей для приложения
Хотя сущности не требуются, они встречаются в большинстве приложений. Сущность извлекает информацию из речевого фрагмента пользователя, необходимую для выполнения намерения пользователя. Существует несколько типов готовых и пользовательских объектов, каждый из которых имеет собственные модели объекта преобразования данных (DTO). Обычные готовые сущности, добавляемые в ваше приложение, включают в себя number, datetimeV2, geographyV2 и ordinal.
Важно знать, что объекты не отмечены намерением. Они могут и обычно относятся ко многим намерениям. Только примеры пользовательских речевых фрагментов помечены для определенного единственного намерения.
Методы создания сущностей являются частью класса Model. Каждый тип сущности имеет собственную модель объекта преобразования данных (DTO).
Код создания сущности создает сущность машинного обучения с вложенными сущностями и функциями, применяемыми к вложенным сущностям Quantity
.
// Add Prebuilt entity
await client.model.addPrebuilt(appId, versionId, ["number"]);
// Define ml entity with children and grandchildren
const mlEntityDefinition = {
name: "Pizza order",
children: [
{
name: "Pizza",
children: [
{ name: "Quantity" },
{ name: "Type" },
{ name: "Size" }
]
},
{
name: "Toppings",
children: [
{ name: "Type" },
{ name: "Quantity" }
]
}
]
};
// Add ML entity
const response = await client.model.addEntity(appId, versionId, mlEntityDefinition);
const mlEntityId = response.body;
// Add phraselist feature
const phraselistResponse = await client.features.addPhraseList(appId, versionId, {
enabledForAllModels: false,
isExchangeable: true,
name: "QuantityPhraselist",
phrases: "few,more,extra"
});
const phraseListId = phraselistResponse.body;
// Get entity and subentities
const model = await client.model.getEntity(appId, versionId, mlEntityId);
const toppingQuantityId = getModelGrandchild(model, "Toppings", "Quantity");
const pizzaQuantityId = getModelGrandchild(model, "Pizza", "Quantity");
// add model as feature to subentity model
await client.features.addEntityFeature(appId, versionId, pizzaQuantityId, { modelName: "number", isRequired: true });
await client.features.addEntityFeature(appId, versionId, toppingQuantityId, { modelName: "number" });
// add phrase list as feature to subentity model
await client.features.addEntityFeature(appId, versionId, toppingQuantityId, { featureName: "QuantityPhraselist" });
Поместите следующий метод над методом quickstart
, чтобы определить идентификатор вложенной сущности Quantity для назначения ей функций.
const getModelGrandchild = (model, childName, grandchildName) => {
return model.children.find(c => c.name == childName).children.find(c => c.name == grandchildName).id
}
Добавление примера высказывания в намерение
Чтобы определить намерение высказывания и извлечь сущности, приложению нужны примеры речевых фрагментов. Примеры должны быть нацелены на конкретное единственное намерение и должны отмечать все пользовательские объекты. Готовые объекты не нужно отмечать.
Добавьте примеры речевых фрагментов, создав список объектов ExampleLabelObject, по одному объекту для каждого примера высказывания. Каждый пример должен пометить все сущности словарем пар "имя — значение" имени и значения сущности. Значение сущности должно быть точно таким, как оно указано в тексте примера высказывания.
Вызовите examples.add с идентификатором приложения, идентификатором версии и примером.
// Define labeled example
const labeledExampleUtteranceWithMLEntity =
{
text: "I want two small seafood pizzas with extra cheese.",
intentName: intentName,
entityLabels: [
{
startCharIndex: 7,
endCharIndex: 48,
entityName: "Pizza order",
children: [
{
startCharIndex: 7,
endCharIndex: 30,
entityName: "Pizza",
children: [
{
startCharIndex: 7,
endCharIndex: 9,
entityName: "Quantity"
},
{
startCharIndex: 11,
endCharIndex: 15,
entityName: "Size"
},
{
startCharIndex: 17,
endCharIndex: 23,
entityName: "Type"
}]
},
{
startCharIndex: 37,
endCharIndex: 48,
entityName: "Toppings",
children: [
{
startCharIndex: 37,
endCharIndex: 41,
entityName: "Quantity"
},
{
startCharIndex: 43,
endCharIndex: 48,
entityName: "Type"
}]
}
]
}
]
};
console.log("Labeled Example Utterance:", JSON.stringify(labeledExampleUtteranceWithMLEntity, null, 4 ));
// Add an example for the entity.
// Enable nested children to allow using multiple models with the same name.
// The quantity subentity and the phraselist could have the same exact name if this is set to True
await client.examples.add(appId, versionId, labeledExampleUtteranceWithMLEntity, { enableNestedChildren: true });
Обучение приложения
После создания модели приложение LUIS необходимо обучить этой версии модели. Обученную модель можно использовать в контейнере или опубликовать в промежуточных или рабочих слотах.
Методу train.trainVersion требуется идентификатор приложения и идентификатор версии.
Очень маленькая модель, такая как в этом кратком руководстве, будет обучаться очень быстро. Обучение приложений рабочего уровня должно включать в себя вызов опроса с помощью метода get_status, чтобы определить, прошло ли обучение успешно. Ответ представляет собой список объектов ModelTrainingInfo с отдельным состоянием для каждого объекта. Все объекты должны быть успешно обучены, чтобы обучение считалось завершенным.
await client.train.trainVersion(appId, versionId);
while (true) {
const status = await client.train.getStatus(appId, versionId);
if (status.every(m => m.details.status == "Success")) {
// Assumes that we never fail, and that eventually we'll always succeed.
break;
}
}
Публикация приложения в рабочий слот
Опубликуйте приложение LUIS с помощью метода app.publish. При этом публикуется текущая обученная версия в указанный слот в конечной точке. Ваше клиентское приложение использует эту конечную точку для отправки пользовательских высказываний для прогнозирования намерения и извлечения сущности.
await client.apps.publish(appId, { versionId: versionId, isStaging: false });
Аутентификация клиента среды выполнения прогнозирования
Используйте объект с ключом и используйте его с конечной msRest.ApiKeyCredentials
точкой для создания LUIS. Объект LUISRuntimeClient .
Внимание
В этом кратком руководстве ключ разработки используется как часть учетных данных среды выполнения. С его помощью можно выполнять некоторые запросы к среде выполнения. Для промежуточного и рабочего уровней кода замените ключ разработки ключом среды выполнения прогнозирования.
const luisPredictionClient = new LUIS_Prediction.LUISRuntimeClient(
luisAuthoringCredentials,
predictionEndpoint
);
Получение прогноза из среды выполнения
Добавьте следующий код, который создает запрос к среде выполнения прогнозирования. Речевой фрагмент пользователя является частью объекта predictionRequest.
Метод luisRuntimeClient.prediction.getSlotPrediction принимает для выполнения запроса несколько обязательных параметров, в том числе идентификатор приложения, имя слота и объект запроса прогнозирования. Есть еще несколько необязательных параметров, например для режимов подробного протоколирования, отображения всех намерений и ведения журнала.
// Production == slot name
const request = { query: "I want two small pepperoni pizzas with more salsa" };
const response = await luisPredictionClient.prediction.getSlotPrediction(appId, "Production", request);
console.log(JSON.stringify(response.prediction, null, 4 ));
Ответ с прогнозом — это объект JSON, содержащий намерение и все найденные сущности.
{
"query": "I want two small pepperoni pizzas with more salsa",
"prediction": {
"topIntent": "OrderPizzaIntent",
"intents": {
"OrderPizzaIntent": {
"score": 0.753606856
},
"None": {
"score": 0.119097039
}
},
"entities": {
"Pizza order": [
{
"Pizza": [
{
"Quantity": [
2
],
"Type": [
"pepperoni"
],
"Size": [
"small"
],
"$instance": {
"Quantity": [
{
"type": "builtin.number",
"text": "two",
"startIndex": 7,
"length": 3,
"score": 0.968156934,
"modelTypeId": 1,
"modelType": "Entity Extractor",
"recognitionSources": [
"model"
]
}
],
"Type": [
{
"type": "Type",
"text": "pepperoni",
"startIndex": 17,
"length": 9,
"score": 0.9345611,
"modelTypeId": 1,
"modelType": "Entity Extractor",
"recognitionSources": [
"model"
]
}
],
"Size": [
{
"type": "Size",
"text": "small",
"startIndex": 11,
"length": 5,
"score": 0.9592077,
"modelTypeId": 1,
"modelType": "Entity Extractor",
"recognitionSources": [
"model"
]
}
]
}
}
],
"Toppings": [
{
"Type": [
"salsa"
],
"Quantity": [
"more"
],
"$instance": {
"Type": [
{
"type": "Type",
"text": "salsa",
"startIndex": 44,
"length": 5,
"score": 0.7292897,
"modelTypeId": 1,
"modelType": "Entity Extractor",
"recognitionSources": [
"model"
]
}
],
"Quantity": [
{
"type": "Quantity",
"text": "more",
"startIndex": 39,
"length": 4,
"score": 0.9320932,
"modelTypeId": 1,
"modelType": "Entity Extractor",
"recognitionSources": [
"model"
]
}
]
}
}
],
"$instance": {
"Pizza": [
{
"type": "Pizza",
"text": "two small pepperoni pizzas",
"startIndex": 7,
"length": 26,
"score": 0.812199831,
"modelTypeId": 1,
"modelType": "Entity Extractor",
"recognitionSources": [
"model"
]
}
],
"Toppings": [
{
"type": "Toppings",
"text": "more salsa",
"startIndex": 39,
"length": 10,
"score": 0.7250252,
"modelTypeId": 1,
"modelType": "Entity Extractor",
"recognitionSources": [
"model"
]
}
]
}
}
],
"$instance": {
"Pizza order": [
{
"type": "Pizza order",
"text": "two small pepperoni pizzas with more salsa",
"startIndex": 7,
"length": 42,
"score": 0.769223332,
"modelTypeId": 1,
"modelType": "Entity Extractor",
"recognitionSources": [
"model"
]
}
]
}
}
}
}
Выполнение приложения
Запустите приложение, выполнив команду node index.js
для файла quickstart.
node index.js
С помощью клиентских библиотек Распознавания речи (LUIS) для Python вы можете:
- Создать приложение
- Добавление намерения, сущности, по которой выполнено машинное обучение, с примером речевого фрагмента
- Обучение и публикация приложения.
- Среда выполнения прогнозирующих запросов
Справочная документация | Разработка и Прогнозирование Исходный код библиотеки | Пакет (Pypi) | Примеры
Необходимые компоненты
- Текущая версия Python 3.x.
- Подписка Azure — создайте бесплатную учетную запись.
- Получив подписку Azure, создайте ресурс LUIS на портале Azure, чтобы получить ключ и конечную точку. Дождитесь, пока закончится развертывание, и нажмите кнопку Перейти к ресурсу.
- Для подключения приложения к LUIS для разработки потребуется ключ и конечная точка для созданного ресурса. Ключ и конечная точка будут вставлены в приведенный ниже код в кратком руководстве. Вы можете использовать ценовую категорию "Бесплатный" (
F0
), чтобы поработать со службой.
- Для подключения приложения к LUIS для разработки потребуется ключ и конечная точка для созданного ресурса. Ключ и конечная точка будут вставлены в приведенный ниже код в кратком руководстве. Вы можете использовать ценовую категорию "Бесплатный" (
Установка
Создание приложения Python
В окне консоли создайте каталог для приложения и перейдите в него.
mkdir quickstart-sdk && cd quickstart-sdk
Создайте файл с именем
authoring_and_predict.py
для своего кода Python.touch authoring_and_predict.py
Установка клиентской библиотеки с помощью Pip
В каталоге приложения установите клиентскую библиотеку для Распознавания речи (LUIS) для Python с помощью следующей команды:
pip install azure-cognitiveservices-language-luis
Разработка объектной модели
Клиент для разработки LUIS является объектом LUISAuthoringClient, который проходит проверку подлинности в Azure и содержит ваш ключ разработки.
Примеры кода для разработки
После создания используйте клиент для доступа к функциям, включая:
- Приложения — создание, удаление, публикация.
- Примеры речевых фрагментов — добавление по пакетам, удаление по идентификатору.
- Компоненты — управление списками фраз.
- Модель — управление намерениями и сущностями.
- Шаблоны — управление шаблонами.
- Обучение — обучение приложения и опрос состояния обучения.
- Версии — управление с помощью клонирования, экспорта и удаления.
Объектная модель прогнозирования
Клиент для среды выполнения прогнозирования LUIS представляет собой объект LUISRuntimeClient, который проходит проверку подлинности в Azure и содержит ваш ключ ресурса.
Примеры кода для среды выполнения прогнозирования
После создания используйте клиент для доступа к функциям, включая:
- Прогнозирование по слоту промежуточного хранения или рабочему слоту
- Прогнозирование по версии
Примеры кода
Эти фрагменты кода показывают, как выполнить следующие действия с помощью клиентской библиотеки Распознавания речи (LUIS) для Python:
- Создание приложения
- Добавление намерения
- Добавление сущностей
- Добавление примеров фрагментов речи
- Обучение приложения
- Публикация приложения
- Прогнозирование по слоту
Добавление зависимостей
Добавьте клиентские библиотеки в файл Python.
from azure.cognitiveservices.language.luis.authoring import LUISAuthoringClient
from azure.cognitiveservices.language.luis.authoring.models import ApplicationCreateObject
from azure.cognitiveservices.language.luis.runtime import LUISRuntimeClient
from msrest.authentication import CognitiveServicesCredentials
from functools import reduce
import json, time, uuid
Добавление стандартного кода
Добавьте метод
quickstart
и его вызов. Этот метод охватывает большую часть оставшегося кода. Он вызывается в конце файла.def quickstart(): # add calls here, remember to indent properly quickstart()
Добавьте оставшийся код в метод quickstart, если не указано иное.
Создание переменных для приложения
Создайте два набора переменных, один из которых вам нужно изменить, а второй оставить таким, как показано в примере кода.
Внимание
Обязательно удалите ключ из кода, когда завершите работу, и ни в коем случае не публикуйте его в открытом доступе. Для рабочей среды используйте безопасный способ хранения и доступа к учетным данным, например Azure Key Vault. Дополнительные сведения см. в статье по безопасности служб ИИ Azure.
Создайте переменные для хранения ключа разработки и имен ресурсов.
authoringKey = 'PASTE_YOUR_LUIS_AUTHORING_SUBSCRIPTION_KEY_HERE' authoringEndpoint = 'PASTE_YOUR_LUIS_AUTHORING_ENDPOINT_HERE' predictionKey = 'PASTE_YOUR_LUIS_PREDICTION_SUBSCRIPTION_KEY_HERE' predictionEndpoint = 'PASTE_YOUR_LUIS_PREDICTION_ENDPOINT_HERE'
Создайте переменные для хранения конечных точек, имени приложения, версии и имени намерения.
# We use a UUID to avoid name collisions. appName = "Contoso Pizza Company " + str(uuid.uuid4()) versionId = "0.1" intentName = "OrderPizzaIntent"
аутентификация клиента;
Создайте объект CognitiveServicesCredentials с ключом и используйте его с конечной точкой для создания объекта LUISAuthoringClient .
client = LUISAuthoringClient(authoringEndpoint, CognitiveServicesCredentials(authoringKey))
Создание приложения LUIS
Приложение LUIS содержит модель обработки естественного языка (NLP), в том числе намерения, сущности и примеры речевых фрагментов.
Создайте метод AppsOperation добавления объекта, чтобы создать приложение. Название, язык и региональные параметры являются обязательными свойствами.
# define app basics
appDefinition = ApplicationCreateObject (name=appName, initial_version_id=versionId, culture='en-us')
# create app
app_id = client.apps.add(appDefinition)
# get app id - necessary for all other changes
print("Created LUIS app with ID {}".format(app_id))
Создание намерения для приложения
Основным объектом в модели приложения LUIS является намерение. Намерение совпадает с группировкой намерений пользовательских речевых фрагментов. Пользователь может задать вопрос или сделать инструкцию в поисках конкретного намеренного ответа от бота (или другого клиентского приложения). Примерами намерений являются бронирование рейса, запрос о погоде в городе назначения и запрос контактной информации для обслуживания клиентов.
Используйте метод model.add_intent с именем уникального намерения, затем передайте идентификатор приложения, идентификатор версии и новое имя намерения.
Значение intentName
жестко запрограммировано в OrderPizzaIntent
как одна из переменных, описанных в разделе Создание переменных для приложения.
client.model.add_intent(app_id, versionId, intentName)
Создание сущностей для приложения
Хотя сущности не требуются, они встречаются в большинстве приложений. Сущность извлекает информацию из речевого фрагмента пользователя, необходимую для выполнения намерения пользователя. Существует несколько типов готовых и пользовательских объектов, каждый из которых имеет собственные модели объекта преобразования данных (DTO). Обычные готовые сущности, добавляемые в ваше приложение, включают в себя number, datetimeV2, geographyV2 и ordinal.
Важно знать, что объекты не отмечены намерением. Они могут и обычно относятся ко многим намерениям. Только примеры пользовательских речевых фрагментов помечены для определенного единственного намерения.
Методы создания сущностей являются частью класса ModelOperations. Каждый тип сущности имеет собственную модель объекта преобразования данных (DTO).
Код создания сущности создает сущность машинного обучения с вложенными сущностями и функциями, применяемыми к вложенным сущностям Quantity
.
# Add Prebuilt entity
client.model.add_prebuilt(app_id, versionId, prebuilt_extractor_names=["number"])
# define machine-learned entity
mlEntityDefinition = [
{
"name": "Pizza",
"children": [
{ "name": "Quantity" },
{ "name": "Type" },
{ "name": "Size" }
]
},
{
"name": "Toppings",
"children": [
{ "name": "Type" },
{ "name": "Quantity" }
]
}]
# add entity to app
modelId = client.model.add_entity(app_id, versionId, name="Pizza order", children=mlEntityDefinition)
# define phraselist - add phrases as significant vocabulary to app
phraseList = {
"enabledForAllModels": False,
"isExchangeable": True,
"name": "QuantityPhraselist",
"phrases": "few,more,extra"
}
# add phrase list to app
phraseListId = client.features.add_phrase_list(app_id, versionId, phraseList)
# Get entity and subentities
modelObject = client.model.get_entity(app_id, versionId, modelId)
toppingQuantityId = get_grandchild_id(modelObject, "Toppings", "Quantity")
pizzaQuantityId = get_grandchild_id(modelObject, "Pizza", "Quantity")
# add model as feature to subentity model
prebuiltFeatureRequiredDefinition = { "model_name": "number", "is_required": True }
client.features.add_entity_feature(app_id, versionId, pizzaQuantityId, prebuiltFeatureRequiredDefinition)
# add model as feature to subentity model
prebuiltFeatureNotRequiredDefinition = { "model_name": "number" }
client.features.add_entity_feature(app_id, versionId, toppingQuantityId, prebuiltFeatureNotRequiredDefinition)
# add phrase list as feature to subentity model
phraseListFeatureDefinition = { "feature_name": "QuantityPhraselist", "model_name": None }
client.features.add_entity_feature(app_id, versionId, toppingQuantityId, phraseListFeatureDefinition)
Поместите следующий метод над методом quickstart
, чтобы определить идентификатор вложенной сущности Quantity для назначения ей функций.
def get_grandchild_id(model, childName, grandChildName):
theseChildren = next(filter((lambda child: child.name == childName), model.children))
theseGrandchildren = next(filter((lambda child: child.name == grandChildName), theseChildren.children))
grandChildId = theseGrandchildren.id
return grandChildId
Добавление примера высказывания в намерение
Чтобы определить намерение высказывания и извлечь сущности, приложению нужны примеры речевых фрагментов. Примеры должны быть нацелены на конкретное единственное намерение и должны отмечать все пользовательские объекты. Готовые объекты не нужно отмечать.
Добавьте примеры речевых фрагментов, создав список объектов ExampleLabelObject, по одному объекту для каждого примера высказывания. Каждый пример должен пометить все сущности словарем пар "имя — значение" имени и значения сущности. Значение сущности должно быть точно таким, как оно указано в тексте примера высказывания.
Вызовите examples.add с идентификатором приложения, идентификатором версии и примером.
# Define labeled example
labeledExampleUtteranceWithMLEntity = {
"text": "I want two small seafood pizzas with extra cheese.",
"intentName": intentName,
"entityLabels": [
{
"startCharIndex": 7,
"endCharIndex": 48,
"entityName": "Pizza order",
"children": [
{
"startCharIndex": 7,
"endCharIndex": 30,
"entityName": "Pizza",
"children": [
{
"startCharIndex": 7,
"endCharIndex": 9,
"entityName": "Quantity"
},
{
"startCharIndex": 11,
"endCharIndex": 15,
"entityName": "Size"
},
{
"startCharIndex": 17,
"endCharIndex": 23,
"entityName": "Type"
}]
},
{
"startCharIndex": 37,
"endCharIndex": 48,
"entityName": "Toppings",
"children": [
{
"startCharIndex": 37,
"endCharIndex": 41,
"entityName": "Quantity"
},
{
"startCharIndex": 43,
"endCharIndex": 48,
"entityName": "Type"
}]
}
]
}
]
}
print("Labeled Example Utterance:", labeledExampleUtteranceWithMLEntity)
# Add an example for the entity.
# Enable nested children to allow using multiple models with the same name.
# The quantity subentity and the phraselist could have the same exact name if this is set to True
client.examples.add(app_id, versionId, labeledExampleUtteranceWithMLEntity, { "enableNestedChildren": True })
Обучение приложения
После создания модели приложение LUIS необходимо обучить этой версии модели. Обученную модель можно использовать в контейнере или опубликовать в промежуточных или рабочих слотах.
Методу train.train_version требуется идентификатор приложения и идентификатор версии.
Очень маленькая модель, такая как в этом кратком руководстве, будет обучаться очень быстро. Обучение приложений рабочего уровня должно включать в себя вызов опроса с помощью метода get_status, чтобы определить, прошло ли обучение успешно. Ответ представляет собой список объектов ModelTrainingInfo с отдельным состоянием для каждого объекта. Все объекты должны быть успешно обучены, чтобы обучение считалось завершенным.
client.train.train_version(app_id, versionId)
waiting = True
while waiting:
info = client.train.get_status(app_id, versionId)
# get_status returns a list of training statuses, one for each model. Loop through them and make sure all are done.
waiting = any(map(lambda x: 'Queued' == x.details.status or 'InProgress' == x.details.status, info))
if waiting:
print ("Waiting 10 seconds for training to complete...")
time.sleep(10)
else:
print ("trained")
waiting = False
Публикация приложения в рабочий слот
Опубликуйте приложение LUIS с помощью метода app.publish. При этом публикуется текущая обученная версия в указанный слот в конечной точке. Ваше клиентское приложение использует эту конечную точку для отправки пользовательских высказываний для прогнозирования намерения и извлечения сущности.
# Mark the app as public so we can query it using any prediction endpoint.
# Note: For production scenarios, you should instead assign the app to your own LUIS prediction endpoint. See:
# https://docs.microsoft.com/en-gb/azure/cognitive-services/luis/luis-how-to-azure-subscription#assign-a-resource-to-an-app
client.apps.update_settings(app_id, is_public=True)
responseEndpointInfo = client.apps.publish(app_id, versionId, is_staging=False)
Аутентификация клиента среды выполнения прогнозирования
Используйте объект с помощью ключа и примените его со своей конечной точкой, чтобы создать объект LUISRuntimeClientConfiguration.
Внимание
В этом кратком руководстве ключ разработки используется как часть учетных данных среды выполнения. С его помощью можно выполнять некоторые запросы к среде выполнения. Для промежуточного и рабочего уровней кода замените ключ разработки ключом среды выполнения прогнозирования.
runtimeCredentials = CognitiveServicesCredentials(predictionKey)
clientRuntime = LUISRuntimeClient(endpoint=predictionEndpoint, credentials=runtimeCredentials)
Получение прогноза из среды выполнения
Добавьте следующий код, который создает запрос к среде выполнения прогнозирования.
Речевой фрагмент пользователя является частью объекта prediction_request.
Метод get_slot_prediction принимает для выполнения запроса несколько обязательных параметров, в том числе идентификатор приложения, имя слота и объект запроса прогнозирования. Есть еще несколько необязательных параметров, например для режимов подробного протоколирования, отображения всех намерений и ведения журнала. Запрос возвратит объект PredictionResponse.
# Production == slot name
predictionRequest = { "query" : "I want two small pepperoni pizzas with more salsa" }
predictionResponse = clientRuntime.prediction.get_slot_prediction(app_id, "Production", predictionRequest)
print("Top intent: {}".format(predictionResponse.prediction.top_intent))
print("Sentiment: {}".format (predictionResponse.prediction.sentiment))
print("Intents: ")
for intent in predictionResponse.prediction.intents:
print("\t{}".format (json.dumps (intent)))
print("Entities: {}".format (predictionResponse.prediction.entities))
Ответ с прогнозом — это объект JSON, содержащий намерение и все найденные сущности.
{
"query": "I want two small pepperoni pizzas with more salsa",
"prediction": {
"topIntent": "OrderPizzaIntent",
"intents": {
"OrderPizzaIntent": {
"score": 0.753606856
},
"None": {
"score": 0.119097039
}
},
"entities": {
"Pizza order": [
{
"Pizza": [
{
"Quantity": [
2
],
"Type": [
"pepperoni"
],
"Size": [
"small"
],
"$instance": {
"Quantity": [
{
"type": "builtin.number",
"text": "two",
"startIndex": 7,
"length": 3,
"score": 0.968156934,
"modelTypeId": 1,
"modelType": "Entity Extractor",
"recognitionSources": [
"model"
]
}
],
"Type": [
{
"type": "Type",
"text": "pepperoni",
"startIndex": 17,
"length": 9,
"score": 0.9345611,
"modelTypeId": 1,
"modelType": "Entity Extractor",
"recognitionSources": [
"model"
]
}
],
"Size": [
{
"type": "Size",
"text": "small",
"startIndex": 11,
"length": 5,
"score": 0.9592077,
"modelTypeId": 1,
"modelType": "Entity Extractor",
"recognitionSources": [
"model"
]
}
]
}
}
],
"Toppings": [
{
"Type": [
"salsa"
],
"Quantity": [
"more"
],
"$instance": {
"Type": [
{
"type": "Type",
"text": "salsa",
"startIndex": 44,
"length": 5,
"score": 0.7292897,
"modelTypeId": 1,
"modelType": "Entity Extractor",
"recognitionSources": [
"model"
]
}
],
"Quantity": [
{
"type": "Quantity",
"text": "more",
"startIndex": 39,
"length": 4,
"score": 0.9320932,
"modelTypeId": 1,
"modelType": "Entity Extractor",
"recognitionSources": [
"model"
]
}
]
}
}
],
"$instance": {
"Pizza": [
{
"type": "Pizza",
"text": "two small pepperoni pizzas",
"startIndex": 7,
"length": 26,
"score": 0.812199831,
"modelTypeId": 1,
"modelType": "Entity Extractor",
"recognitionSources": [
"model"
]
}
],
"Toppings": [
{
"type": "Toppings",
"text": "more salsa",
"startIndex": 39,
"length": 10,
"score": 0.7250252,
"modelTypeId": 1,
"modelType": "Entity Extractor",
"recognitionSources": [
"model"
]
}
]
}
}
],
"$instance": {
"Pizza order": [
{
"type": "Pizza order",
"text": "two small pepperoni pizzas with more salsa",
"startIndex": 7,
"length": 42,
"score": 0.769223332,
"modelTypeId": 1,
"modelType": "Entity Extractor",
"recognitionSources": [
"model"
]
}
]
}
}
}
}
Выполнение приложения
Запустите приложение, выполнив команду python
для файла quickstart.
python authoring_and_predict.py
В рамках этого руководства вы последовательно выполните три вызова REST.
- Во-первых, вы отправите пакет примеров речевых фрагментов, который будет использоваться для обучения модели приложения Пиццы с помощью вызова rest Batch add labels .
- Затем вы начнете сеанс обучения для приложения Pizza с помощью вызова версии приложения для обучения REST.
- Наконец, вы получите состояние сеанса обучения для приложения Pizza с помощью вызова состояния обучения для получения версии REST.
Необходимые компоненты
Учетная запись LUIS.
Текстовый редактор, например Visual Studio Code.
Программа командной строки cURL. Эта программа уже установлена в macOS, большинстве дистрибутивов Linux и Windows 10 сборки 1803 и более поздних версий.
Если вам нужно установить cURL, вы можете скачать эту программу на странице загрузки cURL.
Создание приложения Pizza
Создайте приложение Pizza.
- Щелкните pizza-app-for-luis-v6.json, чтобы открыть на сайте GitHub страницу с файлом
pizza-app-for-luis.json
. - Щелкните правой кнопкой мыши кнопку Raw (Необработанный) или коснитесь ее с задержкой и выберите Save link as (Сохранить ссылку как), чтобы сохранить
pizza-app-for-luis.json
на компьютере. - Войдите на портал LUIS.
- Щелкните My Apps (Мои приложения).
- На странице My Apps (Мои приложения) щелкните + New app for conversation (+ Новое приложение для общения).
- Щелкните Import as JSON (Импортировать как JSON).
- В диалоговом окне Import new app (Импорт нового приложения) нажмите кнопку Choose File (Выбрать файл).
- Выберите скачанный файл
pizza-app-for-luis.json
и щелкните Open (Открыть). - В диалоговом окне Import new app (Импорт нового приложения) в поле Name (Имя) введите имя приложения для заказа пиццы, а затем нажмите кнопку Done (Готово).
Приложение будет импортировано.
Если отобразится диалоговое окно How to create an effective LUIS app (Как создать эффективное приложение LUIS), закройте его.
Обучение и публикация приложения для заказа пиццы
Должна отобразиться страница Intents (Намерения) со списком намерений в приложении для заказа пиццы.
В верхней правой части веб-сайта LUIS нажмите кнопку Train (Обучить).
Обучение будет завершено, когда кнопка Обучение станет неактивной.
Чтобы получать результаты прогнозирования LUIS в чат-боте или других клиентских приложениях, необходимо опубликовать приложение в конечной точке прогнозирования.
Выберите Опубликовать на правой верхней панели навигации.
Выберите слот Рабочий и нажмите кнопку Готово.
Выберите Получить доступ к URL-адресам конечных точек в уведомлении, чтобы открыть страницу Ресурсы Azure. Вы будете видеть URL-адреса только в том случае, если с приложением связан ресурс для прогнозирования. Вы также можете перейти к странице Ресурсы Azure, щелкнув Управление.
Добавление ресурса разработки в приложение Pizza
- Щелкните MANAGE (Управление).
- Выберите Ресурсы Azure.
- Щелкните Authoring Resource (Ресурс разработки).
- Щелкните Change authoring resource (Изменить ресурс разработки).
Если у вас есть ресурс разработки, введите для него имя клиента, имя подписки и имя ресурса LUIS.
Если у вас нет ресурса разработки, сделайте следующее:
- Выберите Create new resource (Создать ресурс).
- Введите имя арендатора, имя ресурса, имя подписки и имя группы ресурсов Azure.
Теперь приложение для заказа пиццы можно использовать.
Запись значений доступа для приложения Pizza
Чтобы использовать новое приложение Pizza, вам потребуются его идентификатор, а также ключ и конечная точка разработки. Для получения прогнозов потребуется отдельная конечная точка прогнозирования и ключ прогнозирования.
Вот как найти эти значения:
- На странице Intents (Намерения) щелкните MANAGE (Управление).
- На странице Application Settings (Параметры приложения) запишите значение App ID (Идентификатор приложения).
- Выберите Ресурсы Azure.
- Щелкните Authoring Resource (Ресурс разработки).
- На вкладках Authoring Resource (Ресурс разработки) и Prediction Resources (Ресурсы прогнозирования) запишите первичный ключ. Это значение является ключом разработки.
- Скопируйте значение Endpoint URL (URL-адрес конечной точки). Это значение является конечной точкой разработки.
Создание файла JSON для обучения приложения Pizza
Чтобы создать файл JSON с тремя примерами речевых фрагментов, сохраните следующие данные JSON в файл с именем ExampleUtterances.JSON
:
[
{
"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
}
]
}
]`
Примеры речевых фрагментов JSON имеют определенный формат.
Поле text
содержит текст примера высказывания. Поле intentName
должно соответствовать имени существующего намерения в приложении LUIS. Поле entityLabels
является обязательным. Чтобы не помечать все сущности, укажите пустой массив.
Если массив entityLabels не пуст, startCharIndex
и endCharIndex
должны пометить сущность, указанную в поле entityName
. Значения индекса начинаются с нуля. Если вы начинаете или завершаете метку пробелом в тексте, вызов API для добавления фразы завершается ошибкой.
Добавление примеров высказываний
Чтобы отправить пакет примеров речевых фрагментов, скопируйте эту команду в текстовый редактор:
curl "***YOUR-AUTHORING-ENDPOINT***/luis/authoring/v3.0-preview/apps/***YOUR-APP-ID***/versions/***YOUR-APP-VERSION***/examples?verbose=true&show-all-intents=true" ^ --request POST ^ --header "Content-Type:application/json" ^ --header "Ocp-Apim-Subscription-Key: ***YOUR-AUTHORING-KEY***" ^ --data "@ExampleUtterances.JSON"
Замените значения, начинающиеся с
***YOUR-
, собственными значениями.Информация Характер использования ***YOUR-AUTHORING-ENDPOINT***
Конечная точка URL-адреса для разработки. Например, https://REPLACE-WITH-YOUR-RESOURCE-NAME.api.cognitive.microsoft.com/". Имя ресурса задается при создании ресурса. ***YOUR-APP-ID***
Идентификатор приложения LUIS. ***YOUR-APP-VERSION***
Версия приложения LUIS. Для приложения Pizza номером версии является 0.1 без кавычек. ***YOUR-AUTHORING-KEY***
Ключ для разработки (32 символа). Назначенные ключи и ресурсы отображаются на портале LUIS в разделе "Управление" на странице ресурсов Azure. Идентификатор приложения доступен в том же разделе "Управление" на странице Параметры приложения.
Внимание
Обязательно удалите ключ из кода, когда завершите работу, и ни в коем случае не публикуйте его в открытом доступе. Для рабочей среды используйте безопасный способ хранения и доступа к учетным данным, например Azure Key Vault. Дополнительные сведения см. в статье по безопасности служб ИИ Azure.
Запустите командную строку (Windows) или терминал (macOS и Linux) и перейдите в тот же каталог, в котором вы сохранили файл
ExampleUtterances.JSON
.Скопируйте команду cURL из редактора и вставьте ее в командную строку (Windows) или терминал (macOS и Linux). Нажмите клавишу "Ввод", чтобы выполнить команду.
Появится следующий ответ:
[{"value":{"ExampleId":1255129706,"UtteranceText":"order a pizza"},"hasError":false},{"value":{"ExampleId":1255129707,"UtteranceText":"order a large pepperoni pizza"},"hasError":false},{"value":{"ExampleId":1255129708,"UtteranceText":"i want two large pepperoni pizzas on thin crust"},"hasError":false}]
Ниже приведены выходные данные, отформатированные для удобочитаемости.
[ { "value": { "ExampleId": 1255129706, "UtteranceText": "order a pizza" }, "hasError": false }, { "value": { "ExampleId": 1255129707, "UtteranceText": "order a large pepperoni pizza" }, "hasError": false }, { "value": { "ExampleId": 1255129708, "UtteranceText": "i want two large pepperoni pizzas on thin crust" }, "hasError": false } ]
Обучение модели приложения Pizza
Чтобы начать сеанс обучения для приложения Pizza, скопируйте эту команду в текстовый редактор:
curl "***YOUR-AUTHORING-ENDPOINT***/luis/authoring/v3.0-preview/apps/***YOUR-APP-ID***/versions/***YOUR-APP-VERSION***/train?verbose=true&show-all-intents=true" ^ --data "" ^ --request POST ^ --header "Content-Type:application/json" ^ --header "Ocp-Apim-Subscription-Key: ***YOUR-AUTHORING-KEY***"
Как и раньше, замените значения, начинающиеся с
***YOUR-
, собственными значениями.Скопируйте команду cURL из редактора и вставьте ее в командную строку (Windows) или терминал (macOS и Linux). Нажмите клавишу "Ввод", чтобы выполнить команду.
Появится следующий ответ:
{"statusId":2,"status":"UpToDate"}
Ниже приведены выходные данные, отформатированные для удобочитаемости.
{ "statusId": 2, "status": "UpToDate" }
Получение состояния обучения
Чтобы получить состояние для сеанса обучения, скопируйте эту команду в текстовый редактор:
curl "***YOUR-AUTHORING-ENDPOINT***/luis/authoring/v3.0-preview/apps/***YOUR-APP-ID***/versions/***YOUR-APP-VERSION***/train?verbose=true&show-all-intents=true" ^ --request GET ^ --header "Content-Type:application/json" ^ --header "Ocp-Apim-Subscription-Key: ***YOUR-AUTHORING-KEY***"
Как и раньше, замените значения, начинающиеся с
***YOUR-
, собственными значениями.Скопируйте команду cURL из редактора и вставьте ее в командную строку (Windows) или терминал (macOS и Linux). Нажмите клавишу "Ввод", чтобы выполнить команду.
Появится следующий ответ:
[{"modelId":"8eb7ad8f-5db5-4c28-819b-ca3905fffd80","details":{"statusId":2,"status":"UpToDate","exampleCount":171}},{"modelId":"6f53bc92-ae54-44ce-bc4e-010d1f8cfda0","details":{"statusId":2,"status":"UpToDate","exampleCount":171}},{"modelId":"6cb17888-ad6e-464c-82c0-d37fd1f2c4f8","details":{"statusId":2,"status":"UpToDate","exampleCount":171}},{"modelId":"a16fc4fd-1949-4e77-9de3-30369f16c3a5","details":{"statusId":2,"status":"UpToDate","exampleCount":171}},{"modelId":"6bacdb75-1889-4f93-8971-8c8995ff8960","details":{"statusId":2,"status":"UpToDate","exampleCount":171}},{"modelId":"be963f4c-4898-48d7-9eba-3c6af0867b9d","details":{"statusId":2,"status":"UpToDate","exampleCount":171}}]
Ниже приведены выходные данные, отформатированные для удобочитаемости.
[ { "modelId": "8eb7ad8f-5db5-4c28-819b-ca3905fffd80", "details": { "statusId": 2, "status": "UpToDate", "exampleCount": 171 } }, { "modelId": "6f53bc92-ae54-44ce-bc4e-010d1f8cfda0", "details": { "statusId": 2, "status": "UpToDate", "exampleCount": 171 } }, { "modelId": "6cb17888-ad6e-464c-82c0-d37fd1f2c4f8", "details": { "statusId": 2, "status": "UpToDate", "exampleCount": 171 } }, { "modelId": "a16fc4fd-1949-4e77-9de3-30369f16c3a5", "details": { "statusId": 2, "status": "UpToDate", "exampleCount": 171 } }, { "modelId": "6bacdb75-1889-4f93-8971-8c8995ff8960", "details": { "statusId": 2, "status": "UpToDate", "exampleCount": 171 } }, { "modelId": "be963f4c-4898-48d7-9eba-3c6af0867b9d", "details": { "statusId": 2, "status": "UpToDate", "exampleCount": 171 } } ]
Получение намерений из конечной точки прогноза
Используйте cURL, чтобы запросить конечную точку прогнозирования и получить результат.
Примечание.
Эта команда использует конечную точку прогнозирования.
Скопируйте эту команду в текстовый редактор.
curl "https://***YOUR-PREDICTION-ENDPOINT***/luis/prediction/v3.0/apps/***YOUR-APP-ID***/slots/production/predict" ^ --request GET ^ --get ^ --data "subscription-key=***YOUR-PREDICTION-KEY***" ^ --data "verbose=true" ^ --data "show-all-intents=true" ^ --data-urlencode "query=I want two large pepperoni pizzas on thin crust please"
Замените значения, начинающиеся с
***YOUR-
, собственными значениями.Информация Характер использования ***YOUR-PREDICTION-ENDPOINT***
Конечная точка URL-адреса прогнозирования. Находится на портале LUIS на странице "Azure Resources" (Ресурсы Azure) для приложения.
Например,https://westus.api.cognitive.microsoft.com/
.***YOUR-APP-ID***
Идентификатор приложения. Находится на портале LUIS на странице "Application Settings" (Параметры приложения) для приложения. ***YOUR-PREDICTION-KEY***
Ваш ключ прогнозирования длиной в 32 символа. Находится на портале LUIS на странице "Azure Resources" (Ресурсы Azure) для приложения. Скопируйте текст в окно консоли и нажмите клавишу ВВОД, чтобы выполнить команду.
Проверьте ответ прогноза, который возвращается в формате JSON:
{"query":"I want two large pepperoni pizzas on thin crust please","prediction":{"topIntent":"ModifyOrder","intents":{"ModifyOrder":{"score":1.0},"None":{"score":8.55E-09},"Greetings":{"score":1.82222226E-09},"CancelOrder":{"score":1.47272727E-09},"Confirmation":{"score":9.8125E-10}},"entities":{"Order":[{"FullPizzaWithModifiers":[{"PizzaType":["pepperoni pizzas"],"Size":[["Large"]],"Quantity":[2],"Crust":[["Thin"]],"$instance":{"PizzaType":[{"type":"PizzaType","text":"pepperoni pizzas","startIndex":17,"length":16,"score":0.9978157,"modelTypeId":1,"modelType":"Entity Extractor","recognitionSources":["model"]}],"Size":[{"type":"SizeList","text":"large","startIndex":11,"length":5,"score":0.9984481,"modelTypeId":1,"modelType":"Entity Extractor","recognitionSources":["model"]}],"Quantity":[{"type":"builtin.number","text":"two","startIndex":7,"length":3,"score":0.999770939,"modelTypeId":1,"modelType":"Entity Extractor","recognitionSources":["model"]}],"Crust":[{"type":"CrustList","text":"thin crust","startIndex":37,"length":10,"score":0.933985531,"modelTypeId":1,"modelType":"Entity Extractor","recognitionSources":["model"]}]}}],"$instance":{"FullPizzaWithModifiers":[{"type":"FullPizzaWithModifiers","text":"two large pepperoni pizzas on thin crust","startIndex":7,"length":40,"score":0.90681237,"modelTypeId":1,"modelType":"Entity Extractor","recognitionSources":["model"]}]}}],"ToppingList":[["Pepperoni"]],"$instance":{"Order":[{"type":"Order","text":"two large pepperoni pizzas on thin crust","startIndex":7,"length":40,"score":0.9047088,"modelTypeId":1,"modelType":"Entity Extractor","recognitionSources":["model"]}],"ToppingList":[{"type":"ToppingList","text":"pepperoni","startIndex":17,"length":9,"modelTypeId":5,"modelType":"List Entity Extractor","recognitionSources":["model"]}]}}}}
Ответ JSON, отформатированный для удобочитаемости:
{ "query": "I want two large pepperoni pizzas on thin crust please", "prediction": { "topIntent": "ModifyOrder", "intents": { "ModifyOrder": { "score": 1.0 }, "None": { "score": 8.55e-9 }, "Greetings": { "score": 1.82222226e-9 }, "CancelOrder": { "score": 1.47272727e-9 }, "Confirmation": { "score": 9.8125e-10 } }, "entities": { "Order": [ { "FullPizzaWithModifiers": [ { "PizzaType": [ "pepperoni pizzas" ], "Size": [ [ "Large" ] ], "Quantity": [ 2 ], "Crust": [ [ "Thin" ] ], "$instance": { "PizzaType": [ { "type": "PizzaType", "text": "pepperoni pizzas", "startIndex": 17, "length": 16, "score": 0.9978157, "modelTypeId": 1, "modelType": "Entity Extractor", "recognitionSources": [ "model" ] } ], "Size": [ { "type": "SizeList", "text": "large", "startIndex": 11, "length": 5, "score": 0.9984481, "modelTypeId": 1, "modelType": "Entity Extractor", "recognitionSources": [ "model" ] } ], "Quantity": [ { "type": "builtin.number", "text": "two", "startIndex": 7, "length": 3, "score": 0.999770939, "modelTypeId": 1, "modelType": "Entity Extractor", "recognitionSources": [ "model" ] } ], "Crust": [ { "type": "CrustList", "text": "thin crust", "startIndex": 37, "length": 10, "score": 0.933985531, "modelTypeId": 1, "modelType": "Entity Extractor", "recognitionSources": [ "model" ] } ] } } ], "$instance": { "FullPizzaWithModifiers": [ { "type": "FullPizzaWithModifiers", "text": "two large pepperoni pizzas on thin crust", "startIndex": 7, "length": 40, "score": 0.90681237, "modelTypeId": 1, "modelType": "Entity Extractor", "recognitionSources": [ "model" ] } ] } } ], "ToppingList": [ [ "Pepperoni" ] ], "$instance": { "Order": [ { "type": "Order", "text": "two large pepperoni pizzas on thin crust", "startIndex": 7, "length": 40, "score": 0.9047088, "modelTypeId": 1, "modelType": "Entity Extractor", "recognitionSources": [ "model" ] } ], "ToppingList": [ { "type": "ToppingList", "text": "pepperoni", "startIndex": 17, "length": 9, "modelTypeId": 5, "modelType": "List Entity Extractor", "recognitionSources": [ "model" ] } ] } } } }
Очистка ресурсов
Вы можете удалить приложение на портале LUIS, а ресурсы Azure на портале Azure.
Если вы используете REST API, удалите файл ExampleUtterances.JSON
из файловой системы, когда завершите работу с кратким руководством.
Устранение неполадок
- Проверка подлинности в клиентской библиотеке. Ошибки проверки подлинности обычно указывают на использование неправильного ключа и конечной точки. В этом кратком руководстве для удобства используется ключ и конечная точка для среды выполнения прогнозирования, но они будут работать только в том случае, если вы еще не исчерпали месячную квоту. Если вы не можете использовать ключ и конечную точку для разработки, при доступе к клиентской библиотеке пакета SDK среды выполнения прогнозирования необходимо использовать ключ и конечную точку для этой среды.
- Создание сущностей. В случае ошибки при создании вложенной сущности машинного обучения, используемой в рамках этого учебника, необходимо скопировать код и создать на его основе другую сущность без внесения каких-либо изменений в этот код.
- Создание примеров речевых фрагментов. В случае ошибки при создании маркированного примера речевого фрагмента, используемого в рамках этого учебника, необходимо скопировать код и создать на его основе другой маркированный пример без внесения каких-либо изменений в этот код.
- Обучение. Если вы получаете сообщение об ошибке обучения, это обычно указывает на то, что приложение пустое (нет намерений с примерами речевых фрагментов) либо содержит намерения или сущности в неправильном формате.
- Прочие ошибки. Поскольку код выполняет вызовы в клиентские библиотеки с помощью текста и JSON-объектов, убедитесь, что код не был изменен.
Другие ошибки. Если вы получаете сообщение об ошибке, не указанной выше, сообщите нам, оставив отзыв в нижней части этой страницы. Укажите язык программирования и версию установленных клиентских библиотек.