Vibekoodailua lokaaleilla malleilla

Kuvankaappaus lokaalilla AI-mallilla koodatusta tekstieditorista

Taustaa

Noin viikko sitten koetin enismmäistä kertaa käyttää AI:ta eli tuttavallisemmin tekoälyä koodaamiseen. Teknisemmin ilmaistuna käytin siis koodaamiseen LLM:ää eli suurta kielimallia joka kuitenkin tavan tallaajalle on helpompi ilmaista vain ympäripyöreällä ilmaisulla tekoäly.

Olen aikaisemmin käyttänyt kielimalleja koodamisessa apuna siten että olen pitänyt sitä Googlaamisen vaihtoehtona ongelmien ilmetessä. Esimerkiksi vaikkapa jos on ollut tarve pilkkoa merkkijono Pythonilla tietystä merkistä eteenpäin mutta en ole muistanut syntaksia, en olekaan aina Googlannut ongelmaan vastausta vaan olen käyttänyt lokaalia kielimallia ja kysynyt siltä vastausta ongelmaan. Sen jälkeen olen kopioinut vastauksesta relevantit osuudet omaan koodiin manuaalisesti.

Olen kuitenkin nyt viime viikolla ja tällä kuluneella viikolla muutamina iltoina leikkinyt enemmänkin koodin kanssa, mutta tällä kertaa siten että en ole itse kirjoittanut koodia vaan olen pyytänyt AI-agenttia kirjoittamaan sen puolestani alusta loppuun asti.

Työkalu jota olen käyttänyt agenttina on Pi (pi.dev) ja kielimalli jota olen käyttänyt on ollut ensin Gemma 4 E4B ja myöhemmin Qwen 3.6 35B A3B UD. Tällä hetkellä tätä kirjoittaessa testauksessa on Qwen 3.6 27B malli jonka juuri latasin koneelleni. Pitä olen ajan ajanut Ubuntu Linuxissa jota pyöritän Windowsissa WSL2:ssa.

Viikon aikana olen koettanut koodata pienimuotoisia ohjelmia testin vuoksi että saan edes jonkinlaisen käsityksen siitä mitä kaikkea näillä voi tehdä. Tietenkin osaavissa käsissä niillä voi varmasti tehdä paljon enemmänkin etenkin jos käyttää parempia malleja, mutta omassa testailussa tärkein vaatimus on ollut lokaalien mallin käyttö.

Lokaalin mallien käytön perustelut on käytännössä kustannukset sekä ympäristö. En halua maksaa kielimallin käytöstä jossain muualla kun voin pyörittää omiin tarpeisiini tarpeeksi hyvää mallia omalla koneellani. Lisäksi ajatuksen tasolla itselläni tökkii AI:n aiheuttamat negatiiviset ympäristövaikutukset, joten en halua että energia- ja vesisyöpöt konesalit joutuvat pyörimään 24/7 vain sen takia että voin itsekin käyttää niitä kaikkeen kivaan.

Tietenkin lokaalit mallit on vaatineet kouluttaessa jo hillittömästi konetehoa ja niillä on negatiivinen vaikutus ympäristöön, mutta jatkossa ne ei kuluta yhtään virtaa omalla koneellani sinä aikana kun en niitä käytä, eli koneen ei tarvitse olla pyörimässä 24/7. Vähän samalla tapaa kuin CD vs. suoratoistopalvelut. Energiankulutus on tapahtunut valmistusvaiheessa, mutta ne eivät kuluta virtaa silloin kun niitä ei käytetä kun taas suoratoistopalvelut vaativat sen että konesalit pyörivät 24/7 vaikka en sattuisi sieltä mitään kuuntelemaan.

Mitä näillä olen saanut aikaiseksi

Olen tähän mennessä muutaman pienen koodauksen saanut näillä tehty joten laitan tähän alle lyhyesti niistä mitä kaikkea niillä olen saanut aikaiseksi näiden työkalujen opetteluvaiheessa.

Wallhaven.cc:n kuvien lataaja

Ensimmäinen minkä koodasin – tai tarkemmin ottaen pyysin tekoälytyökaluja tekemään sen koodauksen – oli wallhaven.cc sivustolta taustakuvien lataajan. Käyttäjä voi antaa parametrinä hakusanan jonka jälkeen skripti hakee taustakuvia sillä hakusanalla.

Lisäksi skripti osaa lukea konfiguraatiotiedoston minne käyttäjän on pitänyt syöttää API-avain (jonka rekisteröitynyt käyttäjä saa haettua wallhaven.cc-sivustolta asetuksista). Konfiguraatiotiedostosta luetaan myös muutamia muita asetuksia, eli ainakin yksinkertaisen skriptin sain toteutettua jossa on tuki konfiguraatiotiedostoille.

Valokuvien automaattinen siirtäjä

Toinen skripti mitä olen tehnyt on ollut oikeasti jopa hyödyllinen itselleni. Normaalisti olen valokuvat siirtänyt muistikortilta tietokoneelle käsipelissä oikeisiin kansioihin. Tämä kuvien importoija sitä vastoin tekee sen automaattisesti. Kun laitan muistikortin tietokoneeseen kiinni ja käynnistän skriptin käy skripti läpi kaikki valokuvat joita se löytää muistikortilta.

