Práticas de DevOps para LUIS

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.

Os engenheiros de software que estão desenvolvendo um aplicativo de Reconhecimento Vocal (LUIS) podem aplicar práticas DevOps sobre controle do código-fonte, compilações automatizadas, testes e gerenciamento de versão seguindo estas diretrizes.

Controle do código-fonte e estratégias de branch do LUIS

Um dos principais fatores dos quais o sucesso do DevOps depende é o controle do código-fonte. Um sistema de controle do código-fonte permite que os desenvolvedores colaborem no código e acompanhem as alterações. O uso de ramificações permite que os desenvolvedores alternem entre diferentes versões da base de código e trabalhem independentemente de outros membros da equipe. Quando os desenvolvedores acionam uma PR (solicitação de pull) para propor atualizações de uma ramificação para outra, ou quando as alterações são mescladas, elas podem ser o gatilho para compilações automatizadas compilarem e testarem o código de forma contínua.

Usando os conceitos e as diretrizes descritas neste documento, você pode desenvolver um aplicativo LUIS enquanto controla as alterações em um sistema de controle do código-fonte, e seguir estas práticas recomendadas de engenharia de software:

  • Controle do código-fonte

    • O código-fonte do aplicativo LUIS está em formato legível por humanos.
    • O modelo pode ser criado a partir da fonte de maneira repetível.
    • O código-fonte pode ser gerenciado por um repositório de código-fonte.
    • Credenciais e segredos, como chaves, nunca são armazenados no código-fonte.
  • Ramificação e Mesclagem

    • Os desenvolvedores podem trabalhar de ramificações independentes.
    • Os desenvolvedores podem trabalhar em diversas ramificações simultaneamente.
    • É possível integrar alterações a um aplicativo LUIS de uma ramificação para outra através da troca de base ou mesclagem.
    • Os desenvolvedores podem mesclar uma PR à ramificação pai.
  • Controle de versão

    • Cada componente em um aplicativo grande deve ter a versão controlada de forma independente, permitindo que os desenvolvedores detectem atualizações ou alterações interruptivas apenas observando o número de versão.
  • Revisões de Código

    • As alterações na PR são apresentadas como código-fonte legível por humanos que pode ser revisado antes de aceitar a PR.

Controle do código-fonte

Para manter a Definição do esquema do aplicativo de um aplicativo de LUIS em um sistema de gerenciamento de código-fonte, use a representação no formato LUDown (.lu) do aplicativo. O formato .lu é preferível ao formato .json por ser legível por humanos, o que facilita a criação e revisão de alterações nas PRs.

Salvar um aplicativo LUIS usando o formato LUDown

Para salvar um aplicativo LUIS no formato .lu e colocá-lo sob o controle do código-fonte:

  • VOCÊ PODE: exportar a versão do aplicativo como .lu do portal do LUIS e adicioná-la ao repositório de controle do código-fonte

  • OU: usar um editor de texto para criar um arquivo .lu para um aplicativo LUIS e adicioná-lo ao repositório de controle do código-fonte

Dica

Se você estiver trabalhando com a exportação JSON de um aplicativo LUIS, poderá convertê-la em LUDown. Use a opção --sort para garantir que as intenções e os enunciados sejam classificados em ordem alfabética.
Observe que a funcionalidade de exportação .LU criada no portal do LUIS já classifica a saída.

Compilar o aplicativo LUIS da fonte

No aplicativo LUIS, compilar com base na fonte significa criar uma versão do aplicativo LUIS por meio da importação da fonte .lu para treinar a versão e publicá-la. Você pode fazer isso no portal do LUIS ou na linha de comando:

Arquivos a serem mantidos sob controle do código-fonte

Os seguintes tipos de arquivos para seu aplicativo LUIS devem ser mantidos sob controle do código-fonte:

Credenciais e chaves não são verificadas

Não inclua chaves ou valores confidenciais semelhantes em arquivos que você coloca no repositório, pois eles podem ficar visíveis para pessoas não autorizadas. As chaves e outros valores que você deve evitar fazer check-in incluem:

  • Chaves de Criação e Previsão do LUIS
  • Pontos de extremidade de Criação e Previsão do LUIS
  • Chaves de recurso do Azure
  • Tokens de acesso, como o token para uma entidade de serviço do Azure usada para autenticação de automação

