90% мого Data Science-проєкту написав ШІ

Усі статті, обговорення, новини про AI — в одному місці. Підписуйтеся на DOU | AI!

Вітаю! Мене звати Сергій, і я — інженер з комп’ютерних систем. Нещодавно я загорівся ідеєю зібрати якомога більше даних з наявних під рукою пристроїв, і в реалізації цієї ідеї мені неабияк допоміг ChatGPT. Ось як це відбувалось.

У сучасному світі технології стають все більш доступними, що дозволяє нам розробляти дивовижні речі навіть за короткий проміжок часу. Мій проєкт WIFIDataLogger — саме такий приклад.

Ідея проєкту

Занурившись у Data Science, я замислився, де брати дані (саме справжні, а не синтетичні), або хоча б як їх згенерувати. Це наштовхнуло мене на ідею створити систему, яка може збирати дані про сигнали Wi-Fi та візуалізувати їх для подальшого аналізу.

Тут мені на допомогу прийшов ESP8266 — я працював з цим контролером в минулому і знав, що він може сканувати WiFi-мережі та передавати ці дані на комп’ютер GET-запитом.

Простими словами, мені було треба зробити примітивний інструмент для збору та візуалізації даних, щоб набути досвіду у цьому напрямі. Тож цей проєкт корисний, ймовірно, лише для мого знайомства з Data Science, проте це переросло у цікавий досвід.

Реалізація проєкту

Від ідеї до реалізації проєкту пройшло всього три дні.

Використані технології

Проєкт поєднує в собі кілька технологій:

  • Wi-Fi — я використовую наявну мережу для обміну інформацією між пристроєм та програмою;
  • Python та його бібліотеки для збору та візуалізації даних;
  • штучний інтелект, як інструмент для поєднання всіх цих технологій в одну систему.

Це була довга розмова. Я запустив ChatGPT на смартфоні та говорив голосом, а ШІ мені відповідав, пропонував код, який я з web-версії на комп’ютері одразу вставляв у середовище розробки. Це було дуже схоже на «екстремальне програмування», або навіть мозковий штурм.

Можна сказати, кожен раз я підштовхував AI до саме того варіанту реалізації, який би мене влаштував саме як розробника. Це не було щось на кшталт «Зроби Data Science за три дні» — я знав, чого хочу, тож з кожною реплікою направляв чат саме в потрібному мені напрямку. Ось фрагмент нашої бесіди:

User
Які дані можна зібрати вдома?
ChatGPT
Вдома можна зібрати різноманітні дані, наприклад:

Інформація про витрати: рахунки за комунальні послуги, квитанції з магазину, і таке інше.
Записи про фізичну активність: кількість кроків, час тренувань, вага.
Дані про їжу: список продуктів, споживана кількість, калорії.
Результати вимірювань: температура, вологість, якість сну, рівень шуму.
Ці дані можна використовувати для власного аналізу або навіть для створення власних проєктів у галузі Data Science.

User
Є такий контролер ESP8266.
ChatGPT
ESP8266 — це популярний контролер з підтримкою Wi-Fi, який часто використовується для розробки проєктів Інтернету речей (IoT). Які саме питання або інформацію ви хочете знати про нього?

User
Які дані з його допомогою я можу зібрати?
ChatGPT
За допомогою контролера ESP8266 можна зібрати різні дані з довкілля або пристроїв, які підключені до нього. Наприклад, ви можете збирати дані про температуру, вологість, рівень освітлення, рух або навіть стан різних пристроїв (наприклад, вимикачів, сенсорів руху тощо), які підключені до контролера. Ці дані можна використовувати для моніторингу довкілля, автоматизації різних процесів або для створення різноманітних IoT-проєктів.

User
Можна з його допомогою рівень сигналу всіх Wi-Fi точок, які мене оточують, зібрати.
ChatGPT
Так, з контролером ESP8266 можна сканувати навколишні Wi-Fi мережі і збирати інформацію про рівень сигналу, який вони мають. Ця інформація може бути корисною для аналізу якості Wi-Fi покриття в певній області або для інших цілей, таких як оптимізація розташування маршрутизаторів або пошук найкращої доступної мережі.

