Compartilhar via


Melhores práticas para a compreensão da linguagem coloquial

Use as diretrizes a seguir para criar os melhores projetos possíveis na compreensão da linguagem coloquial.

Escolher um esquema consistente

Um esquema é a definição de suas intenções e entidades. Existem diferentes abordagens que você pode adotar ao definir o que você deve criar como uma intenção e como uma entidade. Faça estas perguntas:

  • Quais ações ou consultas estou tentando capturar do meu usuário?
  • Quais informações são relevantes em cada ação?

De modo geral, você pode pensar em ações e consultas como intenções, enquanto as informações necessárias para executar essas consultas são entidades.

Por exemplo, suponha que você queira que seus clientes cancelem as assinaturas de vários produtos que você oferece por meio do seu chatbot. Você pode criar uma intenção de Cancelar com vários exemplos como "Cancelar o serviço da Contoso" ou "Parar de me cobrar pela assinatura da Fabrikam". A intenção do usuário aqui é cancelar, e o serviço da Contoso ou a assinatura da Fabrikam são as assinaturas que ele quer cancelar.

Para continuar, crie uma entidade para assinaturas. Em seguida, você pode modelar seu projeto inteiro para capturar ações como intenções e usar entidades para preencher essas ações. Essa abordagem permite que você cancele qualquer coisa definida como uma entidade, como outros produtos. Em seguida, você pode ter intenções para se inscrever, renovar, atualizar, tudo isso com referência a assinaturas e outras entidades.

O design do esquema acima torna mais fácil expandir os recursos existentes (cancelar, atualizar ou se inscrever) para novos destinos criando uma nova entidade.

Outra abordagem é modelar as informações como intenções e as ações como entidades. Vamos usar o mesmo exemplo de permitir que seus clientes cancelem assinaturas por meio do seu chatbot.

Você pode criar uma intenção para cada assinatura disponível, como no caso da Contoso, com enunciados como "Cancelar a Contoso,"Pare de me cobrar pelos serviços da Contoso", e "Cancelar a assinatura da Contoso". Em seguida, você cria uma entidade para capturar a ação cancelar. Você pode definir entidades diferentes para cada ação ou consolidar ações como uma entidade com um componente de lista para diferenciar entre ações com chaves diferentes.

Esse design de esquema facilita a extensão de novas ações para destinos existentes adicionando novas entidades de ação ou componentes de entidade.

Certifique-se de evitar tentar canalizar todos os conceitos em intenções. Por exemplo, não tente criar uma intenção Cancelar Contoso que tenha apenas a finalidade dessa ação específica. Intenções e entidades devem trabalhar juntas para capturar todas as informações necessárias do cliente.

Você também deseja evitar a combinação de designs de esquema diferentes. Não crie metade do seu aplicativo tendo ações como intenções e a outra metade tendo informações como intenções. Para obter os resultados possíveis, certifique-se de ser consistente.

Balancear dados de treinamento

Quando se tratar de dados de treinamento, tente manter seu esquema bem equilibrado. Incluir grandes quantidades de uma intenção e muito pouco de outra resultará em um modelo tendencioso com relação a intenções específicas.

Para abordar essa situação, talvez você precise reduzir o tamanho do seu conjunto de treinamento. Ou talvez precise aumentá-lo. Para reduzir o tamanho, você pode:

  • Eliminar um determinado percentual dos dados de treinamento aleatoriamente.
  • Analise o conjunto de dados e remova as entradas duplicadas e representadas em excesso, o que constitui uma maneira mais sistemática.

Para aumentar o conjunto de treinamento, acesse o Language Studio e, na guia Rotulagem de dados, selecione Sugerir enunciados. O recurso Compreensão da Linguagem Coloquial enviará uma chamada ao OpenAI do Azure para gerar enunciados semelhantes.

Captura de tela mostrando uma sugestão de enunciado no Language Studio.

Você também deve procurar por "padrões" não intencionais no conjunto de treinamento. Por exemplo, verifique se o conjunto de treinamento para uma determinada intenção está todo em minúsculas ou começa com uma frase específica. Nesses casos, o modelo que você treina pode aprender esses vieses não intencionais no conjunto de treinamento, em vez de ser capaz de generalizar.

