Início Rápido: Bibliotecas de clientes do LUIS (Reconhecimento vocal) e API REST

Importante

O LUIS será desativado em 1º de outubro de 2025 e, a partir de 1º de abril de 2023, você não poderá criar novos recursos do LUIS. É recomendável migrar seus aplicativos LUIS para a compreensão da linguagem coloquial a fim de usufruir do suporte contínuo ao produto e dos recursos multilíngues.

Crie e consulte um aplicativo de IA (inteligência artificial) do com as bibliotecas de clientes do SDK do Azure LUIS com este guia de início rápido usando C#, Python ou JavaScript. Você também pode usar a cURL para enviar solicitações usando a API REST.

O LUIS (Reconhecimento Vocal) permite aplicar o NLP (processamento de idioma natural) a um texto de idioma natural de conversa do usuário para prever o significado geral e extrair informações detalhadas relevantes.

  • A biblioteca de clientes de criação e a API REST permitem a você criar, editar, treinar e publicar o aplicativo do LUIS.
  • A biblioteca de clientes do runtime de previsão e a API REST permitem que você consulte o aplicativo publicado.

Use as bibliotecas de clientes do LUIS (Reconhecimento Vocal) para .NET para:

  • Criar um aplicativo
  • Adicionar uma intenção e uma entidade com machine learning com um exemplo de enunciado
  • Treinar e publicar o aplicativo
  • Runtime de previsão da consulta

Documentação de referência | Criação e Previsão Código-fonte da biblioteca | NuGet de Criação e Previsão | Exemplo de C#

Pré-requisitos

  • A versão atual do .NET Core e da CLI do .NET Core.
  • Assinatura do Azure – Criar uma gratuitamente
  • Quando você tiver sua assinatura do Azure, crie um recurso de criação do Reconhecimento vocal no portal do Azure para obter a chave e o ponto de extremidade. Aguarde até que ele seja implantado e clique no botão Ir para o recurso.
    • Você precisará da chave e do ponto de extremidade do recurso que você criar para conectar seu aplicativo à criação do Reconhecimento vocal. Cole a chave e o ponto de extremidade no código abaixo mais adiante no guia de início rápido. Você pode usar o tipo de preço gratuito (F0) para experimentar o serviço.

Configurando

Criar um aplicativo em C#

Crie um novo aplicativo .NET Core em seu IDE ou editor preferido.

  1. Em uma janela de console (como cmd, PowerShell ou Bash), use o comando new para criar um novo aplicativo do console com o nome language-understanding-quickstart. Esse comando cria um projeto simples em C# do tipo "Olá, Mundo" com um arquivo de origem único: Program.cs.

    dotnet new console -n language-understanding-quickstart
    
  2. Altere o diretório para a pasta do aplicativo recém-criado.

    cd language-understanding-quickstart
    
  3. É possível criar o aplicativo com:

    dotnet build
    

    A saída de compilação não deve conter nenhum aviso ou erro.

    ...
    Build succeeded.
     0 Warning(s)
     0 Error(s)
    ...
    

Instalar as bibliotecas NuGet

Dentro do diretório do aplicativo, instale a biblioteca de clientes do LUIS (Reconhecimento Vocal) para .NET com os seguintes comandos:

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

Modelo de Objeto de Criação

O cliente de criação do LUIS (Reconhecimento Vocal) é um objeto LUISAuthoringClient que se autentica no Azure, que contém sua chave de criação.

Exemplos de código para criação

Depois que o cliente for criado, use-o para acessar a funcionalidade, incluindo:

Modelo de Objeto de Previsão

O cliente de runtime de previsão do LUIS (Reconhecimento Vocal) é um objeto LUISRuntimeClient que se autentica no Azure, que contém sua chave de recurso.

Exemplos de código para runtime de previsão

Depois que o cliente for criado, use-o para acessar a funcionalidade, incluindo:

Exemplos de código

Estes snippets de códigos mostram como realizar as seguintes ações com a biblioteca de clientes do LUIS (Reconhecimento Vocal) para Python:

Adicionar as dependências

No diretório do projeto, abra o arquivo Program.cs no IDE ou no editor de sua preferência. Substitua o código using existente pelas seguintes diretivas de 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;

Adicionar o código clichê

  1. Altere a assinatura do método Main para permitir chamadas assíncronas:

    public static async Task Main()
    
  2. Adicione o restante do código no método Main da classe Program, a menos que especificado de outra forma.

Criar variáveis para o aplicativo

Crie dois conjuntos de variáveis: o primeiro conjunto, você vai alterar; o segundo, você vai deixar como ele aparece no exemplo de código.

Importante

Lembre-se de remover a chave do seu código quando terminar e nunca poste-a publicamente. Para produção, use uma maneira segura de armazenar e acessar suas credenciais, como o Azure Key Vault. Consulte o artigo sobre segurança do serviços de IA do Azure para obter mais informações.

  1. Crie variáveis para manter a chave de criação e os nomes do recurso.

    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";
    
  2. Crie variáveis para armazenar os pontos de extremidade, o nome do aplicativo, a versão e o nome da intenção.

    var appName = "Contoso Pizza Company";
    var versionId = "0.1";
    var intentName = "OrderPizzaIntent";
    

Autenticar o cliente

Crie um objeto ApiKeyServiceClientCredentials com a sua chave e use-o com o ponto de extremidade para criar um objeto LUISAuthoringClient.