Estratégias para gerenciar segredos com segurança

As estratégias para gerenciar segredos com segurança incluem:

  • Se você estiver usando o controle de versão do Git, você poderá armazenar segredos de runtime em um arquivo local e impedir o check-in do arquivo adicionando um padrão para corresponder o nome do arquivo a um arquivo .gitignore
  • Em um fluxo de trabalho de automação, você pode armazenar segredos com segurança na configuração de parâmetros oferecida por essa tecnologia de automação. Por exemplo, se você estiver usando o GitHub Actions, você poderá armazenar segredos com segurança em segredos do GitHub.

Ramificação e mesclagem

Sistemas de controle de versão distribuídos, como o Git, oferecem flexibilidade em como os membros da equipe publicam, compartilham, analisam e iteram as alterações de código por meio de ramificações de desenvolvimento compartilhadas com outras pessoas. Adote uma Estratégia de ramificação do Git apropriada para sua equipe.

Um princípio fundamental de qualquer estratégia de ramificação que você adotar é que os membros da equipe podem trabalhar na solução dentro de uma ramificação de recursos independentemente do trabalho sendo feito em outras ramificações.

Para dar suporte ao trabalho independente em ramificações com um projeto LUIS:

  • A ramificação principal possui seu próprio aplicativo LUIS. Esse aplicativo representa o estado atual da sua solução para seu projeto, e sua versão ativa atual sempre deve mapear para a origem .lu que está na ramificação principal. Todas as atualizações para a origem .lu desse aplicativo devem ser revisadas e testadas para que esse aplicativo possa ser implantado para compilar ambientes como Produção a qualquer momento. Quando as atualizações para .lu são mescladas para a ramificação principal da ramificação de recursos, você deve criar uma nova versão no aplicativo LUIS e trocar o número de versão.

  • Cada ramificação de recursos deve usar sua própria instância de um aplicativo LUIS. Os desenvolvedores trabalham com esse aplicativo em uma ramificação de recursos sem o risco de afetar os desenvolvedores que estão trabalhando em outras ramificações. Esse aplicativo 'ramificação de desenvolvimento' é uma cópia funcional que deve ser excluída quando a ramificação de recursos for excluída.

Ramificação de recursos do Git

Os desenvolvedores podem trabalhar de ramificações independentes

Os desenvolvedores podem trabalhar nas atualizações em um aplicativo LUIS independentemente de outras ramificações:

  1. Criando uma ramificação de recursos da ramificação principal (dependendo da sua estratégia de ramificação, geralmente principal ou de desenvolvimento).

  2. Crie um novo aplicativo LUIS no portal do LUIS (o "aplicativo de ramificação de desenvolvimento") exclusivamente para dar suporte ao trabalho na ramificação de recursos.

    • Se a fonte .lu da sua solução já existir na ramificação por ter sido salva após o trabalho feito anteriormente em outra ramificação no projeto, crie seu aplicativo LUIS da ramificação de desenvolvimento importando o arquivo .lu.

    • Se você estiver começando a trabalhar em um novo projeto, você ainda não terá a fonte .lu do aplicativo LUIS principal no repositório. Você criará o arquivo .lu exportando seu aplicativo de ramificação de desenvolvimento do portal quando tiver concluído o trabalho da ramificação de recursos, e o enviará como parte de sua PR.

  3. Trabalhe na versão ativa do aplicativo de ramificação de desenvolvimento para implementar as alterações necessárias. Recomendamos que você trabalhe apenas em uma única versão do aplicativo de ramificação de desenvolvimento em todo o trabalho da ramificação de recursos. Se você criar mais de uma versão em seu aplicativo de ramificação de desenvolvimento, tenha cuidado para acompanhar qual versão contém as alterações que você deseja fazer check-in ao gerar sua PR.

  4. Testar as atualizações - consulte Teste para DevOps do LUIS para obter detalhes sobre como testar seu aplicativo de ramificação de desenvolvimento.

  5. Exporte a versão ativa do aplicativo de ramificação de desenvolvimento como .lu na lista de versões.

  6. Verifique suas atualizações e convide a revisão em pares de suas atualizações. Se estiver usando o GitHub, você irá gerar uma solicitação de pull.

  7. Quando as alterações forem aprovadas, mescle as atualizações na ramificação principal. Neste momento você criará uma nova versão do aplicativo LUIS principal, usando o .lu atualizado na principal. Consulte Controle de versão para obter as considerações sobre como definir o nome da versão.

  8. Quando a ramificação de recursos for excluída, é aconselhável excluir o aplicativo LUIS de ramificação de desenvolvimento que você criou para o trabalho de ramificação de recursos.