Skripti käyttää exiftool-nimistä ohjelmaa katsomaan kuvien metadatoista kuvan ottamisen päivämäärän ja muodostaa niistä automaattisesti oikeat polut omien tarpeideni mukaisesti. Kopioin aina kuvat YYYY\MM\DD rakenteeseen, eli 23.04.2026 otetut kuvat menisivät 2026\04\23 kansioon. Skripti listaa ensin löytämänsä kuvat ja kun kirjoitan “Yes” tai “y” ja painan enter alkaa skripti kopioimaan kuvat koneelle oikeisiin kansioihin.

Skirpti osaa myös luoda puuttuvat kansiot automaattisesti ja lisäksi se tajuaa olla ylikirjoittamatta jo aikaisemmin kovalevyllä samalla nimellä löytyviä tiedostoja.

Sivuston pystyssäolon tarkistaja

Sivustojen pystyssä olon tarkastajan web-käyttöliittymä

Yksi skripti mikä tuli vibekoodattua on sivustojen pystyssä olon tarkistaja. Skripti tarkistaa sites.txt tiedostosta onko sivusto vielä pystyssä ja löytyykö sieltä sitä sisältöä mitä sinne on määritetty.

Esimerkiksi https://deepcontrastmedia.com sivulta skripti tarkastaa löytyykö sieltä teksti “Audiovisuaalista tuotantoa”. Mikäli sivu on pystyssä mutta palauttaa sisältöä jossa ei löydykään tuota tekstiä niin silloin skripti osaa kertoa sen käyttöliittymässä. Samoin jos sivu ei vastaa lainkaan eli se on kaatunut osaa skripti ilmoittaa siitäkin.

Alunperin tein tämän komentorivillä ajettavaksi skriptiksi, mutta myöhemmin sitten muutin tämän toimimaan webbiselaimessa. Lisäksi web-käyttöliittymään tuli lisättyä tekstikenttä mihin voin lisätä domainin ja tekstin mitä sieltä pitää löytyä jolla voin validoida sivuston toimivuuden.

Kuten voi arvata, tämä sivu ei ole auki julkiseen Internetiin koska muuten tuon tekstikentän kautta olisi kohta levy tungettu täyteen kaikkea tai vähintäänkin yritetty tunkeutua palvelimelle etsimällä tietoturva-aukkoja.

Boom

Kuvankaappaus Boom-nimisen pelin prototyypistä jonka sai tehtyä Qwen 3.6:n 35b A3B UD:llä.

Ajatus mikä nousi mieleeni etsiessä rajoja mitä kaikkea näillä lokaaleilla malleilla oman koneen tehojen riittäessä voisi tehdä oli se, saisinko nämä tekemään yksinkertaisen raycaster-tyylillä toteutetun pelin tai ainakin edes mitenkään toimivan prototyypin. Esimerkkinä raycaster-pelistä on klassinen Wolfenstein 3D.

Yllättävää kyllä, Qwen 3.6 35b A3B:lla (tai A3B UD:lla) tämäkin onnistui. Peli lukee “maps.txt” tiedoston ja generoi sen mukaan kartan jossa pelaajana sitten voi pyöriä W, A, S, D napeilla sekä nuolilla liikutellen. Käyttöliittymä sanoo kyllä että myös hiirellä voisi katsella ympärilleen mutta ainakaan vielä moinen ei ole mahdollista.

Tämä oli itselleni todellinen wow että tällaisen pystyi näillä jo tekemään muutamilla promptauksilla. Kehitys on mennyt selvästi jo kovasti eteenpäin.

NoteBad

Viimeisin testailu oli koodata yksinkertainen tekstieditori joka on vähän kuten Microsoft Windowsin Notepad mutta simppelimpi ja vibekoodattu. Tämäkin onnistui, mutta ominaisuuksia vielä puuttuu koska en saanut niitä vibekoodaamalla vielä toimimaan. Esimerkiksi en ainakaan saanut vasempaan laitaan rivien näyttämistä oikein joten sitä en ole lisännyt lainkaan. Lisäksi ominaisuuksia puuttuu koska en ole niitä vielä koettanut edes lisätä (kuten kopioi/liitä valikot, Ctrl + S -pikanapilla tallennus yms.).

Saapa nähdä tuleeko tätä projektia jatkettua koskaan sen enempää kuin muitakaan, kuitenkin nämä ovat enemmänkin harjoitteluprojekteja olleet jotta saan perspektiiviä mitä kaikkea voin näillä tehdä.

Loppusanat

Kuten yllä olevista esimerkeistä voi nähdä, lokaaleilla malleilla on mahdollista tehdä jo jotain pienimuotoista koodausta mikäli koneessa on riittävästi tehoa.

Koneessani on näytönohjaimena NVidia RTX 4060 Ti jossa on 16 GB VRAMia ja tavallista RAM-muistia löytyy 32 GB joten tehojen puolesta kone on selvästi tehokkaampi kuin monelta kotona löytyy. Silti tämäkin on kohtalaisen tehoton jos AI-työkaluja haluaisi käyttää ammattimaisesti ja nopeudella olisi enemmän merkitystä, mutta tällaiseen omaan räpellykseen kone on vielä riittänyt moneen.

Kokemukset ovat olleet positiiviset. Monia asioita on tullut opittua ja paljon olisi vielä opittavaa edessä, joten aika näyttää mitä tulevaisuudessa näiden kanssa keksii.

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *