Изменение модели LUIS с помощью REST API

Внимание

LUIS будет прекращена 1 октября 2025 г. и с 1 апреля 2023 г. вы не сможете создать новые ресурсы LUIS. Мы рекомендуем перенести приложения LUIS в понимание общения, чтобы воспользоваться продолжением поддержки продуктов и многоязычными возможностями.

В этой статье показано, как добавить речевые фрагменты в приложение Pizza и обучить его. Примерами высказываний называют фразы пользователя на обычном языке, сопоставленные с тем или иным намерением. Предоставляя фразы для настроенных намерений, вы сообщаете 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.

  1. Щелкните pizza-app-for-luis-v6.json, чтобы открыть на сайте GitHub страницу с файлом pizza-app-for-luis.json.
  2. Щелкните правой кнопкой мыши кнопку Raw (Необработанный) или коснитесь ее с задержкой и выберите Save link as (Сохранить ссылку как), чтобы сохранить pizza-app-for-luis.json на компьютере.
  3. Войдите на портал LUIS.
  4. Щелкните My Apps (Мои приложения).
  5. На странице My Apps (Мои приложения) щелкните + New app for conversation (+ Новое приложение для общения).
  6. Щелкните Import as JSON (Импортировать как JSON).
  7. В диалоговом окне Import new app (Импорт нового приложения) нажмите кнопку Choose File (Выбрать файл).
  8. Выберите скачанный файл pizza-app-for-luis.json и щелкните Open (Открыть).
  9. В диалоговом окне Import new app (Импорт нового приложения) в поле Name (Имя) введите имя приложения для заказа пиццы, а затем нажмите кнопку Done (Готово).

Приложение будет импортировано.

Если отобразится диалоговое окно How to create an effective LUIS app (Как создать эффективное приложение LUIS), закройте его.

Обучение и публикация приложения для заказа пиццы

Должна отобразиться страница Intents (Намерения) со списком намерений в приложении для заказа пиццы.

  1. В верхней правой части веб-сайта LUIS нажмите кнопку Train (Обучить).

    Кнопка обучения

  2. Обучение будет завершено, когда кнопка Обучение станет неактивной.

Чтобы получать результаты прогнозирования LUIS в чат-боте или других клиентских приложениях, необходимо опубликовать приложение в конечной точке прогнозирования.

  1. Выберите Опубликовать на правой верхней панели навигации.

    Снимок экрана: кнопка публикации в конечную точку.

  2. Выберите слот Рабочий и нажмите кнопку Готово.

    Снимок экрана: публикация LUIS в конечную точку.

  3. Выберите Получить доступ к URL-адресам конечных точек в уведомлении, чтобы открыть страницу Ресурсы Azure. Вы будете видеть URL-адреса только в том случае, если с приложением связан ресурс для прогнозирования. Вы также можете перейти к странице Ресурсы Azure, щелкнув Управление.

    Снимок экрана: сообщение об успешной публикации приложения.

Добавление ресурса разработки в приложение Pizza

  1. Щелкните MANAGE (Управление).
  2. Выберите Ресурсы Azure.
  3. Щелкните Authoring Resource (Ресурс разработки).
  4. Щелкните Change authoring resource (Изменить ресурс разработки).

Если у вас есть ресурс разработки, введите для него имя клиента, имя подписки и имя ресурса LUIS.

Если у вас нет ресурса разработки, сделайте следующее:

  1. Выберите Create new resource (Создать ресурс).
  2. Введите имя арендатора, имя ресурса, имя подписки и имя группы ресурсов Azure.

Теперь приложение для заказа пиццы можно использовать.

Запись значений доступа для приложения Pizza

Чтобы использовать новое приложение Pizza, вам потребуются его идентификатор, а также ключ и конечная точка разработки. Для получения прогнозов потребуется отдельная конечная точка прогнозирования и ключ прогнозирования.

Вот как найти эти значения:

  1. На странице Intents (Намерения) щелкните MANAGE (Управление).
  2. На странице Application Settings (Параметры приложения) запишите значение App ID (Идентификатор приложения).
  3. Выберите Ресурсы Azure.
  4. Щелкните Authoring Resource (Ресурс разработки).
  5. На вкладках Authoring Resource (Ресурс разработки) и Prediction Resources (Ресурсы прогнозирования) запишите первичный ключ. Это значение является ключом разработки.
  6. Скопируйте значение Endpoint URL (URL-адрес конечной точки). Это значение является конечной точкой разработки.