Recomendamos que você introduza a diversidade de maiúsculas e minúsculas e de pontuação no conjunto de treinamento. Se o modelo for esperado para lidar com variações, certifique-se de ter um conjunto de treinamento que também reflita essa diversidade. Por exemplo, inclua alguns enunciados contendo as maiúsculas e minúsculas apropriadas e outros apenas minúsculas.

Rotular claramente os enunciados

  • Certifique-se de que os conceitos aos quais suas entidades se referem sejam bem definidos e separáveis. Verifique se é possível determinar facilmente as diferenças de forma confiável. Se você não conseguir, essa falta de distinção pode indicar que o componente aprendido também terá essa dificuldade.

  • Se houver uma semelhança entre as entidades, verifique se há algum aspecto dos seus dados que forneça um sinal para a diferença entre elas.

    Por exemplo, se você criou um modelo para reservar voos, um usuário poderia usar um enunciado como "Quero um voo de Boston para Seattle". Seria de se esperar que a cidade de origem e a cidade de destino para tais enunciados fossem semelhantes. Um sinal para diferenciar a cidade de origem pode ser que a palavra de costuma precedê-la.

  • Certifique-se de rotular todas as instâncias de cada entidade nos seus dados de treinamento e de teste. Uma abordagem é utilizar a função pesquisar para encontrar todas as instâncias de uma palavra ou frase nos seus dados e verificar se elas estão corretamente rotuladas.

  • Rotule dados de teste para as entidades que não têm nenhum componente de aprendizado e também para as entidades que os têm. Essa prática ajuda a garantir que as métricas de avaliação sejam precisas.

Usar o treinamento padrão antes do treinamento avançado

O treinamento padrão é gratuito e mais rápido do que o treinamento avançado. Além disso, pode ajudar você a entender rapidamente o efeito das alterações em seu conjunto ou esquema de treinamento enquanto você cria o modelo. Depois de estar satisfeito com o esquema, considere usar o treinamento avançado para obter a melhor qualidade de modelo.

Usar o recurso de avaliação

Quando você cria um aplicativo, muitas vezes é útil detectar os erros com antecedência. Costuma ser uma boa prática adicionar um conjunto de testes quando você compila o aplicativo. Os resultados de treinamento e avaliação são úteis para identificar erros ou problemas no seu esquema.

Componentes e composição do aprendizado de máquina

Para obter mais informações, confira Tipos de componentes.

Usar o limite de pontuação Nenhum

Se estiver vendo muitos falsos positivos, como enunciados fora de contexto sendo marcados como intenções válidas, confira Limite de confiança para obter informações sobre como isso afeta a inferência.

  • Os componentes de entidade fora do aprendizado de máquina, como listas e regex, são, por definição, não contextuais. Se vir entidades de lista ou regex em lugares não intencionais, tente rotular os sinônimos da lista como o componente de aprendizado de máquina.
  • Para as entidades, você pode usar o componente aprendido como o componente Obrigatório, para restringir quando uma entidade composta deve ser disparada.

Por exemplo, suponha que você tenha uma entidade chamada Quantidade de Passagens, que tenta extrair o número de passagens que você quer usar para reservar voos, no caso de enunciados como "Reserve duas passagens para o Cairo para amanhã".

Normalmente, você adicionaria um componente predefinido para Quantity.Number que já extrairia todos os números presentes nos enunciados. No entanto, se fosse definida apenas como um componente predefinido, sua entidade também extrairia outros números como parte da entidade Quantidade de Passagens, como "Reservar duas passagens para o Cairo para amanhã às 15h".

Para resolver isso, você rotularia um componente aprendido em seus dados de treinamento para todos os números associados a quantidades de passagens. A entidade agora tem dois componentes:

  • O componente predefinido que pode interpretar todos os números.
  • O componente aprendido que prevê onde a quantidade de passagens está localizada em uma frase.

Se você precisar do componente aprendido, certifique-se de que a Quantidade de Passagens só seja retornada quando o componente aprendido a prever no contexto correto. Se também requerer o componente predefinido, você poderá, a seguir, garantir que a entidade retornada Quantidade de Passagens seja um número e também esteja na posição correta.