Os desenvolvedores podem trabalhar em diversas ramificações simultaneamente

Se você seguir o padrão descrito acima em Os desenvolvedores podem trabalhar de ramificações independentes, você usará um aplicativo LUIS exclusivo em cada ramificação de recursos. Um único desenvolvedor pode trabalhar em várias ramificações simultaneamente, desde que mude para o aplicativo LUIS de ramificação de desenvolvimento correto para a ramificação na qual ele está trabalhando no momento.

Recomendamos que você use o mesmo nome para a ramificação de recursos e para o aplicativo LUIS de ramificação de desenvolvimento que você criar para o trabalho de ramificação de recursos, para reduzir a possibilidade de você trabalhar acidentalmente no aplicativo errado.

Conforme mencionado acima, recomendamos que, para simplificar, você trabalhe em uma única versão em cada aplicativo de ramificação de desenvolvimento. Se você estiver usando várias versões, tome cuidado para ativar a versão correta conforme alterna entre aplicativos de ramificação de desenvolvimento.

Vários desenvolvedores podem trabalhar na mesma ramificação simultaneamente

Você pode dar suporte a vários desenvolvedores que trabalham na mesma ramificação de recursos ao mesmo tempo:

  • Os desenvolvedores verificam a mesma ramificação de recursos e as alterações por push e pull enviadas por eles e outros desenvolvedores enquanto o trabalho continua normalmente.

  • Se você seguir o padrão descrito acima em Os desenvolvedores podem trabalhar de ramificações independentes, esta ramificação usará um aplicativo LUIS exclusivo para dar suporte ao desenvolvimento. Esse aplicativo LUIS de “ramificação de desenvolvimento” será criado pelo primeiro membro da equipe de desenvolvimento que começa a trabalhar na ramificação de recursos.

  • Adicione membros da equipe como colaboradores ao aplicativo LUIS de ramificação de desenvolvimento.

  • Quando o trabalho de ramificação de recursos for concluído, exporte a versão ativa do aplicativo LUIS de ramificação de desenvolvimento como .lu na lista versões, salve o arquivo .lu atualizado no repositório e faça check-in e PR das alterações.

Incorporando alterações de uma ramificação para outra com a troca de base ou mesclagem

Outros desenvolvedores da sua equipe que trabalham em outra ramificação podem ter feito atualizações na origem .lu e mesclado as mesmas na ramificação principal após a criação da ramificação de recursos. Você pode desejar incorporar suas alterações em sua versão de trabalho antes de continuar fazendo alterações na sua ramificação de recursos. Você pode fazer isso trocando a base ou mesclando para a principal da mesma forma que qualquer outro ativo de código. Como o aplicativo LUIS no formato LUDown é legível por humanos, ele dá suporte à mesclagem usando ferramentas de mesclagem padrão.

Siga estas dicas se estiver trocando a base do seu aplicativo LUIS em uma ramificação de recurso:

  • Antes de trocar a base ou mesclar, verifique se sua cópia local da fonte .lu do seu aplicativo possui todas as alterações mais recentes que você aplicou usando o portal do LUIS, exportando novamente, em primeiro lugar, seu aplicativo do portal. Dessa forma, você pode garantir que todas as alterações feitas no portal e ainda não exportadas não sejam perdidas.

  • Durante a mesclagem, use ferramentas padrão para resolver quaisquer conflitos de mesclagem.

  • Após a conclusão da troca de base ou mesclagem, não se esqueça de importar novamente o aplicativo de volta para o portal para que você trabalhe com o aplicativo atualizado enquanto continua aplicando suas próprias alterações.

Mesclar PRs