var credentials = new Microsoft.Azure.CognitiveServices.Language.LUIS.Authoring.ApiKeyServiceClientCredentials(key);
var client = new LUISAuthoringClient(credentials) { Endpoint = authoringEndpoint };

Criar um aplicativo LUIS

Um aplicativo LUIS contém o modelo de NLP (processamento em idioma natural), incluindo intenções, entidades e exemplos de enunciados.

Crie um ApplicationCreateObject. O nome e a cultura do idioma são propriedades obrigatórias. Chame o método Apps.AddAsync. A resposta é a ID do aplicativo.

var newApp = new ApplicationCreateObject
{
    Culture = "en-us",
    Name = appName,
    InitialVersionId = versionId
};

var appId = await client.Apps.AddAsync(newApp);

Criar intenção para o aplicativo

O objeto principal no modelo de um aplicativo do LUIS é a intenção. A intenção se alinha com um agrupamento de intenções de enunciado do usuário. Um usuário pode fazer uma pergunta ou uma declaração procurando uma resposta desejada específica de um bot (ou outro aplicativo cliente). Exemplos de intenções são: reservar um voo, perguntar sobre o tempo em uma cidade de destino e solicitar informações de contato para o atendimento ao cliente.

Crie um ModelCreateObject com o nome da intenção exclusiva e, em seguida, passe a ID do aplicativo, a ID da versão e o método ModelCreateObject para o método Model.AddIntentAsync. A resposta é a ID da intenção.

O valor de intentName é embutido em código em OrderPizzaIntent como parte das variáveis da seção intentName.

await client.Model.AddIntentAsync(appId, versionId, new ModelCreateObject()
{
    Name = intentName
});

Criar entidades para o aplicativo

Embora as entidades não sejam necessárias, são encontradas na maioria dos aplicativos. A entidade extrai informações do enunciado do usuário, necessárias para atender à intenção do usuário. Há vários tipos de entidades predefinidas e personalizadas, cada uma com seus próprios modelos de DTO (objeto de transformação de dados). Entidades predefinidas comuns para adicionar ao seu aplicativo number, datetimeV2, geographyV2, ordinal.

É importante saber que as entidades não estão marcadas com uma intenção. Em geral, elas podem se aplicar a muitas intenções. Somente os enunciados de usuário de exemplo são marcados para uma intenção específica.

Os métodos de criação para as entidades fazem parte da classe do Modelo. Cada tipo de entidade tem seu próprio modelo de DTO (objeto de transformação de dados), geralmente contendo palavra model no namespace model.

O código de criação de entidade cria uma entidade de machine learning com as subentidades e os recursos aplicados às subentidades Quantity.

Partial screenshot from portal showing the entity created, a machine-learning entity with subentities and features applied to the `Quantity` subentities.

// 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" });

Use o método a seguir para que a classe localize a ID da subentidade Quantity, a fim de atribuir os recursos a essa subentidade.

static Guid GetModelGrandchild(NDepthEntityExtractor model, string childName, string grandchildName)
{
    return model.Children.
        Single(c => c.Name == childName).
        Children.
        Single(c => c.Name == grandchildName).Id;
}

Adicionar exemplo de enunciado para intenção

A fim de determinar a intenção de um enunciado e extrair entidades, o aplicativo precisa de exemplos de enunciados. Os exemplos precisam ter como destino uma única intenção específica e devem marcar todas as entidades personalizadas. As entidades predefinidas não precisam ser marcadas.

Adicione exemplos de enunciado ao criar uma lista de objetos ExampleLabelObject, um objeto para cada exemplo de enunciado. Cada exemplo deve marcar todas as entidades com um dicionário de pares de nome/valor do nome da entidade e do valor da entidade. O valor da entidade deve exatamente o mesmo que aparece no texto do exemplo de enunciado.

Partial screenshot showing the labeled example utterance in the portal.

Chame Examples.AddAsync com a ID do aplicativo, a ID da versão e o exemplo.

// 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); 

Treinar o aplicativo

Depois que o modelo for criado, o aplicativo LUIS precisará ser treinado para esta versão do modelo. Um modelo treinado pode ser usado em um contêiner ou publicado nos slots de preparo ou de produto.

O método Train.TrainVersionAsync precisa da ID do aplicativo e da ID da versão.

Um modelo muito pequeno, como este guia de início rápido mostra, será treinado muito rapidamente. Para aplicativos de nível de produção, o treinamento do aplicativo deve incluir uma chamada de sondagem para o método GetStatusAsync para determinar quando ou se o treinamento foi bem-sucedido. A resposta é uma lista de objetos ModelTrainingInfo com um status separado para cada objeto. Todos os objetos devem ter êxito para que o treinamento seja considerado concluído.

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;
    }
}

Publicar aplicativo no slot de produção

Publique o aplicativo do LUIS usando o método PublishAsync. Isso publica a versão treinada atual no slot especificado no ponto de extremidade. Seu aplicativo cliente usa esse ponto de extremidade para enviar enunciados de usuário para previsão de extração de intenção e entidade.

await client.Apps.PublishAsync(appId, new ApplicationPublishObject { VersionId = versionId, IsStaging=false});

Autenticar o cliente de runtime de previsão

Use um objeto ApiKeyServiceClientCredentials com a sua chave e use-o com o ponto de extremidade para criar um objeto LUISRuntimeClient.

Cuidado

Esse início rápido utiliza a chave de autoria como parte das credenciais de runtime. A chave de criação tem permissão para consultar o runtime com algumas consultas. Para o código de preparo e de nível de produção, substitua a chave de criação por uma chave de runtime de previsão.

var runtimeClient = new LUISRuntimeClient(credentials) { Endpoint = predictionEndpoint };

Obter uma previsão do runtime

Adicione o código a seguir para criar a solicitação para o runtime de previsão.

O enunciado do usuário faz parte do objeto PredictionRequest.

O método GetSlotPredictionAsync precisa de vários parâmetros, como a ID do aplicativo, o nome do slot e o objeto de solicitação de previsão, para atender à solicitação. As outras opções, como detalhada, mostram todas as intenções e log são opcionais.

// 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));

A resposta de previsão é um objeto JSON, incluindo a intenção e todas as entidades encontradas.

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

Executar o aplicativo

Execute o aplicativo com o comando dotnet run do seu próprio diretório de aplicativo.

dotnet run

Use as bibliotecas de clientes do LUIS (Reconhecimento vocal) para Node.js para:

  • Criar um aplicativo
  • Adicionar uma intenção e uma entidade com machine learning com um exemplo de enunciado
  • Treinar e publicar o aplicativo
  • Runtime de previsão da consulta

Documentação de referência | Criação e Previsão NPM | Amostras

Pré-requisitos

  • Node.js
  • Assinatura do Azure – Criar uma gratuitamente
  • Quando você tiver sua assinatura do Azure, crie um recurso de criação do Reconhecimento vocal no portal do Azure para obter a chave e o ponto de extremidade. Aguarde até que ele seja implantado e clique no botão Ir para o recurso.
    • Você precisará da chave e do ponto de extremidade do recurso que você criar para conectar seu aplicativo à criação do Reconhecimento vocal. Cole a chave e o ponto de extremidade no código abaixo mais adiante no guia de início rápido. Você pode usar o tipo de preço gratuito (F0) para experimentar o serviço.

Configurando

Criar um aplicativo JavaScript

  1. Em uma janela do console, crie um diretório para seu aplicativo e mova-o para esse diretório.

    mkdir quickstart-sdk && cd quickstart-sdk
    
  2. Inicialize o diretório como um aplicativo JavaScript criando um arquivo package.json.

    npm init -y
    
  3. Crie um arquivo chamado index.js para o código JavaScript.

    touch index.js
    

Instalar as bibliotecas npm

No diretório do aplicativo, instale as dependências com os seguintes comandos, executados uma linha por vez:

npm install @azure/ms-rest-js
npm install @azure/cognitiveservices-luis-authoring
npm install @azure/cognitiveservices-luis-runtime

O package.json será semelhante a:

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

Modelo de Objeto de Criação

O cliente de criação do LUIS (Reconhecimento Vocal) é um objeto LUISAuthoringClient que se autentica no Azure, que contém sua chave de criação.

Exemplos de código para criação

Depois que o cliente for criado, use-o para acessar a funcionalidade, incluindo:

Modelo de Objeto de Previsão

O cliente de criação do LUIS (Reconhecimento Vocal) é um objeto LUISAuthoringClient que se autentica no Azure, que contém sua chave de criação.

Exemplos de código para runtime de previsão

Depois que o cliente for criado, use-o para acessar a funcionalidade, incluindo:

Exemplos de código

Estes snippets de códigos mostram como realizar as seguintes ações com a biblioteca de clientes do LUIS (Reconhecimento Vocal) para Python:

Adicionar as dependências

Abra o arquivo index.js no seu editor preferido ou IDE chamado e adicione as dependências a seguir.

const msRest = require("@azure/ms-rest-js");
const LUIS_Authoring = require("@azure/cognitiveservices-luis-authoring");
const LUIS_Prediction = require("@azure/cognitiveservices-luis-runtime");

Adicionar o código clichê

  1. Adicione o método quickstart e a respectiva chamada. Esse método armazena a maior parte do código restante. Esse método é chamado no final do arquivo.

    const quickstart = async () => {
    
        // add calls here
    
    
    }
    quickstart()
        .then(result => console.log("Done"))
        .catch(err => {
            console.log(`Error: ${err}`)
            })
    
  2. Adicione o código restante ao método do guia de início rápido, a menos que especificado de outro modo.

Criar variáveis para o aplicativo

Crie dois conjuntos de variáveis: o primeiro conjunto, você vai alterar; o segundo, você vai deixar como ele aparece no exemplo de código.

Importante

Lembre-se de remover a chave do seu código quando terminar e nunca poste-a publicamente. Para produção, use uma maneira segura de armazenar e acessar suas credenciais, como o Azure Key Vault. Consulte o artigo sobre segurança do serviços de IA do Azure para obter mais informações.

  1. Crie variáveis para manter a chave de criação e os nomes do recurso.

    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";
    
  2. Crie variáveis para armazenar os pontos de extremidade, o nome do aplicativo, a versão e o nome da intenção.

    const appName = "Contoso Pizza Company";
    const versionId = "0.1";
    const intentName = "OrderPizzaIntent";
    

Autenticar o cliente

Crie um objeto CognitiveServicesCredentials com a sua chave e use-o com o ponto de extremidade para criar um objeto LUISAuthoringClient.

