Usando IA Generativa para Escrever e Executar Código Embarcado

Ari Mahpour
|  Criada: Maio 15, 2024  |  Atualizada: Julho 1, 2024
Usando IA Generativa para Escrever e Executar Código Embarcado

Em Como Construir uma Ação GPT Personalizada para Comunicar com o Seu Hardware e Construindo um Assistente de Laboratório com IA, aprendemos como controlar nosso hardware usando IA Generativa. Ao utilizar Ações GPT personalizadas dentro do ChatGPT, conseguimos dar ao ChatGPT a capacidade de não apenas fazer LEDs piscarem em um Raspberry Pi, mas também controlar e adquirir dados de instrumentos de laboratório. Isso significou que poderíamos usar a inteligência artificial como nosso assistente de laboratório e também processar dados para nós que ela adquiriu de nossos instrumentos. Neste artigo, estamos indo um passo além ao permitir que a IA Generativa não apenas escreva código para nós, mas também o execute em alvos embarcados e receba feedback no processo.

Contexto

Usar IA Generativa para escrever código, mesmo para sistemas embarcados, não é algo totalmente novo. Já existem inúmeras ferramentas sugerindo ou escrevendo código do zero. Modelos de Linguagem de Grande Escala mais populares, como ChatGPT, Gemini e Claude, tornaram-se bastante bons em escrever código (veja Gemini vs. ChatGPT: Quem Escreve Melhor Código? para uma comparação). Eu escrevo sobre o ChatGPT gerando código há mais de um ano agora (veja Usando ChatGPT para Testes Automatizados) e pregando que é a única maneira de desenvolver nos dias de hoje. O verdadeiro desafio é colocar a IA no ciclo do seu desenvolvimento.

A geração de código só te leva até certo ponto, mas ser capaz de validar e garantir que funciona requer uma abordagem diferente quando se trata de IA Generativa. Code Interpreter com ChatGPT fornece um ambiente Python encapsulado que pode, até certo ponto, executar o código gerado e validar que funciona para você. Eu queria ir além e ver se poderíamos alcançar o mesmo com sistemas embarcados. Existem dois caminhos que se poderia tomar com o ChatGPT da OpenAI. O caminho mais comum é criar uma aplicação de loop fechado que usa a API da OpenAI. Ela solicitaria e buscaria o código do Modelo de Linguagem de Grande Escala (LLM) usando a API, compilá-lo, carregá-lo no Arduino e usar código personalizado adicional para validar a funcionalidade do código gerado. Decidi tomar uma abordagem diferente usando Ações GPT para torná-lo mais uma "experiência de pareamento de código". É assim que essa experiência se parece:

Exemplo de Ação GPT

Figura 1: Exemplo de Ação GPT

Embora o exemplo possa ser trivial (ou seja, piscar um LED integrado) a demonstração acima resume tudo. Eu consegui dar instruções claras ao meu GPT personalizado e ele seguiu as direções exatamente como eu esperava. Também pude confirmar que, de fato, ele fez o upload para o meu dispositivo e piscou o LED a uma taxa de 1s. O bom de usar um GPT personalizado versus um sistema fechado é que posso iterar com bastante facilidade dentro do prompt:

Iterando no Sketch do Arduino

Figura 2: Iterando no Sketch do Arduino

Agora que você viu alguns exemplos, vamos ver como tudo isso funciona.

Como Funciona

Assim como vimos com outros artigos sobre GPT personalizado, a configuração de Ações GPT para este projeto é, mais ou menos, a mesma. O Dockerfile, Docker Compose, certificados SSL e a estrutura geral do repositório não mudaram muito. Claro que o código de design em si e o arquivo OpenAPI YAML são significativamente diferentes (como era de se esperar).

A maior mudança que acontece neste código (em comparação com exemplos anteriores) é que introduzimos um “subprocesso” em Python para chamar um programa externo, neste caso o Arduino IDE. Nosso arquivo OpenAPI YAML (openapi.yaml) é o que fornece a estrutura para o ChatGPT sobre quais informações devem ser entregues e como devem ser entregues. Olhando para a seção “components” no final do arquivo YAML, você notará as diferentes peças do objeto de retorno que estamos esperando:

  

components:

  schemas:

    CodeSnippet:

      type: object

      properties:

        language:

          type: string

        code:

          type: string

        description:

          type: string

          nullable: true

      required:

        - language

        - code

Pedimos ao ChatGPT para não apenas fornecer o código, mas também a linguagem e, opcionalmente, uma descrição desse código. Processamos essa carga útil em app.py. Mais importante do que apenas processar o comando é que também retornamos respostas HTTP significativas se algo der errado no processo. Isso ajuda a fornecer contexto e a falar a mesma "linguagem" que o servidor web/bot de IA do ChatGPT.

A implementação, embora um tanto rudimentar, é muito simples: despejamos o trecho de código em um arquivo INO temporário, verificamos e/ou carregamos para o Arduino e deletamos o arquivo INO temporário. Obviamente, há muitas maneiras de isso dar errado, incluindo uma quantidade insuperável de riscos de segurança. É extremamente importante, como sempre, limitar seu ambiente de desenvolvimento e, se abri-lo para o mundo externo, implementar todas as medidas de segurança necessárias para garantir que seu ambiente esteja seguro.

Apenas por diversão, também implementei um comando de leitura serial muito básico que dá à nossa Ação GPT personalizada a capacidade de ler da porta serial do Arduino. Isso nos permite validar que a porta serial está funcionando sem verificar manualmente a partir de nossa máquina. Um cenário de exemplo pode ser se você está pedindo ao ChatGPT para escrever e carregar código para o seu Arduino a partir do seu smartphone. Isso, claro, pode ser estendido para uma implementação serial do tipo get/set mais formal, onde você envia comandos e lê as respostas de volta pela serial (como implementado em Configurando um Projeto de Hardware em Loop).

Conclusão

Neste artigo, mostramos como a IA pode fazer mais do que apenas escrever código - ela também pode garantir que o código funcione executando-o em dispositivos reais. Isso é como ter um desenvolvedor que não apenas escreve seu projeto para você, mas também o testa para garantir que está correto. Com os exemplos que usamos, você pode ver como isso poderia mudar a maneira como criamos e testamos nossos projetos, tornando as coisas mais rápidas e fáceis. Todos os passos e códigos que usamos são compartilhados, então qualquer pessoa interessada pode experimentar e ver como a IA pode ajudar em seu trabalho.

Descubra mais sobre este projeto pioneiro e junte-se à evolução em: https://gitlab.com/ai-examples/ai-arduino-code-builder.

Sobre o autor

Sobre o autor

Ari is an engineer with broad experience in designing, manufacturing, testing, and integrating electrical, mechanical, and software systems. He is passionate about bringing design, verification, and test engineers together to work as a cohesive unit.

Recursos relacionados

Documentação técnica relacionada

Retornar a página inicial
Thank you, you are now subscribed to updates.