User
Ти можеш згенерувати код для ESP8266, який би відсилав дані по компорту.
ChatGPT
Звичайно! Ось приклад коду для ESP8266, який сканує доступні Wi-Fi мережі та відправляє інформацію про рівень сигналу через Serial порт...

User
Гаразд, мене влаштовує ця концепція. Тепер дивись, ESP8266 отримує від мого роутера Wi-Fi IP-адресу, яка є статичною і не буде мінятися. Тепер мені треба написати на Python програму, яка буде звертатися до ESP8266 за адресою та отримувати дані, їх записувати у файл...

User
Додай до програми на Python простий юзер-інтерфейс, де виводяться дані від ESP і лічильник записів.
ChatGPT

Звичайно, ось оновлений код Python з простим користувацьким інтерфейсом, який виводить дані від ESP і лічильник записів..

Далі обговорення дійшло до шматків коду, які з першого разу не виконувались. Я дивився та розбирався, як воно хоча б повинно було працювати, і відправляв чат-боту «правки». Зазначу, що до цього я робив подібні системи, де використовується саме програмно-апаратний комплекс, тому знаю, як повинні обмінюватись інформацією hardware та software-рішення. Внаслідок чотирьох-п’яти ітерацій, було розроблено ось такий фінальний код для ESP8266:


/*
  Tech01 simple python WiFi signal logger By Serhii Trush with MIT License.
  https://github.com/techn0man1ac/WIFIDataLogger
  Thank's ChatGPT for help.
  By Tech01 labs 2024.
*/
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <ArduinoJson.h> // ArduinoJson 7.0.4
const char* ssid = "YOUSSID";
const char* password = "YOUPASSWORD";
ESP8266WebServer server(80);
void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, 1); // LED off
  Serial.begin(115200);
  // Connect to Wi-Fi network
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi...");
  }
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
  // Start the web server
  server.on("/devices", HTTP_GET, handleDevices);
  server.begin();
  Serial.println("HTTP server started");
}
void loop() {
  server.handleClient();
  digitalWrite(LED_BUILTIN, 1); // LED off
}
void handleDevices() {
  // Create a dynamic JSON buffer
  DynamicJsonDocument jsonBuffer(1024);
  // Create a JSON array to store Wi-Fi network information
  JsonArray devices = jsonBuffer.createNestedArray("devices");
  // Scan Wi-Fi networks
  int numNetworks = WiFi.scanNetworks();
  // Add information about each device to the JSON array
  for (int i = 0; i < numNetworks; i++) {
    JsonObject device = devices.createNestedObject();
    device["ssid"] = WiFi.SSID(i);
    device["rssi"] = WiFi.RSSI(i);
  }
  digitalWrite(LED_BUILTIN, 0); // LED on
  // Send data in JSON format
  String response;
  serializeJson(jsonBuffer, response);
  server.send(200, "application/json", response);
}

Спочатку я просто генерував стрічку, куди записував по черзі SSID та рівень сигналу в циклі. Насамперед тому, що я довго не знав, яку структуру даних обрати. Тому першим варіантом був запис у текстовий файл рівня сигналу та імені точки доступу, типу цього:
"ssid",-70,"ssid",80,"ssid",-74, "ssid",86,

Проте я почав спілкуватись з людьми, котрі мають більше досвіду в роботі з даними, і вони мені порекомендувати записувати дані з timestamp (міткою часу) та у форматі JSON.

Згодом сам ChatGPT на одному з етапів запропонував використати бібліотеку ArduinoJson, яка взяла на себе формування структури даних для передачі їх через GET-запит мережею Wi-Fi.

І це був хороший вибір — питання формування структури даних, щоб потім передати її на сторону комп’ютера, та її опрацювання в Python відпало, бо тут все стандартизовано і є готові та зручні інструменти для роботи з JSON.