const luisAuthoringCredentials = new msRest.ApiKeyCredentials({
    inHeader: { "Ocp-Apim-Subscription-Key": authoringKey }
});
const client = new LUIS_Authoring.LUISAuthoringClient(
    luisAuthoringCredentials,
    authoringEndpoint
);

Criar um aplicativo LUIS

Um aplicativo LUIS contém o modelo de NLP (processamento em idioma natural), incluindo intenções, entidades e exemplos de enunciados.

Crie um add objeto AppsOperation para criar o aplicativo. O nome e a cultura do idioma são propriedades obrigatórias.

const create_app_payload = {
    name: appName,
    initialVersionId: versionId,
    culture: "en-us"
};

const createAppResult = await client.apps.add(
    create_app_payload
);

const appId = createAppResult.body

Criar intenção para o aplicativo

O objeto principal no modelo de um aplicativo do LUIS é a intenção. A intenção se alinha com um agrupamento de intenções de enunciado do usuário. Um usuário pode fazer uma pergunta ou uma declaração procurando uma resposta desejada específica de um bot (ou outro aplicativo cliente). Exemplos de intenções são: reservar um voo, perguntar sobre o tempo em uma cidade de destino e solicitar informações de contato para o atendimento ao cliente.

Use o método model.add_intent com o nome da intenção exclusiva e, em seguida, passe a ID do aplicativo, a ID da versão e o nome da nova tentativa.

O valor de intentName é embutido em código em OrderPizzaIntent como parte das variáveis da seção intentName.

await client.model.addIntent(
    appId,
    versionId,
    { name: intentName }
);

Criar entidades para o aplicativo

Embora as entidades não sejam necessárias, são encontradas na maioria dos aplicativos. A entidade extrai informações do enunciado do usuário, necessárias para atender à intenção do usuário. Há vários tipos de entidades predefinidas e personalizadas, cada uma com seus próprios modelos de DTO (objeto de transformação de dados). Entidades predefinidas comuns para adicionar ao seu aplicativo number, datetimeV2, geographyV2, ordinal.

É importante saber que as entidades não estão marcadas com uma intenção. Em geral, elas podem se aplicar a muitas intenções. Somente os exemplos de enunciados de usuário são marcados para uma única intenção específica.

Os métodos de criação para as entidades fazem parte da classe do Modelo. Cada tipo de entidade tem seu próprio modelo de DTO (objeto de transformação de dados).

O código de criação de entidade cria uma entidade de machine learning com as subentidades e os recursos aplicados às subentidades Quantity.

Partial screenshot from portal showing the entity created, a machine-learning entity with subentities and features applied to the `Quantity` subentities.

// 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" });

Coloque o método a seguir acima do método quickstart para localizar a ID da subentidade Quantity, a fim de atribuir os recursos a ela.

const getModelGrandchild = (model, childName, grandchildName) => {

    return model.children.find(c => c.name == childName).children.find(c => c.name == grandchildName).id

}

Adicionar exemplo de enunciado para intenção

A fim de determinar a intenção de um enunciado e extrair entidades, o aplicativo precisa de exemplos de enunciados. Os exemplos precisam ter como destino uma única intenção específica e devem marcar todas as entidades personalizadas. As entidades predefinidas não precisam ser marcadas.

Adicione exemplos de enunciado ao criar uma lista de objetos ExampleLabelObject, um objeto para cada exemplo de enunciado. Cada exemplo deve marcar todas as entidades com um dicionário de pares de nome/valor do nome da entidade e do valor da entidade. O valor da entidade deve exatamente o mesmo que aparece no texto do exemplo de enunciado.

Partial screenshot showing the labeled example utterance in the portal.

Chame examples.add com a ID do aplicativo, a ID da versão e o exemplo.

// 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 });

Treinar o aplicativo

Depois que o modelo for criado, o aplicativo LUIS precisará ser treinado para esta versão do modelo. Um modelo treinado pode ser usado em um contêiner ou publicado nos slots de preparo ou de produto.

O método train.trainVersion precisa da ID do aplicativo e da ID da versão.

Um modelo muito pequeno, como este guia de início rápido mostra, será treinado muito rapidamente. Para aplicativos de nível de produção, o treinamento do aplicativo deve incluir uma chamada de sondagem para o método get_status para determinar quando ou se o treinamento foi bem-sucedido. A resposta é uma lista de objetos ModelTrainingInfo com um status separado para cada objeto. Todos os objetos devem ter êxito para que o treinamento seja considerado concluído.

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;
    }
}

Publicar aplicativo no slot de produção

Publique o aplicativo do LUIS usando o método app.publish. Isso publica a versão treinada atual no slot especificado no ponto de extremidade. Seu aplicativo cliente usa esse ponto de extremidade para enviar enunciados de usuário para previsão de extração de intenção e entidade.

await client.apps.publish(appId, { versionId: versionId, isStaging: false });

Autenticar o cliente de runtime de previsão

Use um objeto msRest.ApiKeyCredentials com a sua chave e use-o com o ponto de extremidade para criar um objeto LUIS.LUISRuntimeClient.

Cuidado

Esse início rápido utiliza a chave de autoria como parte das credenciais de runtime. A chave de criação tem permissão para consultar o runtime com algumas consultas. Para o código de preparo e de nível de produção, substitua a chave de criação por uma chave de runtime de previsão.

const luisPredictionClient = new LUIS_Prediction.LUISRuntimeClient(
    luisAuthoringCredentials,
    predictionEndpoint
);

Obter uma previsão do runtime

Adicione o código a seguir para criar a solicitação para o runtime de previsão. O enunciado do usuário faz parte do objeto predictionRequest.

O método luisRuntimeClient.prediction.getSlotPrediction precisa de vários parâmetros, como a ID do aplicativo, o nome do slot e o objeto de solicitação de previsão, para atender à solicitação. As outras opções, como detalhada, mostram todas as intenções e log são opcionais.

// 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 ));

A resposta de previsão é um objeto JSON, incluindo a intenção e todas as entidades encontradas.

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

Executar o aplicativo

Execute o aplicativo com o comando node index.js no seu arquivo de início rápido.

node index.js

Use a biblioteca de clientes do LUIS (Reconhecimento vocal) para Python para:

  • Criar um aplicativo
  • Adicionar uma intenção e uma entidade com machine learning com um exemplo de enunciado
  • Treinar e publicar o aplicativo
  • Runtime de previsão da consulta

Documentação de referência | Código-fonte da biblioteca de Criação e Previsão | Pacote (Pypi) | Exemplos

Pré-requisitos

  • A versão atual do Python 3.x.
  • Assinatura do Azure – Criar uma gratuitamente
  • Quando você tiver sua assinatura do Azure, crie um recurso de criação do Reconhecimento vocal no portal do Azure para obter a chave e o ponto de extremidade. Aguarde até que ele seja implantado e clique no botão Ir para o recurso.
    • Você precisará da chave e do ponto de extremidade do recurso que você criar para conectar seu aplicativo à criação do Reconhecimento vocal. Cole a chave e o ponto de extremidade no código abaixo mais adiante no guia de início rápido. Você pode usar o tipo de preço gratuito (F0) para experimentar o serviço.

Configurando

Criar um novo aplicativo Python

  1. Em uma janela do console, crie um diretório para seu aplicativo e mova-o para esse diretório.

    mkdir quickstart-sdk && cd quickstart-sdk
    
  2. Crie um arquivo chamado authoring_and_predict.py para o código Python.

    touch authoring_and_predict.py
    

Instalar a biblioteca de clientes com o Pip

No diretório do aplicativo, instale a biblioteca de clientes do LUIS (Reconhecimento vocal) para Python com o seguinte comando:

pip install azure-cognitiveservices-language-luis

Modelo de Objeto de Criação

O cliente de criação do LUIS (Reconhecimento Vocal) é um objeto LUISAuthoringClient que se autentica no Azure, que contém sua chave de criação.

Exemplos de código para criação

Depois que o cliente for criado, use-o para acessar a funcionalidade, incluindo:

Modelo de Objeto de Previsão

O cliente de runtime de previsão do LUIS (Reconhecimento Vocal) é um objeto LUISRuntimeClient que se autentica no Azure, que contém sua chave de recurso.

Exemplos de código para runtime de previsão

Depois que o cliente for criado, use-o para acessar a funcionalidade, incluindo:

Exemplos de código

Estes snippets de códigos mostram como realizar as seguintes ações com a biblioteca de clientes do LUIS (Reconhecimento Vocal) para Python:

Adicionar as dependências

Adicione as bibliotecas de clientes ao arquivo 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

Adicionar o código clichê

  1. Adicione o método quickstart e a respectiva chamada. Esse método armazena a maior parte do código restante. Esse método é chamado no final do arquivo.

    def quickstart():
    
        # add calls here, remember to indent properly
    
    quickstart()
    
  2. Adicione o código restante ao método do guia de início rápido, a menos que especificado de outro modo.

Criar variáveis para o aplicativo

Crie dois conjuntos de variáveis: o primeiro conjunto, você vai alterar; o segundo, você vai deixar como ele aparece no exemplo de código.

Importante

Lembre-se de remover a chave do seu código quando terminar e nunca poste-a publicamente. Para produção, use uma maneira segura de armazenar e acessar suas credenciais, como o Azure Key Vault. Consulte o artigo sobre segurança do serviços de IA do Azure para obter mais informações.

  1. Crie variáveis para manter a chave de criação e os nomes do recurso.

    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'
    
  2. Crie variáveis para armazenar os pontos de extremidade, o nome do aplicativo, a versão e o nome da intenção.

    # We use a UUID to avoid name collisions.
    appName = "Contoso Pizza Company " + str(uuid.uuid4())
    versionId = "0.1"
    intentName = "OrderPizzaIntent"
    

Autenticar o cliente

Crie um objeto CognitiveServicesCredentials com sua chave e use-o com seu ponto de extremidade para criar um objeto LUISAuthoringClient.

client = LUISAuthoringClient(authoringEndpoint, CognitiveServicesCredentials(authoringKey))

Criar um aplicativo LUIS

Um aplicativo LUIS contém o modelo de NLP (processamento em idioma natural), incluindo intenções, entidades e exemplos de enunciados.

Crie um add objeto AppsOperation para criar o aplicativo. O nome e a cultura do idioma são propriedades obrigatórias.

# 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))

Criar intenção para o aplicativo