Изменение модели программными средствами

  1. Создайте консольное приложение для языка C# с проектом и именем папки csharp-model-with-rest.

    dotnet new console -lang C# -n csharp-model-with-rest
    
  2. Перейдите в созданный каталог csharp-model-with-rest и установите необходимые зависимости с помощью следующих команд:

    cd csharp-model-with-rest
    dotnet add package System.Net.Http
    dotnet add package JsonFormatterPlus
    
  3. Перезапишите содержимое файла 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 www.luis.ai 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.com/"
            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();
            }
        }
    }
    
  4. Замените значения, начинающиеся с YOUR-, собственными значениями.

    Информация Характер использования
    YOUR-APP-ID Идентификатор приложения LUIS.
    YOUR-AUTHORING-KEY Ключ для разработки (32 символа).
    YOUR-AUTHORING-ENDPOINT Конечная точка URL-адреса для разработки. Например, https://replace-with-your-resource-name.api.cognitive.microsoft.com/. Имя ресурса задается при создании ресурса.

    Назначенные ключи и ресурсы отображаются на портале LUIS в разделе "Управление" на странице ресурсов Azure. Идентификатор приложения доступен в том же разделе "Управление" на странице Параметры приложения.

    Внимание

    Обязательно удалите ключ из кода, когда завершите работу, и ни в коем случае не публикуйте его в открытом доступе. Для рабочей среды используйте безопасный способ хранения и доступа к учетным данным, например Azure Key Vault. Дополнительные сведения см. в статье по безопасности служб ИИ Azure.

  5. Постройте консольное приложение.

    dotnet build
    
  6. Запустите консольное приложение.

    dotnet run
    
  7. Просмотрите ответ разработки.

    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, выпуск Standard)
  • 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
      }
    ]
  }
]

Изменение модели программными средствами

  1. Создайте новую папку для размещения проекта Node.js, например java-model-with-rest.

  2. Создайте подкаталог с именем lib и скопируйте в его подкаталог lib следующие библиотеки Java:

  3. Создайте файл с именем 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 www.luis.ai 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.com/"
                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());
            }
        }
    }
    
  4. Замените значения, начинающиеся с YOUR-, собственными значениями.

    Информация Характер использования
    YOUR-APP-ID Идентификатор приложения LUIS.
    YOUR-AUTHORING-KEY Ключ для разработки (32 символа).
    YOUR-AUTHORING-ENDPOINT Конечная точка URL-адреса для разработки. Например, https://replace-with-your-resource-name.api.cognitive.microsoft.com/. Имя ресурса задается при создании ресурса.

    Назначенные ключи и ресурсы отображаются на портале LUIS в разделе "Управление" на странице ресурсов Azure. Идентификатор приложения доступен в том же разделе "Управление" на странице Параметры приложения.

    Внимание

    Обязательно удалите ключ из кода, когда завершите работу, и ни в коем случае не публикуйте его в открытом доступе. Для рабочей среды используйте безопасный способ хранения и доступа к учетным данным, например Azure Key Vault. Дополнительные сведения см. в статье по безопасности служб ИИ Azure.

  5. В командной строке каталога, в котором вы создали файл Model.java, введите следующую команду, чтобы скомпилировать файл Java:

    • В Windows выполните следующую команду: javac -cp ";lib/*" Model.java.
    • В macOS и Linux выполните следующую команду: javac -cp ":lib/*" Model.java.
  6. Запустите приложение Java из командной строки, введя следующий текст:

    • В Windows выполните следующую команду: java -cp ";lib/*" Model.
    • В macOS и Linux выполните следующую команду: java -cp ":lib/*" Model.
  7. Просмотрите ответ разработки.

    [{"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"
        }
      }
    ]
    

Очистка ресурсов

Завершив работу с этим кратким руководством, удалите папку проекта из файловой системы.

Следующие шаги

Рекомендации для приложения

Справочная документация | Пример

Необходимые компоненты

Файл 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.

  1. Щелкните pizza-app-for-luis-v6.json, чтобы открыть на сайте GitHub страницу с файлом pizza-app-for-luis.json.
  2. Щелкните правой кнопкой мыши кнопку Raw (Необработанный) или коснитесь ее с задержкой и выберите Save link as (Сохранить ссылку как), чтобы сохранить pizza-app-for-luis.json на компьютере.
  3. Войдите на портал LUIS.
  4. Щелкните My Apps (Мои приложения).
  5. На странице My Apps (Мои приложения) щелкните + New app for conversation (+ Новое приложение для общения).
  6. Щелкните Import as JSON (Импортировать как JSON).
  7. В диалоговом окне Import new app (Импорт нового приложения) нажмите кнопку Choose File (Выбрать файл).
  8. Выберите скачанный файл pizza-app-for-luis.json и щелкните Open (Открыть).
  9. В диалоговом окне Import new app (Импорт нового приложения) в поле Name (Имя) введите имя приложения для заказа пиццы, а затем нажмите кнопку Done (Готово).

Приложение будет импортировано.

Если отобразится диалоговое окно How to create an effective LUIS app (Как создать эффективное приложение LUIS), закройте его.

Обучение и публикация приложения для заказа пиццы

Должна отобразиться страница Intents (Намерения) со списком намерений в приложении для заказа пиццы.

  1. В верхней правой части веб-сайта LUIS нажмите кнопку Train (Обучить).

    Кнопка обучения

  2. Обучение будет завершено, когда кнопка Обучение станет неактивной.

Чтобы получать результаты прогнозирования LUIS в чат-боте или других клиентских приложениях, необходимо опубликовать приложение в конечной точке прогнозирования.

  1. Выберите Опубликовать на правой верхней панели навигации.

    Снимок экрана: кнопка публикации в конечную точку.

  2. Выберите слот Рабочий и нажмите кнопку Готово.

    Снимок экрана: публикация LUIS в конечную точку.

  3. Выберите Получить доступ к URL-адресам конечных точек в уведомлении, чтобы открыть страницу Ресурсы Azure. Вы будете видеть URL-адреса только в том случае, если с приложением связан ресурс для прогнозирования. Вы также можете перейти к странице Ресурсы Azure, щелкнув Управление.

    Снимок экрана: сообщение об успешной публикации приложения.

Добавление ресурса разработки в приложение Pizza

  1. Щелкните MANAGE (Управление).
  2. Выберите Ресурсы Azure.
  3. Щелкните Authoring Resource (Ресурс разработки).
  4. Щелкните Change authoring resource (Изменить ресурс разработки).

Если у вас есть ресурс разработки, введите для него имя клиента, имя подписки и имя ресурса LUIS.

Если у вас нет ресурса разработки, сделайте следующее:

  1. Выберите Create new resource (Создать ресурс).
  2. Введите имя арендатора, имя ресурса, имя подписки и имя группы ресурсов Azure.

Теперь приложение для заказа пиццы можно использовать.

Запись значений доступа для приложения Pizza

Чтобы использовать новое приложение Pizza, вам потребуются его идентификатор, а также ключ и конечная точка разработки. Для получения прогнозов потребуется отдельная конечная точка прогнозирования и ключ прогнозирования.

Вот как найти эти значения:

  1. На странице Intents (Намерения) щелкните MANAGE (Управление).
  2. На странице Application Settings (Параметры приложения) запишите значение App ID (Идентификатор приложения).
  3. Выберите Ресурсы Azure.
  4. Щелкните Authoring Resource (Ресурс разработки).
  5. На вкладках Authoring Resource (Ресурс разработки) и Prediction Resources (Ресурсы прогнозирования) запишите первичный ключ. Это значение является ключом разработки.
  6. Скопируйте значение Endpoint URL (URL-адрес конечной точки). Это значение является конечной точкой разработки.