Проте я велосипед і справді винайшов, бо під час логування генерую не валідний JSON-файл — він повинен починатись та закінчуватись квадратними дужками, а я так і не придумав, як мені це зробити кожного разу коли починаю нове логування. Тому я попросив ШІ адаптував програму для візуалізації даних під цю особливість.

Software

Спочатку це була програма без інтерфейсу. Працювала вона так: просто прописуєш шлях до файлу, запускаєш і вона посилає GET-запит за прописаною в коді адресою — ШІ згенерував програму точнісінько так, як я йому сказав. Ось так виглядала «гола» програма суто для перевірки ідеї на справність:

import requests

def main():

    esp8266_ip = "192.168.1.100"  # IP-адреса ESP8266
    url = f"http://{esp8266_ip}/data"  # URL для отримання даних

    try:

        response = requests.get(url)
        if response.status_code == 200:
            data = response.text
            with open("data.txt", "a") as file:  # Відкриття файлу для додавання даних
                file.write(data + "\n")  # Запис даних на новому рядку
            print("Дані успішно додано до файлу data.txt")
        else:
            print(f"Помилка: {response.status_code}")
    except Exception as e:
        print(f"Помилка під час виконання запиту: {e}")


if __name__ == "__main__":

    main()

Так, всього 20 рядків коду, певно за це і люблять Python. Потім я зрозумів, що хочеться трохи зручності, і ми зі штучним інтелектом дійшли до примітивного інтерфейсу — ось так зараз виглядає програма main.py:

Візуалізація даних

Для візуалізації даних у цьому проєкті через visualization.py ми вибрали бібліотеку Matplotlib у сполученні з Tkinter для створення графічного інтерфейсу користувача (GUI).

Matplotlib — це потужна бібліотека для створення графіків та діаграм у Python, яка надає широкі можливості для відображення різноманітних типів даних. Вибір Matplotlib був зумовлений його простотою використання, багатим набором функцій та можливістю створювати високоякісні графіки.

Tkinter був обраний для створення GUI через свою простоту та вбудовану підтримку Python. Він дозволяє швидко створювати вікна, кнопки та інші елементи інтерфейсу, що дозволяє зосередитися на функціональності програми, не витрачаючи багато часу на розробку інтерфейсу.

Резюме проєкту

Отримані графіки — це саме те, що я хотів бачити з самого початку. А дані я продовжую накопичувати — можливо, вони мені знадобляться для якихось інших цілей, наприклад, захочу оптимізувати розташування роутера для якіснішого сигналу у всьому домі.

Проєкт реалізований у форматі опенсорс з використанням ліцензії MIT, що дозволяє іншим робити свій внесок у розвиток програми, або під’єднати ChatGPT для розвитку проєкту. Крім того, для розробки були використані виключно безкоштовні інструменти, чим я підкреслюю доступність та широкі можливості цих технологій для всіх охочих.

WIFIDataLogger — це мій перший досвід, коли я 90% роботи віддаю саме штучному інтелекту. Розкажіть про свій досвід, коли ШІ став не просто помічником, а повноцінним співавтором проєкту, у коментарях.

👍ПодобаєтьсяСподобалось5
До обраногоВ обраному2
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Щиро вдячний за статтю яка показує саме процес і образ мислення неофітів, буває непросто це уявити поглядом збоку.
З точки зору самого проекту... Ну нижче і вище і так накидають пояснень що не так, але у двох словах, між цим і промисловим ембеддедом — прірва, приблизно як між конструюванням повітряних зміїв і ейрбасом.

Да ладно, нормальний такий ІоТ ембедед, такий собі РоС.
Я так розумію, що промисловий ембедед, це з в бетонному цеху зимою у валянках, із обпаленими паяльником пальцями , з обценьками обмотаними синьою ізострічкою в одній кишені та китайським мультиметром в іншій... чи як?

p.s.
старпер би міг показати клас неофітам і накатати хоча би одну статтю на доу, щоб неофіти припухли і зрозуміли своє місце під сонцем

