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.
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:
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:
Figura 2: Iterando no Sketch do Arduino
Agora que você viu alguns exemplos, vamos ver como tudo isso 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).
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.