Abordar inconsistências do modelo

Se o seu modelo for muito sensível a pequenas alterações gramaticais, como a diferenciação de maiúsculas e minúsculas ou o uso de acentos, você poderá manipular sistematicamente seu conjunto de dados diretamente no Language Studio. Para usar esses recursos, selecione a guia Configurações no painel do lado esquerdo e localize a seção Configurações do projeto avançadas.

Captura de tela mostrando um exemplo de

Primeiro, você pode Habilitar a transformação de dados para diferenciar maiúsculas de minúsculas, que normaliza o uso de maiúsculas e minúsculas dos enunciados quando você treinar, testar e implementar seu modelo. Se tiver migrado do LUIS, talvez você reconheça que o LUIS fazia essa normalização por padrão. Para acessar esse recurso via API, defina o parâmetro normalizeCasing para true. Consulte o seguinte exemplo:

{
  "projectFileVersion": "2022-10-01-preview",
    ...
    "settings": {
      ...
      "normalizeCasing": true
      ...
    }
...

Em segundo lugar, você também pode definir a configuração para Habilitar o aumento de dados para acentos e gerar variações de seus dados de treinamento para as possíveis variações do uso de acentos na linguagem natural. Esse recurso está disponível para todos os idiomas. É especialmente útil para idiomas germânicos e eslavos, em que os usuários geralmente escrevem palavras usando os caracteres clássicos do inglês em vez dos caracteres corretos. Por exemplo, a frase "Navegue para o canal de esportes" em francês é "Accédez à la chaîne sportive". Quando este recurso está habilitado, a frase "Accedez a la chaine sportive" (sem caracteres diacríticos) também é incluída no conjunto de dados de treinamento.

Se você habilitar esse recurso, o número de enunciados do seu conjunto de treinamento irá aumentar. Por esse motivo, talvez seja necessário ajustar o tamanho dos seus dados de treinamento de acordo. A contagem máxima atual de declarações após o aumento é de 25.000. Para acessar esse recurso via API, defina o parâmetro augmentDiacritics para true. Consulte o seguinte exemplo:

{
  "projectFileVersion": "2022-10-01-preview",
    ...
    "settings": {
      ...
      "augmentDiacritics": true
      ...
    }
...

Abordar o excesso de confiança do modelo

Os clientes podem usar a versão de configuração de treinamento do LoraNorm se o modelo estiver incorretamente com excesso de confiança. Um exemplo desse comportamento pode ser semelhante ao cenário a seguir, em que o modelo prevê a intenção incorreta com 100% de confiança. Essa pontuação faz com que o uso da configuração de limite de confiança do projeto se torne impossível.

Texto Intenção prevista Pontuação de confiança
"Quem construiu a Torre Eiffel?" Sports 1,00
"Eu pareço bem para você hoje?" QueryWeather 1,00
"Espero que você tenha uma boa noite." Alarm 1,00

Para abordar essa situação, use a versão 2023-04-15 da configuração que normaliza as pontuações de confiança. A configuração de projeto do limite de confiança pode então ser ajustada para alcançar o resultado desejado.

curl --location 'https://<your-resource>.cognitiveservices.azure.com/language/authoring/analyze-conversations/projects/<your-project>/:train?api-version=2022-10-01-preview' \
--header 'Ocp-Apim-Subscription-Key: <your subscription key>' \
--header 'Content-Type: application/json' \
--data '{
      "modelLabel": "<modelLabel>",
      "trainingMode": "advanced",
      "trainingConfigVersion": "2023-04-15",
      "evaluationOptions": {
            "kind": "percentage",
            "testingSplitPercentage": 0,
            "trainingSplitPercentage": 100
      }
}

Após a solicitação ser enviada, você poderá acompanhar o progresso do trabalho de treinamento no Language Studio como de costume.

Observação

Você precisará treinar seu modelo novamente após atualizar a configuração de confidenceThreshold do projeto. Posteriormente, você precisará republicar o aplicativo para que o novo limite entre em vigor.

Normalização na versão do modelo 2023-04-15

Com a versão 2023-04-15 do modelo, a compreensão da linguagem coloquial fornece uma normalização na camada de inferência que não afeta o treinamento.

A camada de normalização normaliza as pontuações de confiança da classificação em um intervalo confinado. O intervalo selecionado atualmente é de [-a,a] em que "a" é a raiz quadrada do número de intenções. Como resultado, a normalização depende do número de intenções no aplicativo. Se o número de intenções for baixo, a camada de normalização terá um intervalo pequeno para trabalhar. Com um grande número de intenções, a normalização é mais eficaz.

Se essa normalização parecer não estar ajudando em termos das intenções que estão fora do escopo, na medida em que o limite de confiança puder ser usado para filtrar os enunciados fora do escopo, isso poderá estar relacionado ao número de intenções no aplicativo. Pense em adicionar mais intenções ao aplicativo. Ou, se estiver usando uma arquitetura orquestrada, pense em mesclar os aplicativos que pertencem ao mesmo domínio.

Depurar entidades compostas

As entidades são funções que emitem intervalos em sua entrada com um tipo associado. Um ou mais componentes definem a função. Você pode marcar os componentes conforme necessário e decidir se quer habilitar a configuração Combinar componentes. Quando você combina os componentes, todos os intervalos que se sobrepõem são mesclados em um único intervalo. Se a configuração não for usada, cada intervalo de componentes será emitido individualmente.

Para entender melhor o desempenho dos componentes individuais, você pode desabilitar a configuração e definir cada componente como Não obrigatório. Essa configuração permite que você inspecione os intervalos individuais emitidos e experimente remover componentes para que apenas componentes problemáticos sejam gerados.

Avaliar um modelo usando vários conjuntos de testes

Os dados em um projeto de compreensão da linguagem coloquial podem ter dois conjuntos de dados: um conjunto de testes e um conjunto de treinamento. Se você deseja utilizar vários conjuntos de teste para avaliar seu modelo, você poderá:

  • Dê nomes diferentes a seus conjuntos de testes (por exemplo, "teste1" e "teste2").
  • Exportar seu projeto para obter um arquivo JSON com seus parâmetros e configuração.
  • Use o JSON para importar um novo projeto. Renomeie seu segundo conjunto de testes desejado como "teste".
  • Treine o modelo para executar a avaliação usando seu segundo conjunto de testes.

Parâmetros personalizados para aplicativos de destino e aplicativos filhos

Se estiver usando aplicativos orquestrados, você talvez queira enviar substituições de parâmetros personalizados para vários aplicativos filhos. O campo targetProjectParameters permite que os usuários enviem um dicionário representando os parâmetros para cada projeto de destino. Por exemplo, considere um aplicativo orquestrador chamado Orchestrator orquestrando entre um aplicativo de compreensão da linguagem coloquial chamado CLU1 e um aplicativo personalizado de resposta a perguntas chamado CQA1. Se quiser enviar um parâmetro chamado "top" para o aplicativo de resposta a perguntas, você poderá usar o parâmetro anterior.

curl --request POST \
   --url 'https://<your-language-resource>.cognitiveservices.azure.com/language/:analyze-conversations?api-version=2022-10-01-preview' \
   --header 'ocp-apim-subscription-key: <your subscription key>' \
   --data '{
     "kind": "Conversation",
     "analysisInput": {
         "conversationItem": {
             "id": "1",
             "text": "Turn down the volume",
             "modality": "text",
             "language": "en-us",
             "participantId": "1"
         }
     },
     "parameters": {
         "projectName": "Orchestrator",
         "verbose": true,
         "deploymentName": "std",
         "stringIndexType": "TextElement_V8",
"targetProjectParameters": {
            "CQA1": {
                "targetProjectKind": "QuestionAnswering",
                "callingOptions": {
                    "top": 1
                }
             }
         }
     }
 }'