Изменение модели программными средствами

  1. Создайте файл с именем 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 www.luis.ai 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.com/"
        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))
        }
    }
    
  2. Замените значения, начинающиеся с YOUR-, собственными значениями.

    Информация Характер использования
    YOUR-APP-ID Идентификатор приложения LUIS.
    YOUR-AUTHORING-KEY Ключ для разработки (32 символа).
    YOUR-AUTHORING-ENDPOINT Конечная точка URL-адреса для разработки. Например, https://replace-with-your-resource-name.api.cognitive.microsoft.com/. Имя ресурса задается при создании ресурса.

    Назначенные ключи и ресурсы отображаются на портале LUIS в разделе "Управление" на странице ресурсов Azure. Идентификатор приложения доступен в том же разделе "Управление" на странице Параметры приложения.

    Внимание

    Обязательно удалите ключ из кода, когда завершите работу, и ни в коем случае не публикуйте его в открытом доступе. Для рабочей среды используйте безопасный способ хранения и доступа к учетным данным, например Azure Key Vault. Дополнительные сведения см. в статье по безопасности служб ИИ Azure.

  3. В командной строке в каталоге, в котором вы создали файл, введите следующую команду, чтобы скомпилировать файл Go:

    go build model.go
    
  4. Запустите приложение Go из командной строки, введя следующий текст:

    go run model.go
    
  5. Просмотрите ответ разработки.

    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

  1. Создайте папку для размещения проекта Node.js, например node-model-with-rest.

  2. Откройте новое окно командной строки, перейдите в только что созданный каталог и введите следующую команду:

    npm init
    

    В ответ на каждый запрос нажимайте клавишу ВВОД, чтобы подтвердить значения по умолчанию.

  3. Установите модуль "запрос-обещание", выполнив в командной строке следующую команду:

    npm install --save request
    npm install --save request-promise
    npm install --save querystring
    

Изменение модели программными средствами

  1. Создайте файл с именем 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 www.luis.ai 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.com/"
    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));
    
  2. Замените значения, начинающиеся с YOUR-, собственными значениями.

    Информация Характер использования
    YOUR-APP-ID Идентификатор приложения LUIS.
    YOUR-AUTHORING-KEY Ключ для разработки (32 символа).
    YOUR-AUTHORING-ENDPOINT Конечная точка URL-адреса для разработки. Например, https://replace-with-your-resource-name.api.cognitive.microsoft.com/. Имя ресурса задается при создании ресурса.

    Назначенные ключи и ресурсы отображаются на портале LUIS в разделе "Управление" на странице ресурсов Azure. Идентификатор приложения доступен в том же разделе "Управление" на странице Параметры приложения.

    Внимание

    Обязательно удалите ключ из кода, когда завершите работу, и ни в коем случае не публикуйте его в открытом доступе. Для рабочей среды используйте безопасный способ хранения и доступа к учетным данным, например Azure Key Vault. Дополнительные сведения см. в статье по безопасности служб ИИ Azure.

  3. В командной строке введите следующую команду, чтобы запустить проект:

    node model.js
    
  4. Просмотрите ответ разработки.

    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
    

Очистка ресурсов

Завершив работу с этим кратким руководством, удалите папку проекта из файловой системы.

Следующие шаги

Рекомендации для приложения

Справочная документация | Пример

Необходимые компоненты

Файл 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.

  1. Щелкните pizza-app-for-luis-v6.json, чтобы открыть на сайте GitHub страницу с файлом pizza-app-for-luis.json.
  2. Щелкните правой кнопкой мыши кнопку Raw (Необработанный) или коснитесь ее с задержкой и выберите Save link as (Сохранить ссылку как), чтобы сохранить pizza-app-for-luis.json на компьютере.
  3. Войдите на портал LUIS.
  4. Щелкните My Apps (Мои приложения).
  5. На странице My Apps (Мои приложения) щелкните + New app for conversation (+ Новое приложение для общения).
  6. Щелкните Import as JSON (Импортировать как JSON).
  7. В диалоговом окне Import new app (Импорт нового приложения) нажмите кнопку Choose File (Выбрать файл).
  8. Выберите скачанный файл pizza-app-for-luis.json и щелкните Open (Открыть).
  9. В диалоговом окне Import new app (Импорт нового приложения) в поле Name (Имя) введите имя приложения для заказа пиццы, а затем нажмите кнопку Done (Готово).

Приложение будет импортировано.