O objeto principal no modelo de um aplicativo do LUIS é a intenção. A intenção se alinha com um agrupamento de intenções de enunciado do usuário. Um usuário pode fazer uma pergunta ou uma declaração procurando uma resposta desejada específica de um bot (ou outro aplicativo cliente). Exemplos de intenções são: reservar um voo, perguntar sobre o tempo em uma cidade de destino e solicitar informações de contato para o atendimento ao cliente.

Use o método model.add_intent com o nome da intenção exclusiva e, em seguida, passe a ID do aplicativo, a ID da versão e o nome da nova tentativa.

O valor de intentName é embutido em código em OrderPizzaIntent como parte das variáveis da seção intentName.

client.model.add_intent(app_id, versionId, intentName)

Criar entidades para o aplicativo

Embora as entidades não sejam necessárias, são encontradas na maioria dos aplicativos. A entidade extrai informações do enunciado do usuário, necessárias para atender à intenção do usuário. Há vários tipos de entidades predefinidas e personalizadas, cada uma com seus próprios modelos de DTO (objeto de transformação de dados). Entidades predefinidas comuns para adicionar ao seu aplicativo number, datetimeV2, geographyV2, ordinal.

É importante saber que as entidades não estão marcadas com uma intenção. Em geral, elas podem se aplicar a muitas intenções. Somente os exemplos de enunciados de usuário são marcados para uma única intenção específica.

Os métodos de criação para as entidades fazem parte da classe ModelOperations. Cada tipo de entidade tem seu próprio modelo de DTO (objeto de transformação de dados).

O código de criação de entidade cria uma entidade de machine learning com as subentidades e os recursos aplicados às subentidades Quantity.

Partial screenshot from portal showing the entity created, a machine-learning entity with subentities and features applied to the `Quantity` subentities.

# 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)

Coloque o método a seguir acima do método quickstart para localizar a ID da subentidade Quantity, a fim de atribuir os recursos a ela.

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

Adicionar exemplo de enunciado para intenção

A fim de determinar a intenção de um enunciado e extrair entidades, o aplicativo precisa de exemplos de enunciados. Os exemplos precisam ter como destino uma única intenção específica e devem marcar todas as entidades personalizadas. As entidades predefinidas não precisam ser marcadas.

Adicione exemplos de enunciado ao criar uma lista de objetos ExampleLabelObject, um objeto para cada exemplo de enunciado. Cada exemplo deve marcar todas as entidades com um dicionário de pares de nome/valor do nome da entidade e do valor da entidade. O valor da entidade deve exatamente o mesmo que aparece no texto do exemplo de enunciado.

Partial screenshot showing the labeled example utterance in the portal.

Chame examples.add com a ID do aplicativo, a ID da versão e o exemplo.

# 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 })

Treinar o aplicativo

Depois que o modelo for criado, o aplicativo LUIS precisará ser treinado para esta versão do modelo. Um modelo treinado pode ser usado em um contêiner ou publicado nos slots de preparo ou de produto.

O método train.train_version precisa da ID do aplicativo e da ID da versão.

Um modelo muito pequeno, como este guia de início rápido mostra, será treinado muito rapidamente. Para aplicativos de nível de produção, o treinamento do aplicativo deve incluir uma chamada de sondagem para o método get_status para determinar quando ou se o treinamento foi bem-sucedido. A resposta é uma lista de objetos ModelTrainingInfo com um status separado para cada objeto. Todos os objetos devem ter êxito para que o treinamento seja considerado concluído.

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

Publicar aplicativo no slot de produção

Publique o aplicativo do LUIS usando o método app.publish. Isso publica a versão treinada atual no slot especificado no ponto de extremidade. Seu aplicativo cliente usa esse ponto de extremidade para enviar enunciados de usuário para previsão de extração de intenção e entidade.

# 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)

Autenticar o cliente de runtime de previsão

Use o objeto de credenciais com a sua chave e use-o com o ponto de extremidade para criar um objeto LUISRuntimeClientConfiguration.

Cuidado

Esse início rápido utiliza a chave de autoria como parte das credenciais de runtime. A chave de criação tem permissão para consultar o runtime com algumas consultas. Para o código de preparo e de nível de produção, substitua a chave de criação por uma chave de runtime de previsão.

runtimeCredentials = CognitiveServicesCredentials(predictionKey)
clientRuntime = LUISRuntimeClient(endpoint=predictionEndpoint, credentials=runtimeCredentials)

Obter uma previsão do runtime

Adicione o código a seguir para criar a solicitação para o runtime de previsão.

O enunciado do usuário faz parte do objeto prediction_request.

O método get_slot_prediction precisa de vários parâmetros, como a ID do aplicativo, o nome do slot e o objeto de solicitação de previsão, para atender à solicitação. As outras opções, como detalhada, mostram todas as intenções e log são opcionais. A solicitação retorna um objeto 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))

A resposta de previsão é um objeto JSON, incluindo a intenção e todas as entidades encontradas.

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

Executar o aplicativo

Execute o aplicativo com o comando python no seu arquivo de início rápido.

python authoring_and_predict.py

Seguindo este guia de início rápido, você executará três chamadas REST em sequência.

  • Primeiro, você carregará um lote de enunciados de exemplo que será usado para treinar o modelo de aplicativo de Pizza, usando a chamada REST Batch add labels.
  • Em seguida, você iniciará uma sessão de treinamento para o aplicativo de Pizza, usando a chamada REST Train application version.
  • Por fim, você obterá o status da sessão de treinamento para o aplicativo de Pizza, usando a chamada REST Get version training status.