Промисловий embedded це круто, лакшері у світі розробки електроніки.

На те він і pet-проєкт, навчитись чомусь, зробити висновки

Заглянув в профіль, так це ж автор «вічного годинника»!

Так, мене там у коментарях запитали — як я підключаю AI у процес розробки. Це надихнуло написатиицю статтю.

замість клікбейтної реальна назва «90% мого петпроекту з Ардуіно зкопіпейстив ШІ»

Яркий пример оверинжиниринга от соверменных программистов. Сгенерировать Hello World проект с тучей зависимостей.
Заварачивание двух струк и целого числа в JSON потом пихать это в HTTP, потом пихать целый веб сервер. И все это на несчастном микроконтролере ESP8266, который изначально не предназначен для таких целей.
У тебя обработка get-запроса только выжрет всю производительность, тыщи тактов.
И дальше тоже самое, но только наоборот. Снова обработка ответа от get запроса, потом парсинг JSON. Потом выкусывания из JSON нужного поля, потом преобразования в число, чтобы потом просто нарисовать линии.
И все это с использованием глючного Python. И аргументация «всього 20 рядків коду» смешно звучит в 2024 году, когда есть Rust или Go.

Саме так, всі ці AI тулзи лиш для спалаху технологічного багаття, а далі експертизою підтримуєш його

щоп потянути ШІ в каждом утюгу то не хватін сотнєй нєфті Зємлі

Скоріше за все, ШІ буде дешевшати і дешевшати, стаючи все більше доступнішим, де доступність там і ефективність

ніби ж два роки тому АМД заявило, що закон Мура не працює

Знову? Загальна тенденція зберігається, попри всі негативні оцінки.

йой, це проект на 1К рядочків.

ЧатЖПТ/копайлот так і не став моїм помічником та/або співавтором.
Занадто обмежені розумові здібності у нього.
Підходить можливо у тому випадку коли зовсім не знаєш що писати і треба від чогось відштовхуватися

Саме так, коли є ідея, але незнаєш як її реалізувати.

Підозрілим є те, що ШІ генерує код, який навіть не пройде лінтер.

Так я і не просив про це, не чув про цей інструмент

він не генерує, а копіпейстить із репо петпроектів різних джунів та студентів, буває зхрещує їжака та вужа

О так, саме тому від мене, як від розробника, треба експертиза, щоб бачити ці речі

гиги, про що й мова, ждуну не поможе, а помідору уже не надо, потенційну яму мідла мало хто зможе

ChatGPT замість stackoferflow, а казали, що АІ звільнить всіх програмістів

Мій досвід показує, що не звільнить а навпаки — буде одним з інструментів

мій досвід показує, що в stackoferflow можна прочитати тред і перебрати варіанти і знайти те рішення, яке влаштує, а ChatGPT, це як «мені повезе» в гугл пошуку, якщо питання складніше джунівського, то скоріше за все «не повезе», а потім виявиться, що це такий собі був експромт «а давай щось кретивно нагенерю своїм штучним інтелектом із того що знайдено в інеті, авось працюватиме»
більше схоже на студента біля дошки, «що не знає то добреше»

Правильно поставлене питання — 50% відповіді.

Пробував написати статю повністю з ChatGPT, але ну дуже синтетично виглядає. Лишився тільки план для статті, все інше я написав сам.

Все вищесказане про проєкт, актуальне для V0.1, поки стаття чекала публікації, я провів апгрейд до V0.2, концептуально відбулися такі зміни:
0) Створено локальний web-сервер(використовуючи фреймворку Flask);
1) Створено базу даних (*.db) з використання бібліотеки SQLite, куди записується згенерований рівень сигналу та ім’я точки доступу у форматі JSON(на стороні ESP8266);
3) ESP8266 генерує запит у форматі POST, віддаючи web-серверу таким чином дані;
4)Програма візуалізації відкриває базу даних у форматі «*.db».

Підписатись на коментарі