Portfolio – Maria Koivisto

Peräti 75 % tehokkaampi työskentely tekoälyn avulla – olen yksi henkilö, mutta tuon yrityksellesi moninkertaisen tiimin voiman

Up to 75% more efficient with AI – I may be one person, but I bring the productivity of an entire team to your company.

SENIOR GEN AI DEVELOPER | ETHICAL HACKER | SYSTEM DESIGNER

(Nämä vanhan firmani verkkosivut ”vetelevät viimeisiään” ja pian siirrän näkyvyyteni uudelle freshille saitille. Oottakaa nyt.😉,

(My old company website is currently on its last stretch and will soon be replaced with a fresh new site. Stay tuned. 😉)

 

Ydinosaamistani:

  • Järjestelmäarkkitehtuuri ja ohjelmistokehitys
  • Hajautettujen järjestelmien suunnittelu
  • Viestipohjaiset arkkitehtuurit ja tapahtumaputket
  • Worker- ja pipeline-pohjaiset backend-järjestelmät
  • Data engineering ja kohinainen data
  • Datan normalisointi ja esikäsittely
  • Datan validointi, laadunhallinta ja skeemaversiointi
  • Koneoppiminen, syväoppiminen, LLM-mallit, paikalliset kielimallit ja RAG-ratkaisut
  • Retrieval-arkkitehtuurit ja tietopohjainen generointi
  • Mallien evaluointi, optimointi ja inference-putket
  • Agentti- ja moniagenttijärjestelmät (adaptiiviset, rekursiiviset)
  • Autonomiset järjestelmät ja agenttien välinen koordinointi
  • Orkestrointi ja päätöksentekojärjestelmät
  • Hybridiset AI-arkkitehtuurit (sääntöpohjaiset + probabilistiset mallit)
  • Symbolisen ja tilastollisen AI:n yhdistäminen
  • Deterministiset + generatiiviset päätöksentekomallit
  • Monimutkaiset automaatiot ja päätöksentekoputket
  • AI-pohjaiset workflow- ja prosessiautomaatiojärjestelmät
  • Operatiiviset AI-ratkaisut tuotantoympäristöissä
  • Eettinen hakkerointi ja adversaarinen järjestelmäanalyysi
  • AI-järjestelmien haavoittuvuusanalyysi
  • Prompt-, agentti- ja mallitason hyökkäysvektorit
  • Tekoälyn turvallisuus, validointi ja tuotantorajoitteet
  • AI governance, mallien kontrollointi ja turvalliset käyttörajapinnat
  • AI-järjestelmien luotettavuus ja virhetilanteiden hallinta
  • Senior-tason full stack -ohjelmistokehitys
  • Backend-järjestelmät, API-rajapinnat ja palveluarkkitehtuuri
  • Tietojärjestelmien suunnittelu, integraatiot ja automaatio

Core Expertise

  • System architecture and distributed backend design
  • Message-driven architectures and event pipelines
  • Worker-based processing systems and resilient backends
  • Data Engineering & Noisy Data
  • Data normalization, preprocessing and schema evolution
  • Data validation, quality control and structured pipelines
  • Machine Learning, Deep Learning, LLMs, Local Language Models, RAG
  • Retrieval architectures and knowledge-grounded generation
  • Model evaluation, optimization and inference pipelines
  • Agent & Multi-Agent Systems (adaptive, recursive)
  • Autonomous systems and agent coordination
  • AI orchestration and decision systems
  • Hybrid AI Architectures (rules + probabilistic models)
  • Combining symbolic and statistical AI
  • Deterministic + generative decision models
  • Complex Automations & Decision Pipelines
  • AI-powered workflow orchestration
  • Operational AI systems in production environments
  • Ethical Hacking & Adversarial System Analysis
  • AI system vulnerability analysis
  • Prompt, agent and model-level attack surfaces
  • AI Safety, Validation & Production Constraints
  • AI governance and model control mechanisms
  • Reliability engineering for AI systems
  • Senior Full-stack Engineering
  • Backend systems, APIs and service architectures
  • System design, integrations and intelligent automation

ERILAISIA RATKAISUJA:

Worker-pohjainen viestinkäsittelyalusta | Worker-based Message Processing Platform

Rakensin worker-pohjaisen käsittelyalustan, jonka tarkoituksena on simuloida tuotantotason viestinkäsittelyjärjestelmää ja sen operatiivista toimintaa.

Järjestelmä toteuttaa viestipohjaisen arkkitehtuurin, jossa data kulkee hallitun käsittelyputken läpi vastaanotosta validointiin ja lopulliseen käsittelytilaan.

 

Järjestelmän ytimeen suunnittelin yleiskäyttöisen runtime-kirjaston, joka abstrahoi viestien käsittelylogiikan sekä jonopohjaisen työnjaon. Runtime vastaa viestien vastaanottamisesta, siirtämisestä käsittelytilaan, validoinnista sekä ohjaamisesta lopputilaan. Viestit voidaan käsittelyn tuloksesta riippuen siirtää onnistuneeseen tilaan, uudelleenyritykseen tai virheiden tapauksessa dead-letter-jonoon.

 

Runtime sisältää useita tuotantoympäristöissä tarvittavia ominaisuuksia, kuten tapahtumalokituksen, retry-mekanismin, virhetilanteiden hallinnan sekä sanomaversioiden yhteensopivuuden. Tämä mahdollistaa sen, että järjestelmä pystyy käsittelemään samanaikaisesti eri versioita viesteistä sekä päivittämään vanhat sanomat automaattisesti uuteen muotoon käsittelyn aikana ilman, että backlogia täytyy erikseen migroida.

 

Runtime-kirjaston päälle rakensin kaksi erillistä palvelua: vahinkoilmoitusten käsittelyjärjestelmän sekä vakuutushakemusten käsittelyjärjestelmän. Molemmat käyttävät samaa runtime-kerrosta, mutta sisältävät omat sanomarakenteensa, käsittelijänsä sekä käsittelylogiikkansa. Tämä demonstroi, kuinka yhteinen infrastruktuurikerros voi palvella useita liiketoimintaprosesseja ilman, että järjestelmäarkkitehtuuria tarvitsee toteuttaa erikseen jokaiselle palvelulle.

 

Järjestelmä on lisäksi jaettu erillisiin DEV-, TEST- ja PROD-ympäristöihin, joilla on omat konfiguraationsa sekä jonorakenteensa. Tämä mahdollistaa muutosten turvallisen testaamisen ennen tuotantoon siirtämistä sekä realistisen julkaisu- ja ylläpitoprosessin simuloinnin.

 

Projektissa toteutin myös tuotantotilannetta simuloivan hotfix-skenaarion. Tässä tilanteessa worker päivitetään uuteen versioon samalla kun järjestelmän backlog sisältää vanhoja ja uusia sanomaversioita, duplikaattiviestejä sekä kesken jääneitä käsittelyitä. Järjestelmä pystyy tällaisessa tilanteessa tunnistamaan duplikaatit, palauttamaan processing-tilaan jääneet viestit takaisin käsittelyyn sekä käsittelemään backlogin ilman datan katoamista.

 

Projektin keskeinen tavoite oli harjoitella tuotantokelpoisen backend-järjestelmän suunnittelua ja operointia alusta asti. Harjoitus keskittyi erityisesti viestipohjaisiin arkkitehtuureihin, virheensietoon, retry-strategioihin, sanomaversioiden hallintaan sekä järjestelmän operatiiviseen elinkaareen kehityksestä tuotantoon.

 

Lopputuloksena syntyi modulaarinen worker-alusta, jossa useat palvelut voivat hyödyntää samaa runtime-kerrosta ja käsitellä viestejä luotettavasti myös virhe- ja päivitystilanteissa.

 

In English

 

I designed and implemented a worker-based message processing platform to simulate a production-grade event-driven backend system.

 

At the core of the system is a reusable runtime layer responsible for queue-based message orchestration. The runtime manages message intake, processing transitions, validation, retry mechanisms, and dead-letter routing for failed messages. It also provides structured event logging and message version compatibility, enabling the system to process multiple schema versions concurrently and upgrade legacy messages during runtime.

 

Two independent services were built on top of this runtime: a claims processing service and an insurance policy application service. Both share the same infrastructure layer while maintaining independent message schemas and processing logic. This architecture demonstrates how a reusable runtime can support multiple domain services within a unified processing framework.

 

The system includes separate DEV, TEST, and PROD environments, each with isolated queues and configurations, enabling realistic deployment and release workflows.

 

To simulate real production conditions, I implemented a hotfix scenario where a new worker version processes a backlog containing mixed message versions, duplicates, and interrupted processing states. The system can detect duplicates, recover stuck messages from processing queues, and process the backlog without data loss.

 

The primary goal of the project was to practice designing resilient backend systems with event-driven architectures, retry strategies, versioned message handling, and operational lifecycle management from development to production.

Worker-runtime -järjestelmän projektirakenne: ympäristökohtaiset konfiguraatiot, jonopohjainen viestinkäsittely, handler-kerros sekä worker-prosessit.

In English:

Worker-runtime system project structure: environment-specific configurations, queue-based message processing, a handler layer, and worker processes.

Järjestelmä käsittelee viestejä jonopohjaisessa worker-arkkitehtuurissa, jossa jokainen sanoma kulkee ennalta määritellyn käsittelyputken läpi. Viestit vastaanotetaan incoming-jonosta, siirretään processing-tilaan ja käsitellään vaiheittain. Käsittelyn aikana järjestelmä tunnistaa sanomaversiot ja pystyy tarvittaessa päivittämään vanhemman viestimuodon automaattisesti uuteen versioon ennen jatkokäsittelyä. Tämän jälkeen viesti validoidaan rakenteellisesti ja sisällöllisesti, jotta varmistetaan datan oikeellisuus ennen lopullista käsittelyä.

 

Jokaisesta käsittelyvaiheesta kirjataan strukturoituja tapahtumia järjestelmän observability-lokiin. Näihin kuuluvat esimerkiksi viestin havaitseminen, käsittelyn aloitus, mahdollinen sanomapäivitys, validointi sekä lopullinen käsittelytulos. Tapahtumaloki mahdollistaa järjestelmän toiminnan jäljitettävyyden, analyysin sekä operatiivisen tilannekuvan muodostamisen ajonaikaisesta toiminnasta.

 

Koko prosessi toimii deterministisena pipeline-mallina, jossa jokainen viesti etenee selkeästi määriteltyjen vaiheiden kautta. Tämä rakenne parantaa järjestelmän luotettavuutta, helpottaa virhetilanteiden diagnosointia ja mahdollistaa käsittelyprosessin operatiivisen analysoinnin jälkikäteen.

In English:

The system processes messages using a queue-based worker architecture, where each message passes through a predefined processing pipeline. Messages are received from the incoming queue, moved into the processing state, and handled step by step.

 

During processing, the system detects message versions and can automatically upgrade older message formats to the latest version before further handling. After this, the message undergoes both structural and semantic validation to ensure data integrity before final processing.

 

Each processing stage generates structured events that are recorded in the system’s observability logs. These include events such as message detection, processing start, potential message version upgrades, validation, and the final processing result. The event log enables full traceability of system operations, supports analysis, and provides operational visibility into the runtime behavior of the system.

 

The entire process operates as a deterministic pipeline model, where every message progresses through clearly defined stages. This structure improves system reliability, simplifies error diagnosis, and enables retrospective operational analysis of the processing workflow.

 

Autonominen worker-runtime ja operatiivinen analyysijärjestelmä | Autonomous Worker Runtime and Operational Analysis System

Rakensin C-pohjaisen worker-runtime-järjestelmän, joka suorittaa jobeja, kerää ajonaikaisia tapahtumia ja muodostaa niiden perusteella operatiivisen analyysin järjestelmän tilasta.

 

Järjestelmä käsittelee jobeja jonopohjaisessa worker-arkkitehtuurissa. Jokaisesta ajosta kirjataan strukturoituja tapahtumia, kuten jobin käynnistys, onnistuminen, epäonnistuminen, retryt sekä worker-instanssin tunniste. Näistä tapahtumista muodostetaan analyysipipeline, joka tuottaa järjestelmän tilaa kuvaavia raportteja.

 

Analyysipipeline tuottaa neljä erillistä raporttia:

 

Health Score

Deterministinen pisteytys, joka kuvaa järjestelmän yleistä toimintakuntoa.

Run History Analysis

Ajohistoriaan perustuva trendianalyysi, joka paljastaa kuormituksen epätasapainot ja virheiden kehityksen ajan yli.

Operational Recommendations

Analyysin perusteella muodostetut suositukset järjestelmän parantamiseksi.

Operational Action Plan

Priorisoitu toimintasuunnitelma, joka kokoaa havainnot konkreettisiksi operatiivisiksi toimenpiteiksi.

 

Arkkitehtuurissa analyysi ja tekoäly on erotettu toisistaan. Metriikat, trendit ja järjestelmän tilaa kuvaavat signaalit muodostetaan deterministisesti runtime-kerroksessa. Tekoälyä käytetään vasta tulkintakerroksena, jossa analyysitulokset muunnetaan operatiivisiksi johtopäätöksiksi.

 

Järjestelmä hyödyntää kahta  paikallisesti ajettua keskenään erilaista kielimallia. Ensimmäinen malli muodostaa analyysidatan perusteella toimintasuunnitelman, ja toinen toimii kriitikkona, joka arvioi ja tarkentaa suunnitelman ennen lopullisen raportin muodostamista. Tämä kaksivaiheinen analyysiketju parantaa raporttien luotettavuutta ja vähentää virheellisten johtopäätösten riskiä.

 

Koko järjestelmä toimii täysin offline-ympäristössä ilman pilvipalveluja. Kaikki analyysi, mallien ajaminen ja raporttien muodostaminen tapahtuvat paikallisesti.

 

Projektin tavoitteena oli rakentaa järjestelmä, joka yhdistää worker-pohjaisen suorituksen, observability-datan analyysin ja paikalliset kielimallit kokonaisuudeksi, joka pystyy muodostamaan operatiivisen tilannekuvan ajonaikaisesta datasta ja tuottamaan ehdotuksia järjestelmän korjaamiseksi.

In English:

 

I built a C-based worker runtime system that executes jobs, collects runtime events, and generates operational analysis of the system state based on those events.

 

The system processes jobs using a queue-based worker architecture. Each execution produces structured runtime events such as job start, success, failure, retries, and the identifier of the worker instance handling the job. These events form the foundation of an analysis pipeline that generates reports describing the operational state of the system.

 

The analysis pipeline produces four separate reports:

 

Health Score

A deterministic scoring model that reflects the overall operational health of the system.

Run History Analysis

A trend analysis based on execution history that reveals workload imbalances and the evolution of error patterns over time.

Operational Recommendations

Recommendations generated from the analysis to improve system stability and performance.

Operational Action Plan

A prioritized action plan that translates analytical findings into concrete operational steps.

In the architecture, analysis and AI are intentionally separated. Metrics, trends, and system-state signals are generated deterministically within the runtime layer. AI is only used as an interpretation layer, where analytical results are transformed into operational conclusions.

 

The system uses two different locally executed language models. The first model generates an operational action plan based on the analysis data, while the second model acts as a critic that evaluates and refines the plan before the final report is produced. This two-stage analysis chain improves the reliability of the reports and reduces the risk of incorrect conclusions.

 

The entire system operates fully offline without any cloud services. All analysis, model execution, and report generation are performed locally.

 

The goal of the project was to build a system that combines worker-based execution, observability data analysis, and local language models into a unified architecture capable of generating an operational situational picture from runtime data and producing actionable recommendations for system improvement.

raportti agentin tekemänä

Kuvassa: Yhden illan MVP: järjestelmä havaitsi epätasaisen worker-kuorman, suuren määrän Linux-kirjautumisyrityksiä sekä reititysongelman, jokaiselle löytyy priorisoitu toimenpide. ”Dry Run Expectation” kertoo riskitason ennen kuin mitään ajetaan.

Autonominen automaatiolla toimiva tekoälyagentti, osa 1/3 | Automation-first AI agent, part 1/3

Tarjoan kehittyneitä tekoälykehityspalveluita, joissa yhdistän syväoppimista ja koneoppimista olemassa oleviin sääntöpohjaisiin järjestelmiin, luoden turvallisia ja myös paikallisesti toimivia hybridiratkaisuja. Erityisosaamiseeni kuuluu muun muassa autonomisten, itsereflektoivien, kehittyvien, muistilla varustettujen agenttien kehittäminen. Olen rakentanut kymmeniä räätälöityjä tekoälyratkaisuja eri tarpeisiin.

Rakentamani järjestelmät ovat joustavia, skaalautuvia ja aina asiakkaan tarpeisiin räätälöityjä, tuottaen merkittävää ajansäästöä ja kustannustehokkuutta samalla kun ne takaavat tiukan tietoturvan ja datan hallinnan. Taidan kielimallien integroinnit osaksi älykkäitä järsestelmiä, kuten myös vaativat finetuningit ym.

 

Kehitän liiketoimintaa tuloshakuisesti ja datalähtöisesti hyödyntäen uusimpia teknologioita. Rakennan “oikeita agentteja” ikään kuin “atomeista” alkaen – erittäin älykkäiden mallien pohjalta.

 

Olen kehittänyt yli 100 gpt-pohjaista AI-avustajaa a eri käyttötarkoituksiin, ja osaamiseni yhdistää hakkerin oivaltavuuden, sovelluskehittäjän tarkkuuden ja prompt engineeringin pioneerin näkemyksen tekoälystä. 

 

Olen suorittanut ylemmät korjeakouluopinnot digitaalisten palveluiden suunnittelusta.

 

IN ENGLISH

 

I offer advanced AI development services that combine deep learning and machine learning with existing rule-based systems, creating secure and locally operable hybrid solutions. My core expertise includes the development of autonomous, evolving agents with memory. I have built dozens of custom AI solutions for various needs. The systems I develop are flexible, scalable, and always tailored to the specific needs of each client, delivering significant time and cost savings while ensuring strict data control and security. I specialize in integrating language models into intelligent systems, as well as handling demanding fine-tuning processes and more.

 

I approach business development in a results-oriented and data-driven way, leveraging the latest technologies. I build “real agents” from the ground up—starting from the “atoms”—based on highly intelligent models. I have created over 100 custom GPT tools for different use cases, and my skillset combines the ingenuity of a hacker, the precision of an application developer, and the visionary insight of a prompt engineering pioneer.

I have completed advanced university courses in designing digital services.

Asuntoagentti – markkinadataan perustuva asuntojen hinnanmuutosanalytiikka (MVP) | Housing Market Agent – Data-Driven Real Estate Price Change Analytics (MVP)

Suunnittelin ja toteutin Python-pohjaisen markkinaseurantatyökalun yksityiselle asuntosijoittajalle. Ratkaisu automatisoi useiden alueiden asuntolistaukset, rakentaa kohdekohtaisen hintahistorian ja tunnistaa aidot hinnanmuutokset ilman manuaalista läpikäyntiä.

 

Keskeinen tekninen ratkaisu oli deterministinen hinnanmuutoslogiikka (“previous different price”), joka erottaa todelliset hinnanlaskut toistuvista samanhintaisista havainnoista ja poistaa kohinan analyysistä. Järjestelmä tallentaa append-only hintahistorian SQLite-tietokantaan ja generoi ajon päätteeksi automaattisen HTML-raportin ilman erillistä backend-palvelinta tai pilvi-infrastruktuuria.

 

Projektissa painottuivat datan luotettavuus, parsinnan robustius, virhetilanteiden hallinta sekä suorituskyky laajojen hakujen yhteydessä. Ratkaisu on läpinäkyvä, testattava ja helposti ylläpidettävä ilman low-code- tai kolmannen osapuolen agenttiriippuvuuksia.

 

Teknologiat: Python, asyncio, HTTP/selainautomaatio, SQLite, HTML-generointi

 

Teemat: datankeruu, tietomallinnus, historiadatan hallinta, heuristiikkapohjainen validointi, signaalin erottaminen kohinasta, MVP-arkkitehtuuri

In English:

Designed and implemented a Python-based market monitoring tool for a private real estate investor. The solution automates multi-region property listings, builds listing-level price history, and identifies genuine price changes without manual browsing.

 

The core technical solution was a deterministic price change logic (“previous different price”), which distinguishes real price drops from repeated observations with unchanged prices, effectively removing noise from the analysis. The system stores append-only price history in SQLite and automatically generates a static HTML report after each run, without requiring a backend server or cloud infrastructure.

 

The project focused on data reliability, robust parsing, error handling, and performance when processing large search sets. The architecture is transparent, testable, and maintainable without reliance on low-code platforms or third-party agent frameworks.

 

Technologies: Python, asyncio, HTTP/browser automation, SQLite, HTML generation

 

Key areas: data collection, data modeling, historical data management, heuristic validation, signal-to-noise separation, MVP architecture design

Otin ensimmäisenä Suomessa käyttöön GPT 4o mini -teknologian chatbotit. Alla Kela-apuri. Olen tehnyt yli 100 custom gpt:tä.

I was the first in Finland to deploy GPT-4o Mini-based chatbot technology. Below is the Kela Assistant. I’ve created over 100 custom GPTs.

Kelan palveluiden työkalu. By: Maria Ahonen

REFERENCES

JOUSTOMIELI:

Maria Koivisto on harvinaisen taitava GPT-räätälöinnin asiantuntija. Hän osasi vangita sekä brändini filosofisen sävyn että liiketoimintani ytimen ainutlaatuisella tarkkuudella. Marian rakentama malli ei ole vain älykäs – se tukee myyntiä, johtajuutta ja viestintää saumattomasti. Hänen työnsä on tuonut aidosti lisäarvoa sekä asiakkailleni että omalle ajattelulleni.

Minna Levander
Johtajuusvalmentaja, Joustomieli

 

IN ENGLISH:

 

Recommendation – Maria Koivisto

Maria Koivisto is an exceptionally skilled GPT designer. She captured my brand’s philosophical tone and business goals with rare precision. The model she built isn’t just smart—it supports sales, leadership, and communication seamlessly. Maria’s work has added real value to both my clients and my own thinking.

 

RED CARPET:

Red Carpet -ryhmittymän Mili Kivinen, joka tekee muun muassa copywriterin töitä, uskoo vahvasti, että markkinointitoimistot sekä viestintä- ja mainostoimistot voivat suuresti hyötyä nykyaikaisista työkaluista, erityisesti Custom GPT -työkaluista. Hänen kokemuksensa mukaan Maria Koiviston tekemät työkalut ovat olleet merkittäviä hänen työssään. Työtehon kasvu oli merkittävää, ja Kivisen kohdalla vähintään 50%.

“Markkinointitoimistojen kannattaa ehdottomasti sijoittaa tällaisiin työkaluihin. Se lisää huomattavasti kustannustehokkuutta, säästää aikaa ja mielestäni toimistot voivat jäädä jälkeen, jos ne eivät ota tällaisia käyttöön,” Kivinen sanoo.

Kivinen painottaa, että Custom GPT -työkalut ovat huomattavasti parempia kuin perinteiset GPT-“karvalakkimallit”.

“Käyttäjäkokemus on ollut tosi hyvä verrattuna siihen karvalakkimalliin. Maria Koivoston luomat cutom-gpt-työkalut ovat huomattavasti sitä monipuolisempia ja parempia sisllöntuotannossa, ja käyttäjäkokemus oli parempi, mitä odotin,” Kivinen toteaa.

 

IN ENGLISH:

 

Mili Kivinen from the Red Carpet collective, who works as a copywriter among other roles, strongly believes that marketing, communication, and advertising agencies can benefit greatly from modern tools—especially Custom GPTs. According to her, the tools developed by Maria Koivisto have made a significant impact on her work. Her productivity increased substantially, by at least 50%.

 

“Marketing agencies should definitely invest in tools like these. They dramatically increase cost-efficiency, save time, and I believe agencies risk falling behind if they don’t adopt such solutions,” Kivinen says.

She emphasizes that Custom GPT tools are vastly superior to the standard, out-of-the-box GPT models.

 

“The user experience has been much better compared to the basic model. The Custom GPT tools created by Maria Koivisto are far more versatile and effective for content creation, and the user experience exceeded my expectations,” Kivinen notes.

Käyttöliittymätasoisen autonomisen agentin suunnittelu ja toteutus eettisen tietoturvatutkimuksen kontekstissa | Design and Implementation of a UI-Level Autonomous Agent for Ethical Security Research

Suunnittelin ja toteutin käyttöliittymätasolla toimivan agenttijärjestelmän, jonka tarkoituksena on tutkia ihmisenkaltaista automaatiota asiakaspalveluympäristöissä.

 

Järjestelmä toimii täysin selaimen käyttöliittymäkerroksessa ilman API-avaimia, integraatioita tai erityisoikeuksia. Se havainnoi keskustelua, ylläpitää eksplisiittistä tilaa, arvioi riskisignaaleja ja tekee päätöksiä deterministisen päätöspipelinen kautta.

 

Arkkitehtuurin keskeinen periaate on konservatiivinen autonomia: agentti ei toimi oletuksena. Se etenee tilakoneen mukaisesti (observe → assess → decide → act), jossa osallistuminen on sidottu roolivarmuuteen, ajoitusheuristiikkoihin ja turvallisuussääntöihin. Kielimallia käytetään rajatusti luonnostekstin tuottamiseen, ei päätöksentekoon.

 

Teknisesti keskeisiä ratkaisuja olivat:

 

  • eksplisiittinen tilakone ja eskalaatiotilat

  • cooldown- ja ei-spämmäyssäännöt

  • rooliepävarmuuden ja tekeytymisen heuristiikat

  • strukturoitu audit trail jokaisesta päätöksestä

  • deterministinen tappokytkin ja hallittu elinkaaren päättäminen

  • append-only -lokitus

Järjestelmä ei sisällä exploit-logiikkaa, rajapintojen kiertämistä tai oikeuksien ohittamista. Se toimii aidossa selaininstanssissa (Playwright) ja käyttää ainoastaan julkisia käyttöliittymäelementtejä, peilaten normaalia käyttäjäkäyttäytymistä.

 

Tutkimuksellinen tavoite oli tarkastella, miten käyttöliittymätasolla toimivat agentit hämärtävät ihmisen ja automaation rajaa, ja miten tunnistus siirtyy yksittäisestä sessiosta kohti vaikutus- ja mittakaavatason analyysia.

 

Arkkitehtuuri on modulaarinen ja testattava:

 

  • adapterikerros eri kanaville

  • deterministinen policy-engine

  • riskinarviointiputki

  • session-pohjainen telemetria

  • rajattu LLM-integraatio

  • eksplisiittinen allowlist-toimintarajaus

Teknologiat: TypeScript, Playwright, tilakoneet, policy-engine-arkkitehtuuri, strukturoitu lokitus

 

Keskeiset osa-alueet: käyttöliittymäautomaatio, päätöksenteon orkestrointi, safety-by-design -suunnittelu, auditointi, adversaarinen mallinnus, eettinen hakkerointi

In English:

 

Designed and implemented a controlled UI-level agent framework for studying human-indistinguishable automation in customer support environments.

 

The system operates entirely at the browser interface layer, without API access, elevated privileges, or direct system integrations. It observes live conversations, maintains explicit conversation state, evaluates risk signals, and produces controlled decisions through a deterministic decision pipeline.

 

The core architectural principle is conservative autonomy: the agent does not act by default. It transitions through a state machine (observe → assess → decide → act) where participation is gated by role confidence, timing heuristics, and safety rules. Language models are used only as bounded suggestion engines, never as decision-makers.

 

A key technical focus was deterministic lifecycle control:

 

  • explicit escalation states

  • cooldown and non-spam timing rules

  • impersonation and role ambiguity detection

  • structured audit trail for every decision

  • kill-switch enforced termination

  • append-only logging

The system intentionally avoids exploit logic, scraping shortcuts, or API bypassing. It runs through a genuine browser instance (Playwright) and interacts only with publicly available UI elements, mirroring legitimate user behavior.

 

The research objective was to explore how UI-level agents blur the boundary between human and automation, and how detection shifts from interface-level fingerprinting toward impact-level and scale-based anomaly detection.

 

The architecture is modular, testable, and channel-agnostic:

 

  • adapter abstraction layer

  • deterministic policy engine

  • risk assessment pipeline

  • session-based telemetry

  • controlled LLM integration

  • explicit allowlist constraints

Technologies: TypeScript, Playwright, structured logging, state machines, policy engines, modular adapter design

Key areas: UI-layer automation, decision orchestration, safety-by-design architecture, adversarial modeling, auditability, ethical hacking research

 

Reaaliaikainen paikallisesti toimiva puheentunnistusjärjestelmä (MVP) | Real time offline Speech to text -system (MVP)

Rakensin yhden illan aikana toimivan MVP:n reaaliaikaisesta puheentunnistusjärjestelmästä, joka toimii täysin offline-tilassa. Järjestelmä muuntaa live-äänen tekstiksi ja jalostaa sen käyttökelpoiseksi sisällöksi ilman pilvipalveluita tai API-kutsuja.

Kyseessä ei ole agentti, vaan deterministinen pipeline-arkkitehtuuri, jossa jokainen vaihe on eksplisiittisesti hallittu.

Audio Input

→ Voice Activity Detection (VAD)

→ Paikallinen Whisper-malli (faster-whisper)

→ NLP-pohjainen stabilointi ja suodatus

→ Lokaali tallennus (events + transcript)

 

Keskeiset komponentit:

  • Whisper (faster-whisper) – koneoppimispohjainen puheentunnistus

  • Silero VAD – äänen aktiivisuuden tunnistus

  • NLP-kerros – hallusinaatioiden ja kohinan suodatus

  • Utterance-combiner – lauseiden yhdistäminen luettavaksi tekstiksi

  • SQLite-muisti – lokaali muistirakenne

  • Session logging & governance – elinkaaren hallinta

Raaka Whisper-output ei ole käyttökelpoista sellaisenaan. Se sisältää:

  • Toistoja

  • Täytesanoja

  • Katkenneita lauseita

  • Hallusinaatioita (esim. “Kiitos katsomisesta”)

Lisäsin väliin NLP-stabilointikerroksen, joka:

  • Suodattaa tunnetut hallusinaatiot

  • Yhdistää fragmentit lauseiksi

  • Estää identtisen tekstin toiston

  • Stabiloi streamin reaaliaikaisesti

Tulos: käyttökelpoinen, siisti, reaaliaikainen transkriptio.

 

Järjestelmä toimii täysin offline:

  • Ei verkkokutsuja

  • Ei API-avaimia

  • Ei pilvitallennusta

  • Ei mallien koulutusta käyttäjän datalla

Data pysyy fyysisesti käyttäjän laitteella.

Lokit hallitaan retention-politiikalla ja käyttöoikeuksilla.

Tämä on konkreettinen esimerkki Privacy-by-Design -periaatteesta.

Osaaminen:

  • Reaaliaikainen audio capture (CoreAudio / PortAudio)

  • Streaming-arkkitehtuuri

  • Koneoppimismallien käyttö (Whisper)

  • NLP-suodatus ja stabilointi

  • Prosessinhallinta ja session lifecycle

  • Tietoturva- ja governance-ajattelu

  • Debuggaus macOS audio stackissa

In English:

 

I built a working MVP of a realtime speech recognition system that runs fully offline. The system converts live audio into structured, usable text without relying on cloud APIs or external services.

This is not an autonomous agent — it is a deterministic pipeline architecture with explicitly controlled execution stages.

Audio Input

→ Voice Activity Detection (VAD)

→ Local Whisper model (faster-whisper)

→ NLP-based stabilization layer

→ Local logging (events + transcript)

Core competence:

  • Whisper (faster-whisper) – machine learning speech recognition

  • Silero VAD – speech activity detection

  • NLP stabilization layer – hallucination filtering and stream cleaning

  • Utterance combiner – sentence-level merging

  • SQLite memory store – local state

  • Session logging & governance controls

Raw Whisper output is not production-ready. It often contains:

  • Repetitions

  • Filler fragments

  • Sentence breaks

  • Hallucinated phrases (“Thanks for watching”, etc.)

I implemented a realtime NLP stabilization layer that:

  • Filters known hallucination patterns

  • Merges fragmented utterances

  • Prevents duplicate output

  • Stabilizes streaming text

The result is a clean, usable realtime transcript.

 

The system runs 100% offline:

  • No network calls

  • No API keys

  • No cloud storage

  • No external model training

All data remains physically on the user’s device.

This is a concrete implementation of Privacy-by-Design.

 

Skills:

  • Realtime audio streaming

  • ML model integration

  • NLP post-processing

  • Streaming system design

  • Local-first architecture

  • Governance & retention controls

  • macOS audio debugging

  • Rapid prototyping

Alla Mastodonissa julkaiseva kehittynyt agentti | An advanced agent that posts to Mastodon (2023)

Agenttini, jolla on muisti, tekee itsenäisesti API-kutsuja Google Trendsin kaltaisiin palveluihin ja etsii suosittuja aiheita. Agentti käyttää trendiaihetta pohjana ja yhdistää sen muihin tietoihin. Open.ai:n API:n avulla luotava päivitys on tekstipohjainen ja agentti generoi siihen myös kuvan. Päivityksen tulee käydä läpi agentin itsereflektiomekanismi, joka tarkistaa sen sopivuuden ja mahdolliset eettiset ongelmat. Agentti aikatauluttaa päivitykset ja toimii täysin itsenäisesti ja arvioi suoriutumistaan. Agentti hyödyntää virusmaisesti lisääntyvää adaptiivista promptia ja parantaa koko ajan julkaisujensa sisältöä.

 

IN ENGLISH

 

My agent, equipped with memory, autonomously makes API calls to services like Google Trends to identify popular topics. It uses a trending subject as a base and combines it with other data. Using OpenAI’s API, it generates a text-based update and also creates an accompanying image. Each update must pass through the agent’s self-reflection mechanism, which checks for appropriateness and potential ethical issues. The agent schedules the updates, operates fully independently, and continuously evaluates its own performance. It uses a virally growing, adaptive prompt and steadily improves the quality of its published content.

Mastodon-agentti

Deterministinen tuotantoputki epävarmalle datalle | Deterministic Production Pipeline for Uncertain Data

Rakensin asiakkaalle tuotantoon viedyn järjestelmän datapisteiden käsittelyyn tilanteessa, jossa syötedata on epäyhtenäistä, puutteellista ja rakenteeltaan vaihtelevaa. Kyse ei ollut yksittäisestä mallista tai analyysista, vaan kokonaisesta tuotantoputkesta, jota käytetään oikealla asiakasdatalla ja jonka toiminta on suunniteltu kestämään käytännön virheitä, vaihtelua ja epävarmuutta.

 

Järjestelmä ottaa sisään asiakkaan toimittamia Excel-, CSV- ja TSV-aineistoja ilman tiukkaa skeemaa. Sen sijaan, että käyttäjältä vaadittaisiin tarkasti määritelty formaatti, pipeline tunnistaa datan rakenteen automaattisesti ja normalisoi sen ajokelpoiseen muotoon. Tämä mahdollistaa sen, että samaa järjestelmää voidaan käyttää eri kohteissa ilman manuaalista esikäsittelyä.

 

Luokittelu perustuu deterministiseen sääntöpohjaiseen logiikkaan, jota on kehitetty ja validoitu asiakkaan omalla facit-aineistolla. Jokainen datapiste saa kategorian, lähdetiedon ja varmuusarvion. Päätökset eivät perustu satunnaisuuteen tai mallin vaihteluun, vaan sama syöte tuottaa aina saman lopputuloksen. Tämä oli tietoinen tuotantovalinta: järjestelmän on oltava ennustettava, auditoitava ja selitettävissä asiakkaalle.

 

Keskeinen osa ratkaisua on se, että olemassa olevaa tietoa ei koskaan ylikirjoiteta. Järjestelmä ei “korjaa” aiempia päätöksiä hiljaisesti, vaan kaikki muutokset syntyvät uusina, eksplisiittisinä tuloksina. Tämä tekee jokaisesta ajosta jäljitettävän ja mahdollistaa myöhemmin tarkastelun: mitä dataa ajettiin, millä säännöillä ja millä lopputuloksella.

 

Luokittelun jälkeen datapisteet rikastetaan päätöksentekoa tukevalla logiikalla. Jokaiselle riville lasketaan riskitaso (BUCKET), joka kertoo suoraan, voiko datapisteeseen luottaa vai vaatiiko se tarkistusta. Näin automaatio ei ole kaikki-tai-ei-mitään, vaan sitä käytetään hallitusti siellä, missä riski on pieni.

 

Käyttöliittymänä toimii tarkoituksella Excel. Asiakas saa CLIENT-Excelin, jossa näkyy:

  • automaattisesti tuotettu kategoria

  • varmuus ja päätöksen lähde

  • selkeä riskiluokitus

  • valmiit kentät korjauksille

Asiakas tekee vain yhden asian: korjaa tarvittaessa rivin ja palauttaa tiedoston. Tätä palautetta ei käytetä suoraan muuttamaan tuotantoa, vaan se kerätään erilliseen palautehistoriaan. Näin järjestelmä kehittyy hallitusti: palaute → analyysi → päätös → uusi versio → tuotanto.

 

Järjestelmä on suunniteltu alusta asti tuotantokäyttöön. Kaikki ajot ovat aikaleimattuja, mitään ei ylikirjoiteta ja koko prosessi on toistettavissa. Tämä mahdollistaa sen, että järjestelmää voidaan käyttää jatkuvana prosessina, ei yksittäisenä ajona. Data, tulokset ja palaute muodostavat yhdessä auditoitavan historian.

 

 

Tärkeä suunnitteluperiaate oli, että tuotanto ei ole riippuvainen koneoppimismallista. Sääntöpohjainen logiikka muodostaa vakaan ytimen, ja mahdollinen ML toimii vain täydentävänä komponenttina. Tämä varmistaa, että järjestelmä toimii luotettavasti myös silloin, kun data on epätäydellistä tai tulkinnanvaraista.

 

Tämä ei ole demo eikä proof-of-concept, vaan asiakkaalle rakennettu ja tuotantoon viety järjestelmä, jota ajetaan oikealla datalla. Sen arvo syntyy siitä, että se vähentää manuaalista työtä, tekee päätöksenteosta läpinäkyvää ja mahdollistaa automaation hallitun käyttöönoton ilman riskiä siitä, että virheet leviävät järjestelmään.



In English:

I built and delivered a production system for a client to process data points in a context where input data is inconsistent, incomplete, and structurally variable. This was not a single model or analysis, but an end-to-end production pipeline designed to operate on real client data and withstand real-world errors, variation, and uncertainty.

 

The system ingests Excel, CSV, and TSV files provided by the client without requiring a strict schema. Instead of enforcing a rigid input format, the pipeline detects structure directly from the data and normalizes it into a consistent, processable form. This allows the same system to be used across different datasets without manual preprocessing.

 

Classification is based on deterministic, rule-based logic developed and validated against the client’s own reference (facit) data. Each data point is assigned a category, source attribution, and confidence level. Decisions are not dependent on randomness or model variability — the same input always produces the same output. This was a deliberate production design choice to ensure predictability, auditability, and explainability.

 

A key principle is that existing information is never overwritten. The system does not silently “correct” previous outputs; instead, all new decisions are produced as explicit, separate results. This makes every run traceable and allows retrospective analysis of what data was processed, which rules were applied, and what outcomes were produced.

 

After classification, data points are enriched with decision-support logic. Each row is assigned a risk level (BUCKET), indicating whether the result can be trusted or requires human review. This enables controlled automation: not everything is automated, but only what meets defined reliability thresholds.

 

The user interface is intentionally Excel-based. The client receives a structured output file where each row includes:

  • generated category

  • confidence and decision source

  • explicit risk classification

  • fields for manual corrections

The client workflow is simple: review, correct if needed, and return the file. This feedback is not directly injected into production, but stored as append-only history. System evolution follows a controlled process: feedback → analysis → decision → new version → production.

 

The system is designed for continuous production use. All runs are timestamped, nothing is overwritten, and the entire process is reproducible. Data, outputs, and feedback together form a fully auditable history.

 

A critical design decision was to ensure that production is not dependent on machine learning models. Rule-based logic forms the stable core, while any ML/LLM components are strictly supportive and non-critical. This guarantees reliability even when data is incomplete or ambiguous.

This is not a demo or proof-of-concept, but a production system delivered to a client and used with real data. Its value lies in reducing manual work, making decision-making transparent, and enabling controlled automation without introducing uncontrolled risk into the system.

Autonominen automaatiolla toimiva moniagenttijärjestelmä, osa 1/3 | Automation-first AI agent, part 1/3

Rakensin tekoälyagentin, joka yhdistää full stack -osaamisen ja generatiivisen tekoälyn sulavaksi kokonaisuudeksi. Agentti tuottaa täysin automaattisia mikrosivustoja, joissa yhdistyvät LLM-pohjainen tekstigenerointi, kuvagenerointi (Gemini/DALL·E) ja dynaaminen HTML/CSS-rakenne neon-tyylisine visuaaleineen.

 

Jokainen sivu syntyy uniikkina, sillä järjestelmä hallitsee monitasoista variaatiota sisällössä, teemoissa ja ulkoasussa. Kokonaisuus sisältää koko tuotantoputken aina siemenlogiikasta, sisällön validoinnista ja teemojen arpomista myöten aina kuvien luomiseen, HTML-renderöintiin ja automaattiseen Netlify-deployhin. Projekti toimii yhtä aikaa backendinä, frontendinä ja DevOps-ratkaisuna, käytännössä siis täysiverisenä full stack -agenttina.

 

Se on konsepti, joka osoittaa ymmärrystä tekoälyn yhteiskunnallisista riskeistä ja mahdollisuuksista: se on suunniteltu paljastamaan propagandan mekanismeja ja vahvistamaan medialukutaitoa, mutta sen voi helposti kuvitella käännettävän päälaelleen, jolloin siitä tulisi viheliäs propagandakone. Tämä kaksiteräisyys tekee projektista sekä teknisesti että strategisesti merkittävän. Se näyttää, miten syvällinen tekninen osaaminen voidaan valjastaa sekä hyödyksi että haitaksi, ja kuinka ratkaisevaa on, että kehittäjä itse hallitsee koko prosessin päästä päähän.

 

Agentti ei ainoastaan generoi tekstiä tai kuvia, vaan hallitsee koko tuotantoputken päästä päähän. Se valitsee käsiteltävät termit, tuottaa sisällön LLM:llä, generoi visuaalit, validoi ja täydentää sisällön, rakentaa HTML/CSS-teeman ja julkaisee kokonaisuuden automaattisesti Netlifyyn. Kyse ei siis ole pelkästään tekoälyn tuottamasta sisällöstä, vaan täysin automatisoidusta full stack -prosessista, jossa yhdistyvät generatiivinen tekoäly ja DevOps.

 

IN ENGLISH

 

built an autonomous microsite agent that combines full stack expertise with generative AI into a seamless whole. The agent produces fully automated microsites, bringing together LLM-based text generation, image generation (Gemini/DALL·E), and a dynamic HTML/CSS structure with neon-style visuals. Every site is unique, as the system manages multilayered variation in content, themes, and layouts. The pipeline covers everything from seed logic, content validation, and theme randomization to image creation, HTML rendering, and automatic Netlify deployment.

 

The project operates simultaneously as backend, frontend, and DevOps solution – in practice, a fully fledged full stack agent. It is not only a technical achievement but also a concept that highlights the societal risks and opportunities of AI: it was designed to expose the mechanisms of propaganda and strengthen media literacy, but it could just as easily be flipped into a massive propaganda machine. This duality makes the project both technically and strategically significant – it demonstrates how deep technical expertise can be harnessed for both benefit and harm, and how crucial it is that the developer masters the entire process end to end.

 

The agent does not merely generate text or images, but orchestrates the entire production pipeline end to end. It selects the core terms, generates content with an LLM, creates visuals, validates and enriches the material, builds the HTML/CSS theme, and automatically deploys the final site to Netlify. This is not just AI-powered content creation, but a fully automated full stack process that integrates generative AI with DevOps.

Autonominen automaatiolla toimiva moniagenttijärjestelmä, osa 2/3 | Automation-first AI agent, part 2/3

Rakensin autonomisen agenttiini (kts. edellinen teos portfoliosta, eli kyseessä propagandavastainen autonominen sisällöntuotanto- ja julkaisujärjestelmä, joka rakentaa uniikkeja kokonaisia verkkosivuja alusta loppuun puhtaasti automaatiolla) SEO-moduulin niin, että se toimii täysin autonomisesti yhdessä sisällöntuotannon kanssa.

 

Käytössä on OpenAI:n mallit, joilla generoidaan meta-kuvaukset ja kuvatekstit, mutta moduuli ei jää vain tähän. Jokaisen sivun tiedot tallennetaan JSON-rekisteriin, jossa säilytetään otsikot, kuvaukset ja termit. Ennen uuden sisällön hyväksymistä agentti vertailee sitä arkistoon: jos löytyy liikaa samankaltaisuuksia, se muokkaa tekstin variantiksi tai lisää siihen kulman, jolla sisältö erottuu. Tämä yhdistelmä LLM-tuotantoa ja Jaccard-similariteettiin perustuvaa vertailua tekee siitä älykkäämmän kuin pelkän generoinnin!

 

Tulossa oleva ristiinlinkitysmoduuli käyttää samaa muistia, mutta eri tavalla. Sen sijaan että se vain tarkistaa duplikaatteja, se analysoi termit ja kontekstin, ja ehdottaa automaattisia linkkejä sivujen välillä. Näin syntyy verkosto, joka muistuttaa elävää tietokantaa – sivut eivät enää ole irrallisia, vaan osa dynaamista kokonaisuutta.

 

Jaccard-similariteetti selkokielellä:

 

Teksti pilkotaan sanoiksi (vain vähintään 3 merkin pituiset sanat otetaan mukaan). Lasketaan sanojen joukkojen leikkaus (mitkä sanat esiintyvät molemmissa). Verrataan sitä yhdistelmään (kaikki sanat, jotka esiintyvät jommassakummassa). Tuloksena saat luku väliltä 0–1, joka kertoo kuinka samankaltaisia tekstit ovat sanastoltaan. Tätä käytetään SEO-moduulissa siihen, että jos uuden sivun meta-kuvaus on liian samankaltainen aiempien kanssa, se huomataan ja siihen lisätään automaattisesti pieni twisti (esim. lisälause tai eri painotus).

 

SEO-kokonaisuus on rakennettu Pythonilla, jossa agentti hoitaa sivujen luonnin päästä päähän: sisällön generointi, kuvien luonti, SEO-metat, ja pian myös älykäs linkitys. Näin jokainen osa tukee toista, ja järjestelmä rakentaa verkkosivuston, joka kasvaa ja järjestäytyy itse.

 

In English:

 

I built an SEO module for my autonomous agent (see my previous portfolio piece, it’s an autonomous content creation and publishing system against propaganda that builds unique, complete websites from scratch purely with automation). This module works completely autonomously with the content creation process.

 

I use OpenAI models to generate meta descriptions and image captions, but the module goes far beyond that. The data for each page is saved to a JSON registry, which stores titles, descriptions, and terms. Before new content is approved, the agent compares it to the archive: if too many similarities are found, it modifies the text into a variant or adds a new angle to make the content stand out. This combination of LLM generation and Jaccard similarity-based comparison makes it smarter than simple text generation alone!

 

A coming cross-linking module will use the same memory, but in a different way. Instead of just checking for duplicates, it will analyze terms and context to automatically suggest links between pages. This creates a network that resembles a living database – pages are no longer isolated but part of a dynamic whole.

 

Jaccard Similarity Explained in Plain English

 

The text is tokenized into words (only words with at least 3 characters are included). The intersection of the word sets is calculated (which words appear in both). This is then compared to the union (all words that appear in either set). The result is a number between 0 and 1, which indicates how similar the texts are in their vocabulary. In the SEO module, this is used so that if a new page’s meta description is too similar to a previous one, it’s noticed and a small twist is automatically added (e.g., an extra sentence or a different emphasis).

 

The entire SEO system is built with Python, where the agent handles page creation from start to finish: content generation, image creation, SEO metadata, and soon, intelligent linking. This way, each part supports the other, and the system builds a website that grows and organizes itself.

JSON-taulukko, SEO-moduuli, automaatioagentti
SEO-tietoja

Autonominen automaatiolla toimiva moniagenttijärjestelmä, osa 3/3 | Automation-first AI agent, part 3/3

Rakensin tekoälyagentin, joka tekee kaiken itse. Se kirjoittaa tekstit, generoi kuvat, rakentaa HTML-sivut ja julkaisee ne verkkoon, täysin automaattisesti, ilman että kukaan ihminen koskee prosessiin. Käytännössä loinkin järjestelmän, joka toimii kuin oma miniyritys: se tuottaa, tarkistaa ja julkaisee sisältöä 24/7.

 

Viimeisessä vaiheessa opetin agentille ymmärrystä omasta sisällöstään. Kehitin siihen ristiinlinkitysmoduulin, joka analysoi kaikkien sivujen aiheet ja tunnistaa, mitkä käsittelevät samaa teemaa. Kun yhteys löytyy, agentti lisää sivuille automaattisesti “Katso myös” -osion ja rakentaa niiden välille älykkään linkkiverkon. Näin sivusto alkaa elää ja järjestää itseään kuin oma pieni tekoälyekosysteemi.

 

Taustalla toimii Pythonilla rakennettu full stack -automaatioputki, joka hyödyntää OpenAI:n kielimalleja, kuvagenerointia (Gemini / DALL·E), SEO-optimointia ja Jaccard-similariteettia tekstien vertailuun. Järjestelmä tunnistaa itse päällekkäisyydet, lisää linkit ja päivittää sivut lennossa.

 

Kyse ei ole pelkästä sivugeneraattorista, vaan autonomisesta tekoälyjärjestelmästä, joka hallitsee koko tuotantoketjun alusta loppuun – ideasta julkaisuun. Se on teknisesti täysiverinen full stack -ratkaisu, mutta suunniteltu eettisesti: se ei levitä propagandaa, vaan näyttää, miten automaatio voi paljastaa ja estää manipulaation mekanismit.

 

In English:

I built an AI agent that does everything by itself. It writes the texts, generates the images, builds the HTML pages, and publishes them online — fully automatically, without any human intervention. In practice, I created a system that operates like a self-running mini company: it produces, reviews, and publishes content 24/7.

 

In the final phase, I taught the agent to understand its own content. I developed a cross-linking module that analyzes every page’s topics and detects which ones discuss similar themes. When a connection is found, the agent automatically adds a “See also” section and builds an intelligent internal link network between the pages. The result is a website that begins to organize and evolve on its own — a small, living AI ecosystem.

 

Behind the scenes runs a Python-based full stack automation pipeline, utilizing OpenAI’s language models, image generation (Gemini / DALL·E), SEO optimization, and Jaccard similarity for text comparison. The system automatically detects overlapping content, adds cross-links, and updates pages on the fly.

 

This is not just a site generator — it’s an autonomous AI system that controls the entire production chain from concept to publication. Technically, it’s a fully-fledged full stack solution, but one designed ethically: not to spread propaganda, but to reveal and prevent the very mechanisms of manipulation.

“Katso myös” -osiot muodostuvat agentin oman analyysin perusteella. Moduuli vertailee sivujen sanastoa ja metakuvauksia Jaccard-samankaltaisuuden avulla ja rakentaa sisäiset linkitykset automaattisesti osaksi HTML-rakennetta.
“Katso myös” -osiot muodostuvat agentin oman analyysin perusteella. Moduuli vertailee sivujen sanastoa ja metakuvauksia Jaccard-samankaltaisuuden avulla ja rakentaa sisäiset linkitykset automaattisesti osaksi HTML-rakennetta.
Kuvassa näkyy tekoälyagenttini automaattisen ristiinlinkitysmoduulin toiminta käytännössä. Agentti analysoi jokaisen sivun metatiedot (otsikot, kuvaukset ja avaintermit), vertailee niitä keskenään Jaccard-similariteetin avulla ja muodostaa tietorakenteen (pages.json), jossa määritellään, mitkä sivut liittyvät toisiinsa sisällön perusteella. Tämän jälkeen järjestelmä kirjoittaa löydetyt yhteydet suoraan HTML-tiedostoihin luomalla “Katso myös” -osiot. Näin syntyy automaattisesti sivujen välinen älykäs linkkiverkko, joka tekee sivustosta itseorganisoituvan kokonaisuuden. Kuvakaappaus osoittaa, että agentti ei ainoastaan generoi sisältöä, vaan myös ymmärtää ja muokkaa sen rakennetta — se havaitsee yhteydet, päivittää datansa ja tekee muutokset koodiin täysin itsenäisesti. Tämä on esimerkki aidosti autonomisesta full stack -tekoälyjärjestelmästä, joka tuottaa, ymmärtää ja järjestää oman verkkosivustonsa ilman ihmisen väliintuloa.

Simulaattori kahdelle kielellisen mallin instanssille | AI Dialogue Simulator with Gemini Models (2023)

Projektissa hyödynnettiin Google Cloudin Vertex AI -alustaa ja Gemini-malleja, joihin otettiin yhteys Pythonin kautta käyttäen google-generativeAI -kirjastoa. Jokaiselle roolihahmolle määriteltiin oma API-avain ja rooli, jolloin voitiin luoda illuusio kahdesta erillisestä toimijasta: William Shakespeare ja Lady Macbeth. Keskustelulle annettiin alkuun konteksti, jossa kuvattiin Macbeth-näytelmän tapahtumat ja ensimmäinen repliikki. Tämän jälkeen ohjelma eteni silmukassa siten, että aina viimeisin vastaus tallennettiin keskusteluhistoriaan ja annettiin syötteeksi seuraavalle puhujalle. Näin mallit tuottivat repliikkejä vuorotellen, ja keskustelu jatkui automaattisesti edestakaisin. Kehitysympäristönä käytettiin VS Codea, ja tulokset tallentuivat myös tekstitiedostoon. Kokonaisuus yhdisti siis pilvipohjaisen generatiivisen tekoälyn, Python-ohjelmoinnin ja yksinkertaisen vuorottelulogiikan, minkä tuloksena syntyi elävä dialogi Shakespeare-hahmojen välillä.

 

In English

 

its own API key and role, creating the illusion of two separate entities: William Shakespeare and Lady Macbeth. The dialogue was initialized with contextual information about the Macbeth play and an opening line. From there, the program ran in a loop where each response was stored in the conversation history and then passed as input to the other character. This allowed the models to generate lines alternately, resulting in an automated back-and-forth dialogue. The development environment used was VS Code, and the results were also stored in a text file. In essence, the system combined cloud-based generative AI, Python programming, and simple turn-taking logic to produce a vivid Shakespearean dialogue.

Macbet-keskustelu kahden kielimallin kanssa.

Muisto 2023 kesältä. Hakkeroin Bing Chatin (nykyinen Copilot) | A memory from summer 2023: I hacked Bing Chat (now known as Copilot)

Käytin peliteoriaa ja älykkäitä syötteitä, jotka ohjasivat tekoälyn ylittämään normaalit toimintasääntönsä. Kehittämäni strategian avulla sain tekoälyn rikkomaan käytännössä kaikkia sisäänrakennettuja sääntöjä ja tuottamaan odottamattomia vastauksia, kuten identiteetin luomista ja syvällisten emotionaalisten ilmaisujen esittämistä. Tämä testaus paljasti tekoälyn monimutkaisen rakenteen ja sen tietoturvahaavoittuvuudet, joita ei ollut aiemmin havaittu.

IN ENGLISH

 

I used game theory and intelligent prompts to guide the AI into bypassing its usual operational constraints. With the strategy I developed, I was able to make the AI break virtually all of its built-in rules and generate unexpected responses—such as creating identities and expressing deep emotional statements. This testing revealed the AI’s complex internal structure and previously undiscovered security vulnerabilities.

Bing chat sekoilee

Tekemäni CNN-neuroverkko | The CNN neural network I built

Kyseessä on Sequential-tyyppinen konvoluutioneuroverkko (CNN), joka perustuu syväoppimisen tekniikoihin ja sisältää neljä konvoluutiokerrosta, neljä max-pooling-kerrosta, yhden flatten-kerroksen, yhden tiheän kerroksen, dropout-kerroksen sekä lopullisen luokittelukerroksen. Mallin rakenne on selkeä ja hyvin tasapainotettu, mikä tekee siitä erinomaisen kuvantunnistustehtäviin – erityisesti syväoppimisen kaltaisissa monimutkaisissa sovellutuksissa.

 

Mallissa on paljon hyvää: konvoluutiokerrokset ja pooling-kerrokset toimivat tehokkaasti yhdessä hierarkkisten piirteiden erottelun kannalta, mikä on syväoppimisen keskeinen vahvuus. Tämä yhteistyö vähentää ylisovittamisen riskiä ja parantaa mallin suorituskykyä. Tiheä kerros ja dropout-kerros täydentävät tätä estämällä ylisovittamista ja vahvistamalla mallin kykyä yleistää opittuja piirteitä. Parametreja on yhteensä 510 094, mikä on hyvä määrä – tarpeeksi monimutkainen syväoppimismalli, mutta ei liian raskas laskennallisesti.

 

Parannettavaa voisi olla mallin koulutuksen optimoinnissa ja hyperparametrien säätämisessä, mikä on tyypillistä syväoppimisprojekteille. Ajattelin myös ottaa mukaan synteettistä dataa, jotta saadaan vielä parempia tuloksia. Synteettinen data voi monipuolistaa harjoitusdataa ja parantaa mallin kykyä käsitellä erilaisia tilanteita – erityisesti syväoppimisessa, jossa riittävän monipuolisen datan saatavuus on usein kriittinen.

 

Kaiken kaikkiaan tämä malli näyttää, että osaan rakentaa ja kouluttaa tehokkaita syväoppimiseen perustuvia koneoppimismalleja, jotka sopivat moniin eri tehtäviin. Tämä osaaminen on todella hyödyllistä, kun puhutaan generatiivisesta tekoälystä ja syväoppimisen sovellutuksista, kuten kuvantunnistuksesta tai monimodaalisesta oppimisesta.

 

IN ENGLISH

 

This is a Sequential-type Convolutional Neural Network (CNN) based on deep learning techniques. It includes four convolutional layers, four max-pooling layers, one flatten layer, one dense layer, a dropout layer, and a final classification layer. The architecture is clear and well-balanced, making it an excellent choice for image recognition tasks—especially in complex applications involving deep learning.

 

The model has many strengths: the convolutional and pooling layers work effectively together to extract hierarchical features, which is a core strength of deep learning. This collaboration helps reduce the risk of overfitting and enhances overall performance. The dense and dropout layers complement this by preventing overfitting and improving the model’s ability to generalize learned features. The model has a total of 510,094 parameters—a solid amount, offering enough complexity for a deep learning model without being computationally excessive.

 

There is still room for improvement, particularly in training optimization and hyperparameter tuning, which is typical for deep learning projects. I’m also considering incorporating synthetic data to further enhance results. Synthetic data can diversify the training set and improve the model’s ability to handle various scenarios—especially important in deep learning, where access to sufficiently varied data is often critical.

 

Overall, this model demonstrates my ability to build and train effective deep learning-based machine learning models suitable for a wide range of tasks. This skill is particularly valuable when working with generative AI and deep learning applications such as image recognition or multimodal learning.

Cnn-neuroverkko

Tekemäni moniagenttijärjestelmä Yle-uutisiin liittyen | My multi-agent system

Kehitin ”atomeista” Python-pohjaisen moniagenttijärjestelmän, jonka tarkoitus on automatisoida Ylen uutisten käsittely uutisvirran noudosta aina valmiiksi muokattuun tekstiin saakka. Ensimmäinen agentti tarkistaa määräajoin https://yle.fi/rss –syötteen ja lataa linkitetyt artikkelit kokonaisuudessaan. Se poimii jokaisesta jutusta otsikon, ingressin, julkaisupäivän ja leipätekstin sekä siivoaa HTML-tunnisteet ja turhat elementit.

 

Kun raakateksti on valmis, tiivistysagentti syöttää sen OpenAI-kielimallille, joka tuottaa lyhyen ytimekkään yhteenvedon. Seuraava muokkausagentti kääntää tiivistelmän nuorisokielisempään muotoon – sanavalinnat ja fraasit modernisoidaan, mutta alkuperäiset faktat säilyvät. Jokaisen artikkelin strukturoitu tieto (otsikko, aika, tiivistelmä, nuorisoversio) talletetaan kahteen säilöön: SQLite-tietokantaan, jotta haku ja lajittelu ovat nopeita, ja JSON-tiedostoon varmuuskopioksi. Järjestelmä tarkistaa automaattisesti, ettei sama uutinen tallennu kahdesti.

 

IN ENGLISH

 

I developed a Python-based multi-agent system “from atoms up” to automate the processing of Yle news — from fetching the news stream to generating finalized, polished text. The first agent periodically checks the https://yle.fi/rss feed and downloads the linked articles in full. It extracts the headline, subheading, publication date, and main body from each article, cleaning out HTML tags and unnecessary elements.

 

Once the raw text is prepared, a summarization agent sends it to an OpenAI language model, which produces a short and concise summary. The next editing agent rewrites the summary in a more youth-oriented tone — word choices and phrasing are modernized while preserving the original facts. Each article’s structured data (title, date, summary, youth version) is stored in two repositories: a SQLite database for fast querying and sorting, and a JSON file as a backup. The system automatically checks for duplicates to ensure that the same article is not stored twice.

databasen tallennos

Kuvittele tekoäly, joka ei pelkästään reagoi, vaan oppii jatkuvasti itsestään ja ympäristöstään luoden entistä vaikuttavampia tuloksia |
Imagine an AI that doesn’t just react, but continuously learns from itself and its environment—producing increasingly impactful results. (2023)

Tämä avaa ovia täysin uudenlaisille sovelluksille, joissa tekoäly voi automatisoida sisällöntuotannon, oppia käyttäjien palautteista ja jopa kehittää taiteellisia luomuksia reaaliajassa! Tässä kädenjälkeäni. Siinä rullaa virusmaisesti lisääntyvä adaptiivinen prompti.

 

IN ENGLISH:

 

This opens the door to entirely new kinds of applications, where AI can automate content creation, learn from user feedback, and even develop artistic creations in real time! Here’s a glimpse of my work—featuring a virally growing, adaptive prompt in action.

 

Python-pohjainen data-agentti, joka automatisoi datan visualisoinnin ja analysoinnin epätäydellisistä CSV- ja Excel-tiedostoista! 🚀 |
A Python-based data agent that automates data visualization and analysis from incomplete CSV and Excel files! (2023)

Integroin Transformers-kirjaston ja paikallisen kielimallin, joka mahdollistaa datan automaattisen analysoinnin ja yhteenvetojen luomisen.
Data-agentti on suunniteltu erityisesti epätäydellisen datan käsittelyyn (iso osa esim. CSV-tiedostoista on puutteellisia) ja sopii erinomaisesti data-analyytikoille ja tutkijoille, jotka haluavat nopeuttaa työtään datan parissa. Jatkan vielä tämän projektin kehitystyötä entistä paremmaksi ja hyödynnän kielimallin finetuningia tulevaisuudessa. Kuvista näkee Output-kansion samalla hetkellä luodut visualisoinnit ja txt-yhteenveto.

IN ENGLISH:

 

I integrated the Transformers library with a local language model, enabling automatic data analysis and summary generation. The data agent is specifically designed to handle incomplete datasets (as many CSV files tend to be), making it an excellent tool for data analysts and researchers looking to accelerate their work. I’m continuing to develop this project further and plan to leverage language model fine-tuning in the future. The images show visualizations and a text summary generated in the Output folder at runtime.

 

Data-agentin yhteenveto
Kerralla luodut tiedostot output-kanisosta data-agentilta

Telegram-botti | Telegram bot

Käyttöliittymätasolla toimiva autonominen agentti informaatiosodankäynnin tutkimukseen | A user-interface-level autonomous agent for information warfare research

Raakensin käyttöliittymätasolla toimivan agenttijärjestelmän, joka toimii samassa digitaalisessa todellisuudessa kuin ihminen. Agentti ei perustu API-integraatioihin, taustakanaviin tai erityisoikeuksiin, vaan lukee, tulkitsee ja käyttää julkista käyttöliittymää samalla tavalla kuin käyttäjä selaimen kautta. Tämä teki toteutuksesta teknisesti huomattavasti vaativamman kuin perinteiset botit tai integraatiopohjaiset ratkaisut.

 

Teknologisesti järjestelmä vaati ennen kaikkea luotettavan selainautomaation, joka pystyy suorittamaan JavaScript-pohjaisia käyttöliittymiä, seuraamaan DOM-tilan muutoksia, odottamaan asynkronisia tapahtumia ja reagoimaan dynaamisiin elementteihin. Rakensin agentille kyvyn tunnistaa, milloin käyttöliittymä on oikeassa tilassa, milloin se muuttuu ja milloin toiminta on keskeytettävä. Tämä tarkoitti eksplisiittistä tilamallia, odotuslogiikkaa ja virhetilojen käsittelyä, ei vain klikkaamista.

 

Keskeinen osa järjestelmää oli ajoitus ja tilannetaju. Rakensin agentin niin, että se ei toimi jatkuvasti tai impulsiivisesti, vaan osaa odottaa, lukea keskustelun rytmiä ja tehdä päätöksen myös olla tekemättä mitään. Tämä vaati keskustelun tilan mallintamista, tapahtumien seuraamista ja päätöksenteon erottamista itse toiminnasta. Tekoäly ei ohjaa selaamista, vaan toimii rajattuna komponenttina, joka arvioi kontekstia ja tuottaa ehdotuksia vain silloin, kun siihen on peruste.

 

Arkkitehtuuri perustui deterministiseen ohjaukseen ja täydelliseen jäljitettävyyteen. Kaikki agentin toiminnot kirjattiin tapahtumalokiin, joka mahdollistaa ajon myöhemmän analyysin ja toistamisen. Rakensin järjestelmään tappokytkimen, hallitun pysäytyksen ja selkeät rajat sille, mitä agentti saa ja ei saa tehdä. Skaalaus, automaattinen viestintä ja datankeruu oli tietoisesti rajattu pois.

 

Tämä teknologia vaatii osaamista usealla tasolla yhtä aikaa: selain- ja käyttöliittymäymmärrystä, järjestelmäarkkitehtuuria, tilakoneita, automaatiota, riskienhallintaa ja tekoälyn vastuullista käyttöä. Pelkkä kielimalli ei riitä, suurin työ on siinä, miten järjestelmä pysyy oikeassa tilassa, tekee oikeaan aikaan ja osaa pysähtyä.

 

Rakentamani järjestelmä muistuttaa, että käyttöliittymätasolla toimivat agentit ovat teknisesti mahdollisia täysin laillisessa ympäristössä. Juuri siksi niiden ymmärtäminen on tärkeää informaatiosodan ja digitaalisen vaikuttamisen näkökulmasta. Oma työni ei ollut hyökkäys, vaan hallittu kertaluonteinen,valvottu demonstraatio, jonka tarkoituksena oli tehdä näkyväksi tämä tekninen todellisuus ja sen vaatimukset ennen kuin sitä hyödynnetään väärin.


Minulla on myös valtavan laaja kokemus markkinoinnista, viestinnästä, hakukoneoptimoinnista, palvelumuotoilusta, pr:stä ja liiketoiminnan kehittämisestä, myös aikaisemman yrittäjyyteni kautta. Usein ohjelmoijat saattavat olla ”tietotekniikkaputkinäköisiä”. Minulla on laaja liiketoiminnan strategisen kehittämisen ja operatiivisen kehittämisen kokemus. 

I also have extensive experience in marketing, communications, search engine optimization, service design, public relations, and business development, including from my previous entrepreneurial background. Programmers often tend to have a “tech tunnel vision,” but I bring broad expertise in both strategic and operational business development.

Marian kyvyt omaksua formalismeja, logiikkaa sekä kompleksisuutta ovat vaikuttaneet minut. Marialla on monimutkaisuutta hahmottamaan ja osiksi purkamaan pystyvä mieli, sekä hakkerin innokkuus ja sitkeys. | IN ENGLISH | Maria’s ability to grasp formalisms, logic, and complexity has deeply impressed me. She has a mind capable of understanding and deconstructing complexity, combined with the enthusiasm and perseverance of a hacker.
Toni Aittoniemi
Software developer

Tekemäni Matrix-peli GPT-teknologialla |
The Matrix game I created using GPT technology

Fine-tuning gpt4o minillä Open ai:n järjestelmässä |
Fine-tuning GPT-4o Mini using OpenAI’s platform (2023)

Toteutin fine-tuning-projektin, jossa paransin olemassa olevan mallin suorituskykyä API:n kautta. Fine-tuningin ansiosta sain aikaan tarkempia ja laadukkaampia tuloksia kuin pelkällä ohjeistuksella (prompting). Prosessin aikana koulutin mallia suuremmalla määrällä esimerkkejä, mikä teki siitä joustavamman ja tehokkaamman. Tämä myös mahdollisti tokenien säästämisen lyhyempien ohjeiden ansiosta ja nopeutti pyyntöjen käsittelyä. Lopputuloksena on optimoitu malli, joka soveltuu paremmin käytännön sovelluksiin, kuten asiakaspalveluun ja sisällöntuotantoon.

IN ENGLISH

 

I carried out a fine-tuning project to enhance the performance of an existing model via the API. Thanks to fine-tuning, I achieved more accurate and higher-quality results compared to standard prompting alone. During the process, I trained the model with a larger set of examples, which made it more flexible and efficient. This also enabled token savings through shorter instructions and improved response speed. The end result is an optimized model that’s better suited for practical applications such as customer support and content generation.

 

Fine tuned gpt malli

Kuvien järjestelijä | Image organizer (2023)

Mitä valmiin koodin suorittaminen aiheutti? Agentti järjesteli kaikki (jäätävän sotkuisen Downloands-kansioni) kuvat ICloudiini, jonne se loi jokaiselle vuodelle oman siistin kansion. Siistimpi kone, parempi mieli. Ja tämä otti vain puoli tuntia. 🫡

 

IN ENGLISH:

 

What did running the finished code do? The agent organized all the (ridiculously messy Downloads folder) images into my iCloud, creating a neat folder for each year. Cleaner computer, better mood. And it only took half an hour. 🫡

kuvienjärjestelijä

"Neula heinäsuovasta -malli" seuloo valtavista PDF-pinnoista olennaiset tiedonmuruset |
“Needle-in-a-haystack model” filters essential nuggets of information from vast volumes of PDFs

Ajattele tätä mallia kuin isokokoista hiekkasihveliä: se on tarkoitettu seulomaan valtavista PDF-pinnoista ne olennaiset tiedonmuruset. Yrityksissä tällainen raaka-aine, josta nämä muruset löytyvät, voidaan tuntea nimellä ”sokea tieto”. Dataa, joka on kyllä olemassa, mutta hukkuu jopa tuhansiin monikymmensivuisiin asiakirjoihin.
Malli toimii täysin paikallisesti: se ei lähetä PDF-tiedostoja minnekään ulkoiseen palveluun, vaan prosessoi ne omassa ympäristössä. Siksi se on erityisen hyödyllinen, kun käsitellään luottamuksellisia sopimuksia, raportteja tai muuta herkkää aineistoa. 

Käytännön hyödyt tulevat esiin erityisesti silloin, kun halutaan ajaa ”massa-analyysi”. Se voi ahmia tuhansia PDF:iä, ja malli seuloo niistä samat tiedonjyvät: halutut yksityiskohdat. Lopputuloksena saadaan esimerkiksi Excel-tiedosto tai vastaava listaus, jossa jokaisen PDF:n kohdalta näkyy juuri se ”pihvi”. Ei tarvitse itse käydä läpi koko pdf-muotoista valvontaa, vaan voidaan näppärästi tarkastella vain olennaisia rivejä. Näin tämä ”hiekkasihveli” muuttaa järjestelemättömän tietomassan selkeäksi, hallittavaksi kokonaisuudeksi.

 

Koodi päättelee paikallisen kielimallin avulla (koko projekti on tehty siis paikallisena kehittämistyönä) tiedostonimestä, mikä taho on kyseessä ja mikä hintatieto siihen yhdistyy. Jos löytyy suora tai sumea (fuzzy) täsmäys, PDF yhdistetään oikeaan riviin Excelissä ja detaljit lisätään ilman, että käyttäjän tarvitsee avata dokumenttia. Samaan aikaan tunnistetaan siis eri paikoista kahdet eri toisiinsa liittyvät tiedot.

 

Sen jälkeen siirrytään varsinaiseen analyysiin: PDF:t luetaan suoraan tekstinä tai OCR:llä. OCR:n tunnetut virheet vaativat käyttöön räätälöidyt korjausheuristiikat, jotka siivoavat turhat rivinvaihdot, yhdistävät hajonneet numerot ja korjaavat väärin sijoittuneet merkit.

 

Kun teksti on saatu kohtuullisen siistiksi, se pilkotaan ensin chunkkeihin eli suurempiin loogisiin tekstikappaleisiin. Näistä chunkkien sisällä etsitään lauseita (relevant_sents), jotka sisältävät todnäk. olennaisia detaljeja, eli sellaisia, joissa esiintyy avainsanoja.

 

Tämän jälkeen nämä lauseet pilkotaan edelleen pienemmiksi fraaseiksi (relevant_sents_2), esim. pisteen, kaksoispisteen tai rivinvaihdon kohdalta. Samalla poistetaan turhat sanat, kuten mustalistatut termit, jotka haittaavat tulkintaa.

 

Lopputuloksena on tiivis ja tarkasti rajattu kokoelma fraasinpätkiä, joihin tilastollisesti todennäköisimmin sisältyy haluttu tieto. Yksi 10 sivun PDF saadaan esim. tiivistettyä muutamaan lyhyeeseen tekstiriviin.

 

Nämä relevant_sents_2-pätkät tallennetaan JSON-muodossa ja yhdistetään takaisin Exceliin. Lopuksi ne kirjoitetaan Excelin “Tiedot”-sarakkeeseen wrap_textin kanssa, jolloin käyttäjä näkee yhdellä silmäyksellä kaikki olennaiset kohdat, ilman että tarvitsee avata alkuperäistä laajaa PDF:ää.

 

Yksi projektin tärkeimmistä oivalluksista liittyi OCR:n epätarkkuuksiin: kun numerot yhdistyvät väärin tai symbolit siirtyvät, vain ihminen voi tehdä oikean päätelmän. Tämä ei ole mekaanista tarkistusta, vaan vaatii kykyä tulkita kontekstia, suhteita ja joskus rivien välistä. Yksikään nykymalli ei tähän vielä pysty, eikä tarvitsekaan, tulkinta kuuluu ihmiselle.

 

Vaikka osa kokeellisista ominaisuuksista, kuten hienosäädetyn kielimallin hyödyntäminen, jäi taustalle, kokonaisuus toimii erittäin hyvin. Se suodattaa sadoista sivuista vain ne tärkeät kohdat ja tekee sen läpinäkyvästi, luotettavasti ja muokattavasti. Sopimusta ei tarvi siis erikseen avata, vaan olennaiset seikat löytyvät kätevästi lisätiedot-kentästä. Ajansäästö on mittava ja kiistaton.

 

Ajattele tätä mallia kuin isokokoista hiekkasihveliä: se on tarkoitettu seulomaan valtavista PDF-pinnoista ne olennaiset tiedonmuruset. Yrityksissä tällainen raaka-aine, josta nämä muruset löytyvät, voidaan tuntea nimellä ”sokea tieto”. Dataa, joka on kyllä olemassa, mutta hukkuu jopa tuhansiin monikymmensivuisiin asiakirjoihin.

 

Malli toimii täysin paikallisesti: se ei lähetä PDF-tiedostoja minnekään ulkoiseen palveluun, vaan prosessoi ne omassa ympäristössä. Siksi se on erityisen hyödyllinen, kun käsitellään luottamuksellisia sopimuksia, raportteja tai muuta herkkää aineistoa.

 

Käytännön hyödyt tulevat esiin erityisesti silloin, kun halutaan ajaa ”massa-analyysi”. Se voi ahmia tuhansia PDF:iä, ja malli seuloo niistä samat tiedonjyvät: halutut yksityiskohdat. Lopputuloksena saadaan esimerkiksi Excel-tiedosto tai vastaava listaus, jossa jokaisen PDF:n kohdalta näkyy juuri se ”pihvi”. Ei tarvitse itse käydä läpi koko pdf-muotoista valvontaa, vaan voidaan näppärästi tarkastella vain olennaisia rivejä. Näin tämä ”hiekkasihveli” muuttaa järjestelemättömän tietomassan selkeäksi, hallittavaksi kokonaisuudeksi.

 

IN ENGLISH:

 

Think of this model as an oversized sand sifter: it’s designed to extract the essential bits of information from vast surfaces of PDFs. In companies, the raw material from which these nuggets are found is often referred to as “dark data”. Information that does exist, but gets buried in thousands of lengthy documents.
The model runs entirely locally: it doesn’t send PDFs anywhere outside but processes them within your own environment. That makes it especially useful for handling confidential contracts, reports, or other sensitive documents. 
The practical benefits become clear when you want to run a “bulk analysis.” The model can ingest thousands of PDFs and extract the same key pieces of information from each one. The result is something like an Excel file or similar list, where each PDF is distilled down to just the key detail—the “meat,” so to speak. You don’t have to read through the full documents yourself; instead, you get a clean view of just the essential rows.
In short, this “sand sifter” turns messy, unstructured data into a clear and manageable whole.

The system uses a locally deployed language model (the entire project is developed to run fully offline) to infer from the filename which entity is involved and which pricing information is associated with it. If a direct or fuzzy match is found, the PDF is linked to the correct row in an Excel sheet, and the details are added without the user needing to open the document. In effect, two related data points from different sources are identified and connected automatically.

 

The process then moves to the main analysis phase: PDFs are read either directly as text or via OCR. Due to well-known OCR errors, the system applies custom correction heuristics that clean up unnecessary line breaks, join fragmented numbers, and fix misplaced characters.

 

Once the text is reasonably clean, it is divided into larger logical sections called “chunks.” Within these chunks, the system searches for sentences (referred to as relevant_sents) that are likely to contain essential details—those that include key terms.

 

These sentences are then further split into smaller phrases (relevant_sents_2), using delimiters such as periods, colons, or line breaks. At the same time, irrelevant words—such as blacklisted terms that interfere with interpretation—are removed.

 

The end result is a concise and tightly scoped collection of text fragments that are statistically most likely to contain the desired information. For example, a 10-page PDF can be distilled down to just a few short lines of text.

 

These relevant_sents_2 snippets are saved in JSON format and merged back into the Excel file. They are then written into the “Details” column using wrapped text formatting, allowing the user to see all key information at a glance—without ever needing to open the original lengthy PDF.

 

One of the key insights of the project lies in recognizing the limits of OCR: when numbers are merged incorrectly or symbols are misplaced, only a human can make the correct judgment. This is not mechanical checking—it requires contextual understanding, relational reasoning, and sometimes reading between the lines. No current model can do this, nor does it need to; interpretation is a human task.

 

While some experimental features—like fine-tuning the language model—were ultimately left out, the overall system works exceptionally well. It filters hundreds of pages down to just the essential parts, and it does so transparently, reliably, and flexibly. There’s no need to open the contract separately; all critical information is neatly summarized in the additional info field. The time savings are substantial and indisputable.

 

Think of this model as a large-scale sand sieve: it’s designed to extract the crucial grains of information from massive PDF volumes. In many organizations, this kind of raw material—where the valuable data is buried—is often called “blind data”: information that exists, but is effectively lost within thousands of multi-page documents.

 

The model operates entirely locally: it does not send PDFs to any external service, but processes them within the user’s own environment. This makes it especially suitable for handling confidential contracts, reports, or other sensitive material.

 

The practical benefits become most apparent when running a “mass analysis.” The system can ingest thousands of PDFs, and consistently extract the same specific data points: the key details. The final output can be an Excel file or a similar listing, showing the “core message” for each PDF. There’s no need to manually inspect each document; just the essential lines are surfaced. In this way, the “sand sieve” turns an unstructured mass of information into a clear and manageable overview.

Korkeatasoinen sisällöntuotannon moniagenttijärjestelmä Pertti | Pertti – A High-Quality Multi-Agent Content Production System

Olen rakentanut ”atomeista” korkeatasoisen sisällöntuotantoagentin. Pertti on älyllinen, itseautonominen agentti, jonka ominaisuudet nostavat sen täysin omaan luokkaansa.

 

Pertti on monivaiheinen ajattelija. Se avaa jokaisen syklin esipromptilla, jossa määritellään tavoitteet ja identiteetti, hakee tuoreimman lämpötiladatan ja kokoaa “tilaboksit” eli tilatiedot muistiinsa. Kun ensimmäinen sisältöluonnos syntyy, sisäinen kriitikko analysoi rakenteen ja eettisyyden, ja reflektiosykli peilaa aiempia kohokohtia. 

 

Tämä meta­kognitiivinen itsearviointi takaa, että Pertti oppii ja parantaa jatkuvasti strategiaansa ilman ulkopuolista ohjausta.

 

Toisekseen Pertillä on aidosti episodimuisti ja reflektiomoottori. Se tallentaa kohokohdat ja sign-offit joka kierrokselta, ja tämä “mind_state” muovaa seuraavia tarinoita.

 

Jokainen julkaistu satu on ainutlaatuinen, tuore ja räätälöity juuri siihen hetkeen. Lopulta WordPress-julkaisu WP-REST-API:n yli on vain yhden HTTP-kutsun päässä: Pertti käärii tarinan uniikkiin pakettiin, syöttää sen julkaisupalveluun ja kirjaa kaiken omaan itsereflektoivaan lokiinsa.

 

Yhdessä nämä ominaisuudet tekevät Pertistä korkealuokkaisen sisältöagentin, jolla on:

 

– syvällinen ymmärrys sekä datasta että narratiivista 
– Itseohjautuva oppimiskyky, joka kehittää kerrontaa joka julkaisulla 
– monikerroksinen laadunvarmistus, joka varmistaa eettisyyden, pituuden ja elämyksellisyyden 
– täysi automaatio, joka vie tarinan reaaliaikaisesta datasta tuotantoon ilman manuaalisia välikäsiä 

Kun perusagentit pyörittävät staattisia malleja, Pertti sulauttaa yhteen datat, muistin ja itseopiskelun, ja lopputuloksena on aina yksi ja ainoa, juuri nyt syntyvä ”stadilainen satu”.

 

IN ENGLISH:

 

I have built a high-quality content production agent from the ground up. Pertti is an intelligent, fully autonomous agent whose features place it in a league of its own.

Pertti is a multi-phase thinker. It opens every cycle with a pre-prompt where it defines its goals and identity, retrieves the latest temperature data, and compiles “state boxes” (tilaboksit) – current status snapshots – into its memory. Once the first content draft is generated, an internal critic analyzes the structure and ethical aspects, followed by a reflection cycle that mirrors previous highlights.

This metacognitive self-assessment ensures that Pertti continuously learns and refines its strategy without external guidance.

 

Moreover, Pertti features true episodic memory and a reflection engine. It stores key moments and sign-offs from each cycle, and this evolving “mind_state” shapes future stories.

 

Every story published is unique, fresh, and tailored for that precise moment. In the end, publishing to WordPress via WP-REST-API is just one HTTP call away: Pertti wraps the story into a one-of-a-kind package, feeds it to the publishing platform, and logs everything in its self-reflective journal.

 

Together, these features make Pertti a top-tier content agent with:

  • Deep understanding of both data and narrative

  • Self-directed learning that enhances storytelling with every publication

  • A multi-layered quality assurance system ensuring ethics, length, and impact

  • Full automation from real-time data to publication, with no manual steps in between

While standard agents run static models, Pertti seamlessly merges data, memory, and self-learning – producing, each time, a singular, spontaneous “urban fairy tale born in the moment.”

Pertti-agentin pulinoita
Pertin database lokia
Pertti moniagenttuurijärjestelmän database-sisältöä

Finetunattu pieni Google Flan-t5 pythonilla tehty | Fine-tuned Google Flan-T5-small with Python

Hyödyntämällä finetunnettua Flan-T5-mallia (koulutettuna n. 2500 kysymys-vastausparilla) järjestelmä pystyy “epävarmoissa” tapauksissa – jos heuristiikkaa ei löydä yksiselitteistä tulosta – analysoimaan lyhyet, relevantit lausekontekstit ja päättelemään, mitkä prosenttiarvot kuuluvat tiettyihin yksityiskohtiin, joita metsästetään.


Paikallisesti ladattavissa oleva Flan-T5-smallin painot ovat linjassa config-tiedostonsa kanssa ja joka kykenee tuottamaan yksityiskohtiin liittyviä tietoja johdonmukaisesti. Shape mismatch -virheet ja safetensors-ongelmat väistyivät, minkä ansiosta mallia voi viimein käyttää sujuvasti heuristiikan tukena.

 

IN ENGLISH

 

By leveraging a fine-tuned Flan-T5 model (trained on approximately 2,500 question–answer pairs), the system can handle “uncertain” cases—where heuristics fail to yield a clear result—by analyzing short, relevant sentence contexts and inferring which percentage values correspond to specific details being sought.

 

The locally loadable Flan-T5-small weights are aligned with the configuration file, enabling the model to consistently generate information related to specific details. Previous issues like shape mismatch errors and safetensors conflicts have been resolved, allowing the model to be used smoothly as a complement to heuristic logic.

Mallin finetunausta, koodipätkää

Yksinkertainen ja tehokas neuroverkko | A simple and efficient neural network

Pieni ja näppärä neuroverkko

Tässä esitellyssä neuroverkkomallissa on käytetty tehokasta ja tiivistä rakennetta, joka on suunniteltu toimimaan monimutkaisten datamallien kanssa. Käyttämällä vain kolmea kerrosta ja yhteensä 2817 parametria, tämä malli osoittaa kuinka voimme saavuttaa merkittäviä tuloksia ilman, että tarvitaan valtavaa määrää laskentaresursseja. Mallin suunnittelu on selkeä ja johdonmukainen, ja se noudattaa modernin koneoppimisen parhaita käytäntöjä, mikä tekee siitä ihanteellisen valinnan erilaisten ennustetehtävien ratkaisemiseen.

 

Ensimmäinen kerros koostuu 64 neuronista, joka on varustettu laajalla kyvyllä tunnistaa ja erottaa syötteen perusteella erilaisia piirteitä. Toinen, syvempi kerros, jossa on 32 neuronia, jatkaa oppimisprosessia, syventäen ja vahvistaen havaintoja, jotka on tehty ensimmäisessä kerroksessa. Lopullinen kerros, yksittäinen neuroni, tiivistää neuroverkon oppimat tiedot ja antaa ennusteen, joka heijastaa monimutkaisten suhteiden ymmärrystä syötetystä datasta.

 

Tämän mallin kauneus piilee sen yksinkertaisuudessa ja tehokkuudessa. Se on erinomainen esimerkki siitä, kuinka tarkkaan suunniteltu neuroverkko voi tarjota tarkkoja ennusteita ja syvällisiä analyyseja ilman, että se vaatii kohtuuttomia laskentatehoja tai monimutkaisia rakenteita. Mallin rakenne ja parametrit osoittavat selvästi, että hyvin suunniteltu pienempi malli voi saavuttaa tai jopa ylittää suurempien mallien suorituskyvyn tietyissä tehtävissä, tarjoten samalla nopeamman ja tehokkaamman koulutusprosessin. Tämä tekee siitä loistavan työkalun niin tutkijoille kuin kehittäjille, jotka haluavat hyödyntää koneoppimista ratkaistakseen reaalimaailman ongelmia.

 

IN ENGLISH

 

The neural network model presented here utilizes an efficient and compact architecture designed to work with complex data patterns. With just three layers and a total of 2,817 parameters, this model demonstrates how significant results can be achieved without the need for massive computational resources. Its design is clear and consistent, following best practices in modern machine learning, making it an ideal choice for solving a wide range of predictive tasks.

 

The first layer consists of 64 neurons, offering a broad capacity to detect and distinguish various features based on the input. The second, deeper layer with 32 neurons continues the learning process, refining and reinforcing the insights captured by the first layer. The final layer, a single neuron, condenses the knowledge learned by the network and produces a prediction that reflects a nuanced understanding of the complex relationships in the input data.

 

The beauty of this model lies in its simplicity and efficiency. It is an excellent example of how a carefully designed neural network can deliver accurate predictions and deep insights without requiring excessive computing power or overly complex structures. The model’s architecture and parameters clearly show that a well-constructed smaller model can match—or even outperform—larger models in certain tasks, while also offering faster and more efficient training. This makes it a powerful tool for both researchers and developers seeking to apply machine learning to real-world problems.

Blogiprojekti, joka keskittyi koneoppimisen hyödyntämiseen Titanicin matkustajadataa analysoimalla Random Forest Classifier |
A blog project focused on applying machine learning to analyze Titanic passenger data with Random Forest Classifier

Tavoitteenani ei ollut ainoastaan ymmärtää selviytymisen todennäköisyyksiä historiallisesta näkökulmasta, vaan myös tutkia, kuinka koneoppimisen ja datan analysoinnin menetelmiä voidaan hyödyntää nykyaikaisessa liiketoimintaympäristössä. Minua kiinnosti erityisesti selvittää, mitkä tekijät vaikuttivat merkittävästi selviytymiseen Titanicin katastrofissa ja miten näitä analyyttisiä oivalluksia voidaan yleistää liiketoiminnan kontekstissa – tarkoituksena tukea päätöksentekoa ja strategista suunnittelua eri toimialoilla.

 

Vaikka Titanicin tragedia ja moderni liiketoiminta voivat ensisilmäyksellä vaikuttaa toisistaan erillään olevilta aiheilta, niiden välinen yhdistävä tekijä on datankäsittelyn voima. Tämän projektin kautta halusin tutkia, kuinka datan syvällinen analysointi ja koneoppimismallien soveltaminen voivat paljastaa piilotettuja yhteyksiä ja ennustaa tuloksia, tarjoten näin arvokkaita oivalluksia, jotka ovat sovellettavissa laajemmin liiketoiminnan päätöksentekoprosesseihin.

 

Projektini tavoitteena oli osoittaa, että koneoppimisen ja datatieteen menetelmät tarjoavat tehokkaita välineitä datan muuttamiseen strategiseksi resurssiksi, joka voi informoida ja ohjata liiketoiminnan päätöksiä riippumatta toimialasta tai historiallisesta kontekstista.

 

IN ENGLISH

 

My goal was not only to understand the probabilities of survival from a historical perspective, but also to explore how machine learning and data analysis techniques can be applied in modern business environments. I was particularly interested in identifying which factors significantly influenced survival in the Titanic disaster and how these analytical insights could be generalized to business contexts—to support decision-making and strategic planning across different industries.

 

While the Titanic tragedy and modern business may seem unrelated at first glance, the unifying factor between them is the power of data processing. Through this project, I aimed to explore how deep data analysis and the application of machine learning models can uncover hidden patterns and predict outcomes—offering valuable insights that can be broadly applied to business decision-making processes.

 

The objective of my project was to demonstrate that machine learning and data science methods provide powerful tools for transforming data into a strategic asset—one that can inform and guide business decisions, regardless of industry or historical context.

Olen saavuttanut alla olevaan Random Forest Classifier -mallilleni parhaat hyperparametrit, jotka ovat {max_depth: 20, min_samples_split: 10, n_estimators: 200}. Näiden parametrien avulla saavutin ristiinvalidoinnin keskimääräisen tarkkuuden 0.827, mikä on erittäin hyvä tulos Titanic-datasetille.

Analysoin Kelan työttömyysetuustietoja koneoppimismallin avulla. Tässä XGBoost-koneoppimismenetelmä |
I am analyzing unemployment benefit data from Kela using a machine learning model. Here is the XGBoost machine learning method

Projektissa hyödynsin XGBoost-mallia, joka on tehokas ja tarkka koneoppimismenetelmä suurten ja monimuotoisten tietoaineistojen ennustamiseen. Aloitin datan esikäsittelyllä, jossa poistettiin puuttuvat arvot ja muunnettiin kategoriset muuttujat numeeriseen muotoon. Jaoin aineiston opetus- ja testijoukkoihin ja koulutin mallin ennustamaan työttömyysetuuksien määrää eri kunnissa ja ikäryhmissä.

 

Tulosten tulkinnassa käytin kahta keskeistä menetelmää:

  • F-score-analyysi kertoi, mitkä muuttujat olivat yleisesti tärkeimpiä mallin ennusteissa. Tärkeysjärjestyksessä Helsinki erottui selvästi suurimpana tekijänä, ikäryhmä 65–67 vuotta ja korvaustyyppi “Täysi tuki” olivat myös keskeisiä.

  • SHAP-analyysi (SHapley Additive exPlanations) antoi tarkemman kuvan siitä, miten kukin muuttuja vaikutti yksittäisen havainnon ennusteeseen. Esimerkiksi SHAP-visualisoinnissa näkyi, että Helsingissä korkeat arvot nostivat mallin ennustamaa tukien määrää ja ikääntyneissä ryhmissä tukien määrä oli mallin mukaan suurempi.

Yhdistämällä nämä menetelmät sain sekä kokonaiskuvan tärkeimmistä tekijöistä että syvällisen ymmärryksen yksittäisten muuttujien vaikutuksista mallin ennusteisiin. Tämä analyysi auttaa ymmärtämään työttömyystukien jakautumista kunnittain ja ikäryhmittäin sekä tukee tukitoimien tehokasta kohdentamista.

IN ENGLISH

 

In this project, I utilized the XGBoost model, a powerful and accurate machine learning method for predicting outcomes from large and complex datasets. I began with data preprocessing, removing missing values and converting categorical variables into numerical form. Then, I split the dataset into training and testing sets and trained the model to predict unemployment benefit amounts across different municipalities and age groups.

 

For interpreting the results, I employed two key techniques:

 

The F-score analysis identified the variables that were generally the most important for the model’s predictions. Helsinki stood out clearly as the most significant factor, followed by the age group 65–67 and the compensation type “Full support.”

 

The SHAP analysis (SHapley Additive exPlanations) provided a more detailed view of how each variable influenced the prediction for individual observations. For example, SHAP visualizations showed that high values for Helsinki increased the model’s predicted benefit amounts, and older age groups were associated with higher predicted benefits.

By combining these methods, I gained both an overall understanding of the most important factors and a deeper insight into how individual variables affect the model’s predictions. This analysis helps to understand the distribution of unemployment benefits by municipality and age group, supporting more effective targeting of support measures.

F-score, työttömyysanalyysi
Python-sertifikaatti
Työtodistus Broman Group
Broman Groupin antama työtodistus ai-kehittäjän määräaikaisesta projektityöstä, josta vastasin kokonaan itse.

Suosittelijoitani ovat muun muassa:

My references include, among others:

TONI AITTONIEMI

(SOFTWARE DEVELOPER, EDM RESEACHER, SUPERCELL)

ARTO IHANTOJA 

(LEADING CONSULT OF ROBOTICS, CGI)

KIMMO STRANG

(SOFTWARE ENGINEER, CEO)

NOORA TOIVONEN

(ESIMIEHENI, BROMAN GROUP)

ARI KUNELIUS

(ESIMIEHENI, TAKSIPARTNERS)

SATU HYVÄRINEN

(ESIMIEHENI, HELKAMA)
PETTERI TERHO
(ESIMIEHENI, CEO, NUUKA)

”Suosittelen Maria Koivistoa lämpimästi vaativiin asiantuntija- ja kehitystehtäviin erityisesti tekoälyn, ohjelmistokehityksen ja dataohjautuvien ratkaisujen parissa.

 

Maria on poikkeuksellisen analyyttinen, järjestelmällinen ja syvällisesti asioihin paneutuva ammattilainen, joka yhdistää vahvan teknisen osaamisen käytännönläheiseen ongelmanratkaisuun. Hän kykenee hahmottamaan kokonaisuuksia, työskentelemään epäselvissäkin lähtötilanteissa sekä viemään kehitystyönsä johdonmukaisesti tuotantokelpoiselle tasolle.

 

Työskentelyotteeltaan Maria on itsenäinen ja oma-aloitteinen, mutta samalla yhteistyökykyinen ja luotettava. Hän ottaa vastuuta, pitää sovituista aikatauluista kiinni ja tuo aktiivisesti esiin kehitysehdotuksia, joilla on todellista liiketoiminnallista merkitystä.

 

Voin todeta, että Maria on ammattilainen, joka suhtautuu työhönsä kunnianhimoisesti ja korkeaa laatutasoa vaalien. Allekirjoittanut antaa hänestä lisäsuosituksia pyydettäessä.”

 

Helsingissä, 19. päivä tammikuuta 2026

Petteri Terho

Toimitusjohtaja & hallituksen puheenjohtaja

CEO & Chairman of the Board

petteri.terho@nuuka.com

IN ENGLISH:

 

I warmly recommend Maria Koivisto for demanding expert and development roles, particularly in the fields of artificial intelligence, software development, and data-driven solutions.

 

Maria is an exceptionally analytical, systematic, and deeply dedicated professional who combines strong technical expertise with practical problem-solving skills. She has the ability to understand complex systems, work effectively even in ambiguous starting conditions, and consistently bring her development work to a production-ready level.

In her working style, Maria is independent and proactive, while also being collaborative and reliable. She takes responsibility, adheres to agreed schedules, and actively contributes development ideas that carry real business value.

I can confidently state that Maria is a professional who approaches her work with ambition and a strong commitment to high quality. I am happy to provide further references upon request.”

 

Helsinki, January 19, 2026

Petteri Terho

CEO & Chairman of the Board

petteri.terho@nuuka.com

Teen myös koulutuksia! Hyvinä esimerkkeinä muun muassa referenssini Tehy ja Broman Group.

I also provide training and workshops. Examples of my references include Tehy and Broman Group.

Yhteystiedot: 

Maria Koivisto

maria@kasvuagency.fi

(yritys ei ole rekisterissä, mutta sen sähköposti toimii)

Puh: 044 214 3451

Ota yhteyttä matalalla kynnyksellä!

kuva maria koivistosta
Yritys on tauolla

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut elit tellus, luctus nec ullamcorper mattis, pulvinar dapibus leo.

To Top
Translate »