Documentação de referência

Pré-requisitos

  • Uma conta gratuita do LUIS.

  • Um editor de texto, como o Visual Studio Code.

  • O programa de linha de comando cURL. O programa cURL já está instalado no macOS, na maioria das distribuições do Linux e no Windows 10 Build 1803 e posterior.

    Se precisar instalar o cURL, baixe-o na página de download do cURL.

Criar aplicativo Pizza

Criar o aplicativo Pizza.

  1. Selecione pizza-app-for-luis-v6.json para abrir a página do GitHub para o arquivo pizza-app-for-luis.json.
  2. Clique com o botão direito do mouse (ou toque e segure por alguns segundos) o botão Bruto e selecione Salvar link como para salvar o pizza-app-for-luis.json em seu computador.
  3. Entre no portal do LUIS.
  4. Selecione Meus Aplicativos.
  5. Na página Meus aplicativos, selecione + Novo aplicativo de conversa.
  6. Selecione Importar como JSON.
  7. Na caixa de diálogo Importar novo aplicativo, selecione o botão Escolher arquivo.
  8. Selecione o arquivo pizza-app-for-luis.json que você baixou e, em seguida, selecione pizza-app-for-luis.json.
  9. No campo Nome da caixa de diálogo Importar novo aplicativo, insira um nome para o aplicativo Pizza e, em seguida, selecione o botão Concluído.

O aplicativo será importado.

Se você vir uma caixa de diálogo que diz Como criar um aplicativo LUIS eficaz, feche-a.

Treinar e publicar o aplicativo Pizza

Você deve ver a página Intenções com uma lista de intenções no aplicativo Pizza.

  1. No lado superior direito do site do LUIS, selecione o botão Treinar.

    Train button

  2. O treinamento é concluído quando o botão Treinar fica desabilitado.

Para receber uma previsão do LUIS em um chatbot ou em outro aplicativo cliente, publique o aplicativo no ponto de extremidade de previsão.

  1. Selecione Publicar no painel de navegação superior direito.

    A screenshot of the button for publishing to the endpoint.

  2. Selecione o slot de Produção e Concluído.

    A screenshot of LUIS publishing to the endpoint.

  3. Selecione Acessar as URLs do ponto de extremidade na notificação para ir à página Recursos do Azure. Você só poderá ver as URLs se tiver um recurso de previsão associado ao aplicativo. Encontre também a página Recursos do Azure clicando em Gerenciar.

    A screenshot of a message showing the app has been published.

Adicionar um recurso de criação ao aplicativo Pizza

  1. Selecione GERENCIAR.
  2. Selecione Recursos do Azure.
  3. Selecione Recurso de Criação.
  4. Selecione Alterar recurso de criação.

Se você tiver um recurso de criação, insira o Nome do Locatário, Nome da Assinatura e nome do recurso LUIS do recurso de criação.

Se você não tiver um recurso de criação:

  1. Selecione Criar recurso.
  2. Insira um Nome do Locatário, Nome do Recurso, Nome da Assinatura e Nome do Grupo de Recursos do Azure.

Agora, o aplicativo Pizza está pronto para o uso.

Registrar os valores de acesso para seu aplicativo Pizza

Para usar o novo aplicativo Pizza, você precisará da ID do aplicativo, da chave de criação e do ponto de extremidade de criação desse aplicativo. Para obter previsões, você precisará do ponto de extremidade de previsão e da chave de previsão separados.

Para encontrar esses valores:

  1. Na página Intenções, selecione GERENCIAR.
  2. Na página Configurações de aplicativo, registre a ID do aplicativo.
  3. Selecione Recursos do Azure.
  4. Selecione Recurso de Criação.
  5. Nas guias Recurso de Criação e Recursos de Previsão, registre a Chave Primária. Esse valor é a sua chave de criação.
  6. Registre a URL do ponto de extremidade. Esse valor é o seu ponto de extremidade de criação.

Criar um arquivo JSON para treinar o aplicativo de Pizza