Depois que sua PR for aprovada, você poderá mesclar suas alterações em sua ramificação principal. Nenhuma consideração especial se aplica à fonte do LUDown para um aplicativo LUIS: é legível por humanos e, portanto, dá suporte à mesclagem usando ferramentas de Mesclagem padrão. Quaisquer conflitos de mesclagem podem ser resolvidos da mesma maneira usada em outros arquivos de origem.

Depois que sua PR for mesclada, é recomendável limpar:

  • Excluir a ramificação em seu repositório

  • Exclua o aplicativo LUIS de “ramificação de desenvolvimento” criado para o trabalho de ramificação de recurso.

Da mesma forma que ocorre com os ativos de código do aplicativo, você deve escrever testes de unidade para acompanhar as atualizações do aplicativo LUIS. Você deve empregar fluxos de trabalho de integração contínua para testar:

  • Atualizações em uma PR antes da PR ser mesclada
  • O aplicativo LUIS da ramificação principal após uma PR foi aprovado e as alterações foram mescladas na principal.

Para obter mais informações sobre o teste do LUIS DevOps, consulte Teste do DevOps do LUIS. Para obter mais detalhes sobre como implementar fluxos de trabalho, consulte Fluxos de trabalho de automação para LUIS DevOps.

Revisões de código

Um aplicativo LUIS no formato LUDown é legível por humanos, que dá suporte à comunicação de alterações em uma PR, adequada para revisão. Os arquivos de teste de unidade também são escritos no formato LUDown, e também podem ser facilmente revisados em uma PR.

Controle de versão

Um aplicativo consiste em vários componentes que podem incluir bot em execução no Serviço de Bot da IA do Azure, QnA Maker, Serviço de Fala da IA do Azure e muito mais. Para obter aplicativos acoplados de forma flexível, use o controle de versão para que cada componente de um aplicativo tenha uma versão independente, permitindo que os desenvolvedores detectem alterações de rompimento ou atualizações apenas examinando o número de versão. É mais fácil fazer o controle de versão do seu aplicativo LUIS independentemente de outros componentes, se você o mantiver em seu próprio repositório.

O aplicativo LUIS da ramificação principal deve ter um esquema de controle de versão aplicado. Ao mesclar atualizações no .lu para um aplicativo LUIS na principal, você importará essa fonte atualizada para uma nova versão no aplicativo LUIS para a ramificação principal.

É recomendável que você use um esquema de controle de versão numérico para a versão principal do aplicativo LUIS, por exemplo:

major.minor[.build[.revision]]

Cada atualização do número de versão é incrementada no último dígito.

A versão principal / secundária pode ser usada para indicar o escopo das alterações na funcionalidade do aplicativo LUIS:

  • Versão Principal: uma alteração significativa, como suporte para uma nova Intenção ou Entidade
  • Versão Secundária: uma alteração secundária compatível com versões anteriores, como após um novo treinamento significativo
  • Compilação: nenhuma alteração de funcionalidade, apenas uma compilação diferente.

Depois de determinar o número de versão da revisão mais recente do seu aplicativo LUIS principal, você precisará compilar e testar a nova versão do aplicativo e publicá-la em um ponto de extremidade onde ela possa ser usada em diferentes ambientes de compilação, como Garantia de Qualidade ou Produção. É altamente recomendável que você automatize todas essas etapas em um fluxo de trabalho de CI (integração contínua).

Consulte:

Controle de versão do aplicativo LUIS de “ramificação de recurso”

Quando você estiver trabalhando com um aplicativo LUIS de “ramificação de desenvolvimento” que você criou para dar suporte ao trabalho em uma ramificação de recursos, você exportará seu aplicativo quando seu trabalho for concluído e você incluirá o 'lu atualizado em sua PR. A ramificação em seu repositório e o aplicativo LUIS de “ramificação de desenvolvimento” devem ser excluídos após a PR ser mesclada na principal. Como esse aplicativo existe apenas para dar suporte ao trabalho na ramificação de recursos, não há nenhum esquema de controle de versão específico a ser aplicado nesse aplicativo.

Quando as alterações na sua PR são mescladas na principal, isso ocorre quando o controle de versão deve ser aplicado, de modo que todas as atualizações para a principal tenham controle de versão de forma independente.

Próximas etapas