Copiar projetos entre recursos de linguagem

Muitas vezes, você pode copiar projetos de compreensão da linguagem coloquial de um recurso para outro usando o botão Copiar no Language Studio. Em alguns casos, pode ser mais fácil copiar projetos usando a API.

Primeiro, identifique o:

  • Nome do projeto de origem.
  • Nome do projeto de destino.
  • Recurso de idioma de origem.
  • Recurso de idioma de destino, que é para onde você quer copiá-lo.

Chame a API para autorizar a ação de cópia e obtenha os accessTokens para a operação de cópia real posteriormente.

curl --request POST \ 
  --url 'https://<target-language-resource>.cognitiveservices.azure.com//language/authoring/analyze-conversations/projects/<source-project-name>/:authorize-copy?api-version=2023-04-15-preview' \ 
  --header 'Content-Type: application/json' \ 
  --header 'Ocp-Apim-Subscription-Key: <Your-Subscription-Key>' \ 
  --data '{"projectKind":"Conversation","allowOverwrite":false}' 

Chame a API para concluir a operação de cópia. Use a resposta que você obteve anteriormente como o conteúdo.

curl --request POST \ 
  --url 'https://<source-language-resource>.cognitiveservices.azure.com/language/authoring/analyze-conversations/projects/<source-project-name>/:copy?api-version=2023-04-15-preview' \ 
  --header 'Content-Type: application/json' \ 
  --header 'Ocp-Apim-Subscription-Key: <Your-Subscription-Key>\ 
  --data '{ 