Para criar um arquivo JSON com três exemplos de enunciados, salve os seguintes dados JSON em um arquivo chamado 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
      }
    ]
  }
]`

O JSON de enunciados de exemplo segue um formato específico.

O campo text contém o texto do enunciado de exemplo. O campo intentName precisa corresponder ao nome de uma intenção existente no aplicativo do LUIS. O campo entityLabels é obrigatório. Se você não quiser rotular as entidades, forneça uma matriz vazia.

Se a matriz entityLabels não estiver vazia, startCharIndex e endCharIndex precisarão marcar a entidade referenciada no campo entityName. O índice começa no zero. Se você começar ou terminar o rótulo em um espaço no texto, a chamada à API para adicionar os enunciados falhará.

Adicionar enunciados de exemplo

  1. Para carregar o lote de exemplo enunciados, copie este comando em seu editor de texto:

    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"
    
  2. Substitua os valores que começam com ***YOUR- por seus valores.

    Informações Finalidade
    ***YOUR-AUTHORING-ENDPOINT*** Seu ponto de extremidade da URL de criação. (Por exemplo, "https://REPLACE-WITH-YOUR-RESOURCE-NAME.api.cognitive.microsoft.com/". Você definiu o nome do recurso quando você criou o recurso.
    ***YOUR-APP-ID*** Sua ID do aplicativo LUIS.
    ***YOUR-APP-VERSION*** Sua versão do aplicativo LUIS. Para o aplicativo de Pizza, o número de versão é "0.1" sem as aspas.
    ***YOUR-AUTHORING-KEY*** Sua chave de criação de 32 caracteres.

    As chaves e os recursos atribuídos estão visíveis no portal do LUIS na seção Gerenciar, na página recursos do Azure. A ID do aplicativo está disponível na mesma seção Gerenciar, na página Configurações do Aplicativo.

    Importante

    Lembre-se de remover a chave do seu código quando terminar e nunca poste-a publicamente. Para produção, use uma maneira segura de armazenar e acessar suas credenciais, como o Azure Key Vault. Confira o artigo sobre segurança dos serviços de IA do Azure para obter mais informações.

  3. Inicie um Prompt de comando (Windows) ou Terminal (macOS e Linux) e altere os diretórios para o mesmo diretório em que você salvou o arquivo ExampleUtterances.JSON.

  4. Copie o comando do cURL do editor e cole-o em um Prompt de comando (Windows) ou Terminal (macOS e Linux). Pressione Enter para executar o comando.

    Você deverá ver a seguinte resposta:

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

    Esta é a saída formatada para facilitar a leitura:

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

Treinar o modelo de aplicativo de Pizza

  1. Para iniciar uma sessão de treinamento para o aplicativo de Pizza, copie este comando em seu editor de texto:

    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***"
    
  2. Como você fez anteriormente, substitua os valores que começam com ***YOUR- por seus valores.

  3. Copie o comando do cURL do editor e cole-o em um Prompt de comando (Windows) ou Terminal (macOS e Linux). Pressione Enter para executar o comando.

    Você deverá ver a seguinte resposta:

    {"statusId":2,"status":"UpToDate"}
    

    Esta é a saída formatada para facilitar a leitura:

    {
      "statusId": 2,
      "status": "UpToDate"
    }
    

Obter o status do treinamento

  1. Para obter o status de treinamento para a sessão de treinamento, copie este comando em seu editor de texto:

    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***"
    
  2. Como você fez anteriormente, substitua os valores que começam com ***YOUR- por seus valores.

  3. Copie o comando do cURL do editor e cole-o em um Prompt de comando (Windows) ou Terminal (macOS e Linux). Pressione Enter para executar o comando.

    Você deverá ver a seguinte resposta:

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

    Esta é a saída formatada para facilitar a leitura:

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

Obter a intenção do ponto de extremidade de previsão

Use o cURL para consultar o ponto de extremidade de previsão para obter o resultado da previsão.

Observação

Este comando usa o ponto de extremidade da previsão.

  1. Copie este comando em seu editor de texto:

    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"
    
  2. Substitua os valores que começam com ***YOUR- por seus valores.

    Informações Finalidade
    ***YOUR-PREDICTION-ENDPOINT*** O ponto de extremidade da URL de previsão. Localizada no portal do LUIS, página de Recursos do Azure do seu aplicativo.
    Por exemplo, https://westus.api.cognitive.microsoft.com/.
    ***YOUR-APP-ID*** ID do seu aplicativo. Localizada no portal do LUIS, página de Configurações de Aplicativo do seu aplicativo.
    ***YOUR-PREDICTION-KEY*** Sua chave de previsão de 32 caracteres. Localizada no portal do LUIS, página de Recursos do Azure do seu aplicativo.
  3. Copie o texto em uma janela de console e pressione Enter para executar o comando:

  4. Examine a resposta de previsão, que é retornada como 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"]}]}}}}
    

    Resposta em JSON formatada para facilitar a leitura:

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

Limpar os recursos

Você pode excluir o aplicativo do portal do LUIS e excluir os recursos do Azure no portal do Azure.

Se você estiver usando a API REST, exclua o arquivo ExampleUtterances.JSON do sistema de arquivos quando terminar o início rápido.

Solução de problemas

  • Autenticação na biblioteca de clientes – erros de autenticação geralmente indicam que foram usados a chave e o ponto de extremidade incorretos. Para sua conveniência, este guia de início rápido usa a chave e o ponto de extremidade de criação para o runtime de previsão, mas só funcionará se você ainda não tiver usado a cota mensal. Se você não puder usar a chave e o ponto de extremidade de criação, precisará usar a chave e o ponto de extremidade do runtime de previsão ao acessar a biblioteca de cliente do SDK do runtime de previsão.
  • Criação de entidades – se você receber um erro durante a criação da entidade de machine learning aninhada usada neste tutorial, verifique se você copiou o código e se não o alterou para criar uma entidade diferente.
  • Criação de enunciados de exemplo – se você receber um erro durante a criação do enunciado de exemplo rotulado usado neste tutorial, verifique se você copiou o código e não o alterou para criar um exemplo rotulado diferente.
  • Treinamento – se você recebe um erro de treinamento, isso geralmente indica um aplicativo vazio (sem intenções com os enunciados de exemplo) ou um aplicativo com tentativas ou entidades malformadas.
  • Erros diversos – como o código faz chamadas às bibliotecas do cliente com objetos JSON e de texto, verifique se você não alterou o código.

Outros erros – se você receber um erro não abordado na lista anterior, informe-nos fornecendo comentários na parte inferior desta página. Inclua a linguagem de programação e a versão das bibliotecas de clientes instaladas.

Próximas etapas