Usando IA Generativa para Escribir y Ejecutar Código Embebido

Ari Mahpour
|  Creado: Mayo 15, 2024  |  Actualizado: Julio 1, 2024
Usando IA Generativa para Escribir y Ejecutar Código Embebido

En Cómo construir una acción GPT personalizada para comunicarte con tu hardware y Construyendo un asistente de laboratorio con IA, aprendimos cómo controlar nuestro hardware usando IA generativa. Al utilizar acciones GPT personalizadas dentro de ChatGPT, pudimos darle a ChatGPT la capacidad de no solo hacer parpadear LEDs en un Raspberry Pi, sino también controlar y adquirir datos de instrumentos de laboratorio. Esto significaba que podríamos usar la inteligencia artificial como nuestro asistente de laboratorio y también procesar datos por nosotros que adquirió de nuestros instrumentos. En este artículo vamos un paso más allá al permitir que la IA generativa no solo escriba código por nosotros, sino que también lo ejecute en objetivos embebidos y reciba retroalimentación en el proceso.

Antecedentes

Usar IA generativa para escribir código, incluso para sistemas embebidos, no es algo completamente nuevo. Ya existen una miríada de herramientas que sugieren o escriben completamente código desde cero. Los modelos de lenguaje grande más populares, como ChatGPT, Gemini y Claude, se han vuelto bastante buenos escribiendo código (ver Gemini vs. ChatGPT: ¿Quién escribe mejor código? para una comparación). He estado escribiendo sobre la generación de código por ChatGPT durante más de un año ahora (ver Usando ChatGPT para pruebas automatizadas) y predicando que es la única manera de desarrollar en estos días. El verdadero desafío es conseguir que la IA participe en tu desarrollo.

La generación de código solo te lleva hasta cierto punto, pero ser capaz de validar y asegurar que funciona requiere un enfoque diferente cuando se trata de IA generativa. Code Interpreter con ChatGPT proporciona un entorno Python encapsulado que puede, hasta cierto punto, ejecutar código generado y validar que funciona para ti. Quería llevarlo un paso más allá y ver si podríamos lograr lo mismo con sistemas embebidos. Hay dos rutas que uno podría tomar con ChatGPT de OpenAI. La ruta más común es crear una aplicación de bucle cerrado que use la API de OpenAI. Esto implicaría solicitar y obtener el código del Modelo de Lenguaje Grande (LLM) usando la API, compilarlo, cargarlo en el Arduino y usar código personalizado adicional para validar la funcionalidad del código generado. Decidí tomar un enfoque diferente usando acciones GPT para hacerlo más como una "experiencia de emparejamiento de código". Así es como se ve esa experiencia:

Ejemplo de acción GPT

Figura 1: Ejemplo de acción GPT

Aunque el ejemplo puede ser trivial (es decir, hacer parpadear un LED integrado) la demostración anterior lo resume todo. Pude dar instrucciones claras a mi GPT personalizado y siguió las direcciones exactamente como esperaba. También pude confirmar que, de hecho, se cargó en mi dispositivo y hizo parpadear el LED a una tasa de 1s. Lo bueno de usar un GPT personalizado versus un sistema de bucle cerrado es que puedo iterar bastante fácilmente dentro del prompt:

Iterando en el Sketch de Arduino

Figura 2: Iterando en el Sketch de Arduino

Ahora que has visto algunos ejemplos, veamos cómo funciona todo esto.

Cómo Funciona

Al igual que hemos visto con otros artículos de GPT personalizado, la configuración de GPT Actions para este proyecto es, más o menos, la misma. El Dockerfile, Docker Compose, los certificados SSL y la estructura general del repositorio no han cambiado mucho. Por supuesto, el código de diseño en sí y el archivo OpenAPI YAML son significativamente diferentes (como era de esperarse).

El cambio más grande que ocurre en este código (versus ejemplos anteriores) es que introducimos un “subproceso” en Python para llamar a un programa externo, en este caso el IDE de Arduino. Nuestro archivo OpenAPI YAML (openapi.yaml) es lo que proporciona la estructura a ChatGPT sobre qué información debe ser entregada y cómo debe serlo. Mirando la sección de “componentes” al final del archivo YAML notarás las diferentes piezas del objeto de retorno que estamos esperando:

  

componentes:

  esquemas:

    FragmentoDeCódigo:

      tipo: objeto

      propiedades:

        lenguaje:

          tipo: cadena

        código:

          tipo: cadena

        descripción:

          tipo: cadena

          nulable: verdadero

      requerido:

        - lenguaje

        - código

Hemos pedido a ChatGPT que no solo entregue el código, sino también el lenguaje y, opcionalmente, una descripción de ese código. Procesamos esa carga de trabajo en app.py. Más importante que solo procesar el comando es que también devolvemos respuestas HTTP significativas si algo se rompe en el proceso. Esto ayuda a proporcionar contexto y hablar el mismo "idioma" que el servidor web/bot de IA de ChatGPT.

La implementación, aunque algo rudimentaria, es muy simple: volcamos el fragmento de código a un archivo INO temporal, verificamos y/o lo cargamos al Arduino y eliminamos el archivo INO temporal. Hay, obviamente, tantas maneras en que esto puede salir mal, incluyendo una cantidad insuperable de riesgos de seguridad. Es extremadamente importante, como siempre, limitar tu entorno de desarrollo y, si lo abres al mundo exterior, implementar todas las medidas de seguridad necesarias para asegurar que tu entorno sea seguro.

Solo por diversión, también he implementado un comando de lectura serial muy básico que le da a nuestra Acción GPT personalizada la capacidad de leer desde el puerto serial del Arduino. Esto nos permite validar que el puerto serial está funcionando sin verificar manualmente desde nuestra máquina. Un escenario de ejemplo podría ser si le estás pidiendo a ChatGPT que escriba y cargue código a tu Arduino desde tu smartphone. Esto, por supuesto, se puede extender a una implementación serial de tipo get/set más formal donde envías comandos y lees respuestas a través del serial (como se implementa en Configurando un Proyecto de Hardware en el Bucle).

Conclusión

En este artículo, mostramos cómo la IA puede hacer más que solo escribir código - también puede asegurarse de que el código funcione ejecutándolo en dispositivos reales. Es como tener un desarrollador que no solo escribe tu proyecto por ti, sino que también lo prueba para asegurarse de que esté correcto. Con los ejemplos que usamos, puedes ver cómo esto podría cambiar la forma en que creamos y probamos nuestros proyectos, haciendo las cosas más rápidas y fáciles. Todos los pasos y el código que usamos se comparten, así que cualquiera interesado puede probarlo y ver cómo la IA podría ayudar en su trabajo.

Descubre más sobre este proyecto pionero y únete a la evolución en: https://gitlab.com/ai-examples/ai-arduino-code-builder.

Sobre el autor / Sobre la autora

Sobre el autor / Sobre la autora

Ari es un ingeniero con una amplia experiencia en diseño, fabricación, pruebas e integración de sistemas eléctricos, mecánicos y de software. Le apasiona integrar a los ingenieros de diseño, de verificación y de pruebas para que trabajen juntos como una unidad cohesiva.

Recursos Relacionados

Documentación técnica relacionada

Volver a la Pàgina de Inicio
Thank you, you are now subscribed to updates.