Если отобразится диалоговое окно How to create an effective LUIS app (Как создать эффективное приложение LUIS), закройте его.

Обучение и публикация приложения для заказа пиццы

Должна отобразиться страница Intents (Намерения) со списком намерений в приложении для заказа пиццы.

  1. В верхней правой части веб-сайта LUIS нажмите кнопку Train (Обучить).

    Кнопка обучения

  2. Обучение будет завершено, когда кнопка Обучение станет неактивной.

Чтобы получать результаты прогнозирования LUIS в чат-боте или других клиентских приложениях, необходимо опубликовать приложение в конечной точке прогнозирования.

  1. Выберите Опубликовать на правой верхней панели навигации.

    Снимок экрана: кнопка публикации в конечную точку.

  2. Выберите слот Рабочий и нажмите кнопку Готово.

    Снимок экрана: публикация LUIS в конечную точку.

  3. Выберите Получить доступ к URL-адресам конечных точек в уведомлении, чтобы открыть страницу Ресурсы Azure. Вы будете видеть URL-адреса только в том случае, если с приложением связан ресурс для прогнозирования. Вы также можете перейти к странице Ресурсы Azure, щелкнув Управление.

    Снимок экрана: сообщение об успешной публикации приложения.

Добавление ресурса разработки в приложение Pizza

  1. Щелкните MANAGE (Управление).
  2. Выберите Ресурсы Azure.
  3. Щелкните Authoring Resource (Ресурс разработки).
  4. Щелкните Change authoring resource (Изменить ресурс разработки).

Если у вас есть ресурс разработки, введите для него имя клиента, имя подписки и имя ресурса LUIS.

Если у вас нет ресурса разработки, сделайте следующее:

  1. Выберите Create new resource (Создать ресурс).
  2. Введите имя арендатора, имя ресурса, имя подписки и имя группы ресурсов Azure.

Теперь приложение для заказа пиццы можно использовать.

Запись значений доступа для приложения Pizza

Чтобы использовать новое приложение Pizza, вам потребуются его идентификатор, а также ключ и конечная точка разработки. Для получения прогнозов потребуется отдельная конечная точка прогнозирования и ключ прогнозирования.

Вот как найти эти значения:

  1. На странице Intents (Намерения) щелкните MANAGE (Управление).
  2. На странице Application Settings (Параметры приложения) запишите значение App ID (Идентификатор приложения).
  3. Выберите Ресурсы Azure.
  4. Щелкните Authoring Resource (Ресурс разработки).
  5. На вкладках Authoring Resource (Ресурс разработки) и Prediction Resources (Ресурсы прогнозирования) запишите первичный ключ. Это значение является ключом разработки.
  6. Скопируйте значение Endpoint URL (URL-адрес конечной точки). Это значение является конечной точкой разработки.

Изменение модели программными средствами

  1. Создайте файл с именем 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 www.luis.ai 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.com/"
        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}')
    
  2. Замените значения, начинающиеся с YOUR-, собственными значениями.

    Информация Характер использования
    YOUR-APP-ID Идентификатор приложения LUIS.
    YOUR-AUTHORING-KEY Ключ для разработки (32 символа).
    YOUR-AUTHORING-ENDPOINT Конечная точка URL-адреса для разработки. Например, https://replace-with-your-resource-name.api.cognitive.microsoft.com/. Имя ресурса задается при создании ресурса.

    Назначенные ключи и ресурсы отображаются на портале LUIS в разделе "Управление" на странице ресурсов Azure. Идентификатор приложения доступен в том же разделе "Управление" на странице Параметры приложения.

    Внимание

    Обязательно удалите ключ из кода, когда завершите работу, и ни в коем случае не публикуйте его в открытом доступе. Для рабочей среды используйте безопасный способ хранения и доступа к учетным данным, например Azure Key Vault. Дополнительные сведения см. в статье по безопасности служб ИИ Azure.

  3. В командной строке каталога, в котором вы создали файл, введите следующую команду, чтобы запустить этот файл:

    python model.py
    
  4. Просмотрите ответ разработки.

    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'
        }
      }
    ]
    

Очистка ресурсов

По завершении работы с этим кратким руководством удалите файл из файловой системы.

Следующие шаги

Рекомендации для приложения