"projectKind": "Conversation", 
"targetProjectName": "<target-project-name>", 
"accessToken": "<access-token>", 
"expiresAt": "<expiry-date>", 
"targetResourceId": "<target-resource-id>", 
"targetResourceRegion": "<target-region>" 
}'

Abordar enunciados fora do domínio

Os clientes poderão usar a versão de configuração de treinamento recém-atualizada 2024-08-01-preview (anteriormente 2024-06-01-preview) se o modelo tiver baixa qualidade em enunciados fora do domínio. Um exemplo desse cenário com a configuração de treinamento padrão pode ser como o exemplo a seguir em que o modelo tem três intenções: Sports, QueryWeather e Alarm. Os enunciados de teste estão enunciados fora do domínio e o modelo os classifica como InDomain com uma pontuação de confiança relativamente alta.

Texto Intenção prevista Pontuação de confiança
"Quem construiu a Torre Eiffel?" Sports 0,90
"Eu pareço bem para você hoje?" QueryWeather 1,00
"Espero que você tenha uma boa noite." Alarm 0.80

Para resolver isso, use a versão 2024-08-01-preview da configuração criada especificamente para abordar essa questão e, ao mesmo tempo, manter uma qualidade razoavelmente boa nos enunciados InDomain.

curl --location 'https://<your-resource>.cognitiveservices.azure.com/language/authoring/analyze-conversations/projects/<your-project>/:train?api-version=2022-10-01-preview' \
--header 'Ocp-Apim-Subscription-Key: <your subscription key>' \
--header 'Content-Type: application/json' \
--data '{
      "modelLabel": "<modelLabel>",
      "trainingMode": "advanced",
      "trainingConfigVersion": "2024-08-01-preview",
      "evaluationOptions": {
            "kind": "percentage",
            "testingSplitPercentage": 0,
            "trainingSplitPercentage": 100
      }
}

Após a solicitação ser enviada, você poderá acompanhar o progresso do trabalho de treinamento no Language Studio como de costume.

Restrições:

  • O limite de pontuação None para o aplicativo (limite de confiança abaixo do qual topIntent é marcado como None) quando você usa essa configuração de treinamento deve ser definido como 0. Essa configuração é usada porque essa nova configuração de treinamento atribui uma determinada parte das probabilidades no domínio para fora do domínio para que o modelo não esteja incorretamente com excesso de confiança sobre enunciados no domínio. Como resultado, os usuários podem ver pontuações de confiança ligeiramente reduzidas para enunciados no domínio em comparação com a configuração de treinamento de prod.
  • Não recomendamos essa configuração de treinamento para aplicativos com apenas duas intenções, como IntentA e None, por exemplo.
  • Não recomendamos essa configuração de treinamento para aplicativos com um número baixo de enunciados por intenção. É altamente recomendável usar um mínimo de 25 enunciados por intenção.