Tekoälyä tulee käytettyä työtehtävissä päivittäin, mutta se on enimmäkseen pienten asioiden ratkomista.
Päätin kokeilla, miten onnistuu kokonaisen uuden pilvinatiivin järjestelmän toteutus pelkästään AI-työkaluja käyttämällä. Kaikki koodi (tai ainakin 95%) oli siis tarkoitus tuottaa tekoälyä komentamalla.
Tässä artikkelissa kerron kokemuksia projektista.
Projektin tarkoitus
Projektin päätarkoitus oli tosiaan kokeilla, miten AI:lla onnistuu isojen kokonaisuuksien toteutus.
Mutta oli projektilla muitakin tavoitteita. Halusin oppia lisää AWS-pilven käytöstä ja erityisesti AWS:n jonoratkaisusta, SQS:stä. Lisäksi halusin hyödyntää infran pystyttämisessä alusta alkaen AWS:n Infra as Code -ratkaisua: AWS CDK:ta.
Jonkin aikaa mielessä on pyörinyt idea Tampereen seudun liikennemäärien tarkkailujärjestelmästä. Digitrafficin tieliikenteen LAM-tietojen (Liikenteen Automaattiset Mittaustiedot) rajapintoihin olen perehtynyt joskus aikaisemmin joten tiesin jo valmiiksi millaista dataa sieltä suunnilleen olisi saatavilla. Tietolähteenä tulisi siis olemaan Digitrafficin keräämät liikennemäärät ja nopeudet Tampereen seudulta.
Järjestelmän ideaksi tuli seuraava: teen automaattisen ”data-kerääjän”, joka hakee kerran tunnissa tietoja Tampereen alueen liikennemääristä ja tallentaa tiedot tietokantaan. Lisäksi toteutan käyttöliittymän, joka esittää kerättyjä tietoja jalostettuna ja graafisesti. Vaatimuksena oli pilvinatiivi toteutus ja Infra as Code -ratkaisulla pystytettävä infra.
Työkalut
Käytin koodauksessa seuraavia työkaluja:
- Visual Studio Code – Insiders Edition v. 1.98 (sisältää virallisessa versiossa julkaisemattomia ominaisuuksia)
- Copilot Edits + Agent Mode
Kokonaisen järjestelmän rakentamisessa Agent Mode on ehdoton valinta. Agent Modessa koodieditori osaa ajaa myös tarvittavia komentoja, kuten asentaa tarvittavia paketteja npm install -komennolla. Agent Modessa Copilot myös huomaa itse virheitä, mitä ohjelmakoodiin on syntynyt ja voi tehdä iteratiivista kehitystä, parannellen itse tuottamiaan ratkaisuja. Tätä kirjoitettaessa Agent Mode on juuri tuloillaan myös VS Code -editorin viralliseen julkaisuun, mutta VS Code Insiders -versiossa se on ollut käytettävissä jo jonkin aikaa.
Käytetyt AI-kielimallit
AI-kielimalleista parasta jälkeä tuotti mielestäni Claude 3.7 Sonnet (Preview). Käytin sitä mahdollisimman paljon. Valitettavasti siinä on määrällisiä käyttörajoituksia ja välillä käyttörajoitus meni päälle. Silloin piti vain vaihtaa GPT-4o -malliin hetkeksi aikaa. Kyllä sekin tuntui lähes yhtä hyvin toimivan.
Projektin teknologiat
Ennen projektin aloitusta olin jo miettinyt valmiiksi, mitä pääteknologioita haluaisin projektissa käytettävän.
Halusin, että järjestelmä on ns. pilvinatiivi eli kaikki tarvittavat palvelut pyörisivät AWS-pilvessä.
Backend -osuus toteutettaisiin AWS:n Lambda-funktioilla ja lisäksi hyödynnettäisiin oppimistarkoituksessa AWS SQS (Simple Queue Service) -jonopalvelua, jonne mittausdataa lähetettäisiin ja sieltä se luettaisiin tietokantaan.
Frontend -osuus toteutettaisiin Reactilla ja projekti muodostettaisiin Vite:llä. Frontendissä tultaisiin käyttämään graafisia elementtejä datan esittämiseen sekä mahdollisesti karttaa mittauspisteiden sijainnin esittämiseen.
Infra pystytettäisiin AWS CDK:lla, jota olen aikaisemmin opiskellut UDemy -kurssilla.
Arkkitehtuuri
Ennen toteutuksen aloittamista mielessä oli alustava suunnitelma backendin rakenteesta.
Backendillä tulisi olemaan kaksi tehtävää:
- tietojen kerääminen ja tallennus automaattisesti
- REST rajapinta jalostetun tiedon hakemiseen
Frontend puolestaan lukee tallennettua dataa järjestelmän omasta tietokannasta ja esittää dataa graafisesti.
Collector tietojenkeräysfunktio ajetaan kerran tunnissa ja se lähettää kerätyt tiedot SQWS jonoon.
Processor -funktio puolestaan lukee tiedot jonosta ja tallentaa ne DynamoDB -tietokantaan.
Palvelut kirjoittavat lokeja CloudWatch-lokienhallintaan.
Käyttäjän selain lukee dataa REST-rajapinnan kautta, joka tarjotaan API Gatewayn kautta.
Selainsovellus on tallennettu S3-buckettiin, joka on julkaistu Cloudfront-jakelun kautta.
Selainsovellus hakee tietoja myös suoraan Digitrafficin palvelusta, koska kaikkea perustietoa ei ole tallennettu järjestelmän omaan tietokantaan. Esimerkiksi lista mittausasemista kannattaa hakea suoraan Digitrafficin palvelusta. Sieltä voi myös kysyä yksittäisen mittausaseman tarkemmat tiedot asemakohtaisesti.
Kokemuksia
Projekti lähti käyntiin AWS CDK:n kautta, backend edellä. Kuvasin järjestelmän arkkitehtuurin muutamalla lauseella ja Copilot alkoi rakentamaan infraa.
AWS CDK:n koodi on varsin luettavaa ja yksinkertaista, mutta siinä pitää tiedostaa eri komponenttien väliset riippuvuudet ja komponenttien käyttöoikeudet. Copilot rakensi infran rungon varsin nopeasti. Siihen kuului Collector-lambda, SQS jono, Processor-lambda ja DynamoDB-tietokantataulu. Yks oikeus jäi myös antamatta, muistaakseni Processor-lambdan oikeus kirjoittaa DynamoDB -tietokantaan. Virheilmoituksia CloudWatch-lokista tutkimalla asia selvisi.
Datan keräämisessä piti ohjeistaa jonkin verran ja hyvä tapa on antaa oikea esimerkki datasta ja kertoa mitä siitä halutaan tallentaa. Copilot ymmärtää hyvin käsitteitä jopa suomen kielellä.
Kun Typescriptillä käsitellään dataa, dataobjektit on syytä tyypittää. Muistaakseni ensin tyypejä ei ollut mutta kehoitteella sellaiset syntyivät nopeasti.
Tietojenkäsittelyn logiikkaan oli myös jäänyt vakava puute, jonka huomasin virheiden yhteydessä: jos datan käsittely Processor -funktiossa epäonnistui, siitä vain heitettiin virheilmoitus ja data hukkui. Parempi tapa on tietysti palauttaa data SQS-jonoon jotta se voidaan käsitellä myöhemmin. Pienellä kehoituksella tähän löytyikin helppo keino eli Processor palauttaa SQS:lle epäonnistuneet tiedot batchItemFailures-objektissa. Kun kysyin Copilotilta, miksi et heti tehnyt tätä virheen käsittelyä, niin AI vastasi vain että ”tein ensin vain perusratkaisun, kehitetään myöhemmin lisää”.
Tietotyyppien kanssa sai olla tarkkana. id-kenttä meni välillä string- ja välillä number-tyypillä ja aiheutti ihmetystä kun data ei liikkunut.
REST API tietojen hakemiselle vaati hieman algoritmin hiomista, mutta Copilot ymmärsi halutun datankäsittelyn algoritmin melko helpolla. REST API tarjoaa hourly-average -rajapinnasta viimeisen kuukauden aikana tallennetusta datasta keskimääräisen vuorokauden tuntikohtaiset liikennemäärät ja keskinopeudet. Ne on koostettu mittauspisteiden molemminsuuntaisista liikennemittauksista. Tämän lisäksi datassa tulee mukana molemmille suunnille omat lukemat.
Käyttöliittymän puolella AI osasi valita oikeat komponentit varsin hyvin ja nopeasti. Esim. karttakomponentti ja diagrammikomponentti tulivat helposti käyttöön ilman komponenttien konfigurointiosaamista. Agent mode ajoi puolestani jopa npm install -komennot.
Testaus oli tärkeää, jotta käyttöliittymän logiikka toimi täydellisesti ja sujuvasti. Jonkin verran piti komentaa mm. karttanäkymän keskittämisen takia.
Käyttöliittymä
Käyttöliittymä on varsin simppeli: valitaan mittausasema ja valinnan alle aukeaa karttanäkymä jossa mittausaseman paikka näkyy, sen alla mittausaseman tiedot, sitten datan graafiset esitykset ja alimmaisena mahdollisuus tutkia REST-rajapinnan raakadataa.
Arvio työmäärästä ilman AI:n apua
Tähän projektiin meni AI:n avulla toteutettuna ehkä noin 10 tuntia.
On tietysti mielenkiintoista miettiä, kuinka kauan toteutukseen olisi mennyt ilman AI:n apua tai siten että sitä olisi käytetty vain apurina koodauksen yhteydessä.
Projektissa oli monia aiheita, joihin tutustuminen olisi vaatinut aikaa. Infran pystyttäminen CDK:lla olisi vaatinut tiedonhakua ja opettelua, DynamoDB:n tietojen haku oli aika mielenkiintoisen näköinen SQL-kyselyyn tottuneelle, Reactin karttakomponentti ja datan esittäminen graafisesti recharts -kirjastolla olisivat vaatineet perehtymistä. Collector-lambdan ajastus meni kerrasta oikein, vaikka etukäteen en tiennyt yhtään miten sellainen tehtäisiin.
Arvioni on, että aikaa olisi voinut mennä kokonaisuuteen noin 4-5 kertaa enemmän ”perinteisellä” koodauksella.
Toki täytyy myöntää, että toteutuksen koodi ei varmasti ole täysin loppuun asti hiottua kaikilta osin. Esimerkiksi tyylejä meni jossain vaiheessa css-tiedostoon vaikka muuten käytettiin TailWind-tyylikirjastoa. Mutta parantelua voi tehdä jälkikäteenkin Copilotin avulla.
Yhteenveto
Kaiken kaikkiaan sanoisin, että täysin AI-pohjaisella koodauksella saa nopeasti tulosta aikaiseksi kun kyseessä on täysin uusi järjestelmä. Tekoälyä komentavan on kuitenkin tunnettava ohjelmistokehityksen hyvät periaatteet sekä käytetyt pääteknologiat ainakin jonkinlaisella tasolla, jotta vikojen ja puutteiden selvittely onnistuu ja lopputulos on riittävän hyvä.
Järjestelmän osoite
Järjestelmä on toistaiseksi käytettävissä osoitteessa
https://d2cjqj7nnodqi4.cloudfront.net