В статьях Как создать пользовательское действие GPT для взаимодействия с вашим оборудованием и Создание лабораторного ассистента на базе ИИ мы узнали, как управлять нашим оборудованием с использованием генеративного ИИ. Используя пользовательские действия GPT в ChatGPT, мы смогли не только заставить мигать светодиоды на Raspberry Pi, но и управлять лабораторными приборами и собирать с них данные. Это означало, что мы могли использовать искусственный интеллект в качестве лабораторного ассистента, а также обрабатывать данные, полученные от наших приборов. В этой статье мы делаем шаг вперед, позволяя генеративному ИИ не только писать код для нас, но и выполнять его на встроенных целях и получать обратную связь в процессе.
Использование генеративного ИИ для написания кода, даже для встроенных систем, не является чем-то новым. Существует множество инструментов, которые уже предлагают или полностью пишут код с нуля. Большинство популярных моделей больших языков, таких как ChatGPT, Gemini и Claude, уже довольно хорошо справляются с написанием кода (см. Gemini против ChatGPT: Кто пишет код лучше? для сравнения). Я пишу о генерации кода с помощью ChatGPT уже более года (см. Использование ChatGPT для автоматизированного тестирования) и утверждаю, что это единственный способ разработки в наши дни. Настоящая задача - вовлечь ИИ в процесс вашей разработки.
Генерация кода это только начало, но для того, чтобы убедиться, что он работает, требуется другой подход, когда речь идет о генеративном ИИ. Интерпретатор кода с ChatGPT предоставляет инкапсулированную среду Python, которая, в определенной степени, может выполнять сгенерированный код и проверять его работоспособность для вас. Я хотел пойти дальше и посмотреть, сможем ли мы добиться того же с встроенными системами. Существует два пути, которые можно выбрать с ChatGPT от OpenAI. Наиболее распространенный путь - создать замкнутое приложение, использующее API OpenAI. Оно будет запрашивать и получать код от модели большого языка (LLM) с использованием API, компилировать его, загружать на Arduino и использовать дополнительный пользовательский код для проверки функциональности сгенерированного кода. Я решил выбрать другой подход, используя действия GPT, чтобы сделать это более похожим на «опыт парного программирования». Вот как это выглядит:
Рисунок 1: Пример действия GPT
Хотя пример может быть простым (т.е. мигание встроенным светодиодом), приведенная выше демонстрация объясняет все. Мне удалось дать четкие инструкции моему пользовательскому GPT, и он следовал указаниям точно так, как я ожидал. Я также смог подтвердить, что он действительно загрузился на мое устройство и заставил светодиод мигать с интервалом в 1 секунду. Хорошо то, что использование пользовательского GPT вместо замкнутой системы позволяет мне довольно легко итерировать внутри запроса:
Рисунок 2: Итерация над скетчем для Arduino
Теперь, когда вы видели некоторые примеры, давайте посмотрим, как это все работает.
Как и в случае с другими статьями о пользовательском GPT, настройка GPT Actions для этого проекта, в целом, остается прежней. Dockerfile, Docker Compose, SSL сертификаты и общая структура репозитория мало изменились. Конечно, сам код дизайна и файл OpenAPI YAML значительно отличаются (чего и следовало ожидать).
Самое большое изменение, которое происходит в этом коде (по сравнению с предыдущими примерами), заключается в том, что мы вводим «подпроцесс» на Python для вызова внешней программы, в данном случае Arduino IDE. Наш файл OpenAPI YAML (openapi.yaml) предоставляет структуру для ChatGPT о том, какая информация должна быть доставлена и как она должна быть доставлена. Посмотрев на раздел «components» в конце файла YAML, вы заметите различные части возвращаемого объекта, которые мы ожидаем:
components:
schemas:
CodeSnippet:
type: object
properties:
language:
type: string
code:
type: string
description:
type: string
nullable: true
required:
- language
- code
Мы попросили ChatGPT не только предоставить код, но и язык, а при необходимости и описание этого кода. Мы обрабатываем эти данные в app.py. Более важно, чем просто обработка команды, является то, что мы также возвращаем значимые HTTP-ответы, если что-то идет не так в процессе. Это помогает предоставить контекст и говорить на одном "языке" с веб-сервером/AI-ботом ChatGPT.
Реализация, хотя и довольно примитивная, очень проста: мы выгружаем фрагмент кода во временный INO-файл, проверяем и/или загружаем его в Arduino, а затем удаляем временный INO-файл. Очевидно, что при этом может произойти множество ошибок, включая непреодолимое количество рисков безопасности. Крайне важно, как всегда, ограничить вашу среду разработки и, если вы открываете ее для внешнего мира, реализовать все необходимые меры безопасности, чтобы обеспечить безопасность вашей среды.
Просто для развлечения я также реализовал очень базовую команду чтения по серийному порту, которая дает нашему пользовательскому действию GPT возможность читать из серийного порта Arduino. Это позволяет нам проверить работу серийного порта без ручной проверки с нашего компьютера. Пример сценария может быть, если вы просите ChatGPT написать и загрузить код на ваш Arduino со смартфона. Это, конечно, может быть расширено до более формальной реализации серийного ввода/вывода, где вы отправляете команды и читаете ответы через серийный порт (как реализовано в Настройка проекта с оборудованием в цикле).
В этой статье мы показали, как ИИ может делать больше, чем просто писать код - он также может убедиться, что код работает, запуская его на реальных устройствах. Это как иметь разработчика, который не только пишет ваш проект за вас, но и тестирует его, чтобы убедиться, что все правильно. С примерами, которые мы использовали, вы можете увидеть, как это может изменить способ создания и тестирования наших проектов, делая вещи быстрее и проще. Все шаги и код, которые мы использовали, поделены, так что любой заинтересованный может попробовать это и увидеть, как ИИ может помочь в их работе.
Узнайте больше об этом пионерском проекте и присоединяйтесь к эволюции на: https://gitlab.com/ai-examples/ai-arduino-code-builder.