Back to all posts

Miten automatisoin blogimme tuotannon alusta loppuun

Miten automatisoin blogimme tuotannon alusta loppuun

Olen Ming. Tuotesuunnittelun lisäksi vm0:lla vastaan myös sisällöistämme, ja työ osoittautui paljon laajemmaksi kuin odotin: työnkulkujen suunnittelu, kuvitukset, kuvatuotanto, CMS-työ, käännökset. Näin olen saanut kokonaisuuden vähitellen haltuun.


Sisältö kuuluu toimenkuvaani täällä

Suurin osa päivistäni vm0:lla jakautuu tuotesuunnittelun ja Next.js-koodipohjan välillä. Mutta myös sisällön pyörittäminen kuuluu vastuulleni, ja kun aloitin, tajusin kuinka paljon menestyvän blogin tekemiseen oikeasti kuuluu. Tarvitaan tasaista julkaisutahtia, aitoa avainsanatutkimusta, brändin mukaisia visuaaleja, hyvät metakuvaukset ja käännökset neljälle tukemallemme kielelle.

Kun aloin tehdä tätä tosissani, jokainen postaus vei lähes koko päivän. Kirjoittaminen oli siitä vain pieni osa. Suurin osa ajasta meni kirjoittamisen ympärillä olevaan tuotantoon: oikeiden avainsanojen etsimiseen, kansikuvan tekemiseen, kenttien täyttämiseen CMS:ssä ja kaiken toistamiseen jokaiselle kieliversiolle.

Olenkin siirtänyt mahdollisimman suuren osan tästä prosessista Lucakselle, AI-markkinointiautomaatiolle, jonka rakensin Zeroon oman työni ympärille. Hän on konfiguroitu "Marketing manageriksi", ja hänen vastuullaan on kaikki markkinointiin liittyvä: blogituotanto on tällä hetkellä laajin osa, ja Lucas kasvaa jatkuvasti kun lisään taitoja ja liittimiä ajan myötä.

Tällä hetkellä Lucaksella on pääsy Strapi headless CMS:ään, Ahrefs-tiliimme, tiimin Slackiin, verkkokeskusteluun, sisäiseen draw-taitoon brändinmukaisiin kuvituksiin sekä vakiomuotoiseen copywriting-taitoon kirjoitusmekaniikkaa varten.

Alla käyn läpi, miten tämä AI-blogiautomaatio toimii käytännössä: miten Lucas ottaa epämääräisen kehotteen, purkaa sen aiheeksi ja avainsanoiksi, laatii postauksen, piirtää kannen, kääntää tekstin luonnollisesti ja vie neljä kieliversiota headless CMS:ään. Lopuksi kerron, miten tähän päädyin ja mitä jätän tarkoituksella ihmisten (lähinnä itseni) tehtäväksi.


Näin käytän Lucasta: web-sovellus ja Slack

Työskentelen Lucaksen kanssa pääasiassa vm0:n verkkokeskustelun kautta. Se on syvätyöskentelyn käyttöliittymä, jossa käyn hänen kanssaan läpi rakenteen, luonnoksen, kansikuvien versiot ja muokkaukset. Pitkät keskustelut, pitkä konteksti, sellaista vuorovaikutusta joka olisi kömpelöä chat-kanavassa.

Lucas on myös liitetty tiimin Slackiin yhteisenä sisääntulopisteenä. Pudotan sinne nopeita kehotteita puhelimella, ja muu tiimi voi myös ottaa häneen yhteyttä. Kuka tahansa blogivuorossa aloittaa postauksen samalla tavalla. Sama agentti, sama konteksti molemmissa käyttöliittymissä.


Miltä tyypillinen kehotteeni näyttää

Kehotteeni Lucakselle ovat yleensä lyhyitä. Enintään kolme virkettä. Esimerkki:

Lucas, kirjoita opas tehokkaiden viikkopalaverien vetämisestä: rakenne, yleiset sudenkuopat ja miten pitää etätiimi sitoutuneena. Opas-tyyli, SEO-ystävällinen, lopuksi CTA käyttää Zeroa. Vain luonnoslinkki, älä julkaise.

Siinä koko briiffi. Yksi viesti. Ei rakennetta, ei avainsanalistaa, ei design-ohjetta, ei pituustavoitetta. Lucas hoitaa loput.

Tämän muodon löytäminen vei aikansa. Aluksi kirjoitin paljon pidempiä briiffejä, koska oletin agentin tarvitsevan kaiken auki kirjoitettuna, mutta tajusin, että suurin osa kontekstista kuuluu hänen pysyviin ohjeisiinsa ja taitoihinsa, ei jokaiseen kehotteeseen. Kehote on laukaisin; muu konfiguraatio kantaa painon.


Näin Lucas analysoi aiheen ja avainsanat

Lucaksen ensimmäinen tehtävä on purkaa rakenne epämääräisestä kehotteesta. Esimerkkipyynnössä hänen muistiinpanonsa näyttävät tältä:

  • Aihe: tehokkaiden viikkopalaverien vetäminen
  • Muoto: opas → numeroidut vaiheet, konkreettiset esimerkit, "tee näin" -kieli
  • Oletettu yleisö: tiiminvetäjät, etäesihenkilöt, perustajat
  • Pakolliset osiot: palaverin rakenne, yleiset sudenkuopat, etäosallistaminen
  • CTA: ohjaa lukijat Zeroon
  • Rajoite: vain luonnos-URL, ei julkaisua

Sitten hän valitsee avainsanan. Tämä oli sisällöntuotannossa minulle aluksi vierain osa, joten annoin Lucakselle rutiinin, jonka hän käy läpi aina kun pyydän avainsanatyötä. Se ei ole taito, jota hän ajaa itsenäisesti, vaan järjestys johon luotan:

  1. Hakee ehdokkaat Ahrefsista. Hän kutsuu Ahrefs APIa aihefraasilla, saa pitkän hännän variaatiot kuukausittaisella hakumäärällä, avainsanan vaikeudella (KD), pääaiheella ja SERP-tarkoituksella.
  2. Suodattaa vaikeuden mukaan. Annoin tiukan säännön: KD < 30. vm0 on suhteellisen uusi domain, jolla on vähän auktoriteettia, joten korkean KD:n avainsanojen tavoittelu ei vielä kannata. Pitkän hännän avainsanat tuovat tuloksia alussa.
  3. Ristiinviittaa Strapi-indeksiimme. Hän hakee kaikki julkaistut slugit CMS:stä Strapi REST APIlla ja poistaa jo käsitellyt avainsanat. Ei kannibalisaatiota.
  4. Tarkistaa tarkoituksen tuotteen sopivuuteen. Avainsanan tarkoituksen täytyy sopia käyttötapauskirjastoomme. "How to run effective weekly meetings" → operatiivinen / tiiminhallinta → sopii. "Best ramen in Tokyo" → ei sovi, vaikka hakumäärä olisi suuri.
  5. Valitsee yhden. Suodatetusta listasta hän valitsee suurimman hakumäärän vaihtoehdon ja käyttää sitä postauksen runkona. Esimerkiksi remote weekly meeting best practices.

On-page SEO:ssa hän käyttää yksinkertaista heuristiikkaa: kohdeavainsana otsikossa, vähintään yhdessä H2:ssa ja ensimmäisen 100 sanan joukossa. Synonyymit ja aiheeseen liittyvät fraasit luonnollisesti sekaan. Sisäisiä linkkejä kahteen tai kolmeen aiheeseen liittyvään postaukseen, jos sopii. Muuten: kirjoita luonnollisesti, ei avainsanaspämmiä.

Postauksen rakenne (kuusi tai seitsemän H2:sta, "Vinkki:" -nosto jokaisen vaiheen alle, CTA lopussa) tulee opaspohjasta, jonka rakensin esimerkkien kautta useiden postausten aikana.


Näin kansikuva piirretään

Kansikuva on blogituotannon osa, josta välitän eniten – osin koska olen suunnittelija, osin koska se on ensimmäinen asia jonka lukija näkee. Se toimii myös Open Graph -kuvana, kun postauksia jaetaan X:ssä tai LinkedInissä, ja tekee blogi-indeksistämme julkaisun näköisen, ei pelkkää kuvapankkia.

Kuvapankkikuvat eivät sopineet haluamaani ilmeeseen, ja yksittäisten kuvitusten briiffaaminen olisi tehnyt tuotantokustannuksesta liian korkean. Siksi rakensin Zero-taitoon nimeltä draw. Se on 200-rivinen Python-skripti, joka tekee viisi asiaa:

  1. Ottaa kaksi syötettä: metafora (mitä piirretään) ja väri (ystävällinen nimi + hex-koodi).
  2. Syöttää ne kiinteään kehotepohjaan, joka lukitsee muun sommittelun: lämmin harmaa tausta #eeeeee, vesiväriläiskä keskellä valittua väriä, käsin piirretty tussiluonnos päällä, vm0-logo vasemmassa yläkulmassa kohdassa (25, 25).
  3. Lähettää koostetun kehotteen fal.ai:n nano-banana-pro-mallille osoitteessa 16:9.
  4. Lataa PNG:n. Normalisoi lähes valkoiset pikselit täsmälleen #eeeeee:ksi, jotta tausta ei muutu. Skaalaa kokoon 1600×900. Alpha-komposoi läpinäkyvän vm0-logon päälle.
  5. Lataa tuloksen vm0:n CDN:ään ja tulostaa URL:n.

Tyypillinen kutsu näyttää tältä:

python draw.py \
  --metaphor "a tilted hourglass with sand draining into a small open notebook, a sparkle near the rim" \
  --color-name "dusty rose" \
  --color-hex "#e08b96" \
  --upload

Kaksi syötettä ja muu brändi pysyy yhtenäisenä. Valitsen yleensä värin postauksen teeman mukaan. Koralli tai salvia lämpimiin opas-tyylisiin juttuihin, sininen tai laventeli teknisempiin, sinapinkeltainen tiedotteisiin. Muutaman toistuvan värin käyttö tekee blogi-indeksistä vähitellen tunnistettavan paletin.

Opin kantapään kautta, että vipuvoima ei ole mallissa vaan pohjassa. Jos mallille antaa vapaat kädet sommitteluun, palettiin ja asetteluun, jokainen kansi näyttää eri brändiltä. Kun nämä lukitaan ja vain metafora vaihtelee, ilme pysyy yhtenäisenä postauksesta toiseen.

Sisar-taito nimeltä illustration tuottaa artikkelien välikuvitukset (pienemmät piirrokset, joita näet tämän postauksen väleissä). Sama idea: kiinteä tyyli, vain metafora ja väri vaihtuvat. Vain optimoitu neliönmuotoiseen 1024×1024-kuvaan, ei 16:9-kansiin.

Pieni huomio kuvien SEO:sta: sama kansikuva toimii postauksen Open Graph- ja Twitter Card -kuvana, joten somejaot poimivat sen oikein. Strapi luo automaattisesti neljä esikokoista versiota latauksen yhteydessä (thumbnail, small, medium, large), mutta en ole vielä kytkenyt artikkelirunkoa lataamaan niitä srcset:n kautta. Se on pieni front-end TODO. Välikuvituksille Lucas kirjoittaa kuvaavat alt-tekstit markdowniin; kannen oma alternativeText Strapiin on vielä täydennettävänä.


Näin postaus kirjoitetaan

Kun aihe, avainsana ja kansi on lyöty lukkoon, luonnostelu on lähinnä mekaanista. Lucas:

  1. Laatii ensin rakenteen. Kuusi tai seitsemän H2:sta, jokaisella selkeä tehtävä: ongelman asettelu, vaiheittaiset ohjeet, "Vinkki:"-nostot, yhteenveto, CTA.
  2. Laajentaa jokaisen H2:n proosaksi käyttäen copywriting-taitoa. Äänensävy (lyhyet lauseet, konkreettiset esimerkit, sinä-muoto kun sopii, satunnainen kuivahko huumori) tulee Lucaksen pysyvistä ohjeista, ei taidosta itsestään.
  3. Lisää käytännön "Vinkki:"-nostot jokaisen vaiheen alle. Hyödyllisiä oppaille, koska useimmat lukijat silmäilevät, ja nostot antavat reitin pitkän sisällön läpi.
  4. Kirjoittaa postauksen description-kentän. Strapi rajoittaa sen 80 merkkiin, joten se pysyy lyhyenä ja kuulostaa ihmisen kirjoittamalta. Sitä käytetään artikkelin alaotsikkona ja OG/Twitter-kuvauksena.
  5. Päättää CTA:lla, jossa mainitaan tuote ja linkitetään ilmaiseen workspaceen.

Ensimmäinen versio on harvoin suoraan julkaistavissa. Se on yleensä lähes valmis, mutta hieman pielessä, ja siihen menee suurin osa tarkistusajastani.


Näin luonnos viedään Strapiin

Käytämme Strapia headless CMS:nä. articles-sisältötyypissä on cover (media), author ja category (relaatiot), locale (merkkijono) ja blocks-dynaaminen alue, jossa runko sijaitsee.

Lucaksen CMS-synkronointiprosessi:

  1. POSTaa kansi-PNG osoitteeseen /api/upload. Tallenna palautettu documentId.
  2. POSTaa osoitteeseen /api/articles?status=draft otsikko, kuvaus (≤80 merkkiä; Strapi valvoo tätä), slug, kieli, kansi/kirjoittaja/kategoria-relaatiot numeerisina ID:inä ja yksi shared.rich-text-lohko, jossa markdown-runko.
  3. Tärkeää: jätä publishedAt pois. Strapi tulkitsee nullin luonnostilaksi.
  4. Palauta esikatselu-URL vm0:n luonnosmallilla: https://www.vm0.ai/{locale}/blog/posts/{slug}?status=draft.

Huomio Strapi v5:ssä – julkinen REST API voi ylikirjoittaa publishedAt tietyissä sisältötyypeissä, eli API:n kautta luotu "luonnos" voi mennä vahingossa julki. Korjaus on pieni tietokantamigraatio, joka poistaa kentän luonnoskirjoituksista.

Myös slug-strategia vaikuttaa SEO:hon. Käytämme yhtä kanonista slugia kaikissa neljässä kieliversiossa emmekä käännä sitä. Lukija osoitteessa /de/blog/posts/remote-weekly-meeting-best-practices näkee saman URL-rakenteen kuin lukija osoitteessa /en, eikä backlink-profiili hajaannu käännettyihin osoitteisiin. Hreflang-linkkitagien tuottaminen näistä kielirelaatioista on pieni front-end TODO. Niitä ei vielä julkaista.


Näin i18n-käännös toimii

vm0 julkaistaan neljällä kielellä: englanti, saksa, japani, espanja. Emme käytä Google Translatea postauksissa. Halpa reitti tuhoaa äänensävyn; oikea tapa mukauttaa idiomit.

Lucas luo ensin EN-luonnoksen, tallentaa palautetun documentId, ja tekee sitten kolme jatko-PUT /api/articles/{documentId}?locale=de-kutsua (sekä ?locale=ja, ?locale=es) luonnollisesti käännetyillä sisällöillä. Strapi käsittelee nämä saman kanonisen dokumentin kieliversioina, jolloin neljä versiota pysyvät linkitettyinä hallinnassa ja front-endin kielenvaihtajassa.

Käännössäännöt, jotka annoin hänelle, perustuvat pääosin väärien tulosten korjaamiseen:

  • Älä käännä teknisiä termejä, jotka ovat jo englanninkielisiä lainasanoja kohdekielessä. "API", "CMS", "agent" ja "prompt" pysyvät englanniksi JA- ja DE-versioissa. Niiden kääntäminen tuntuu kummalliselta molemmissa kielissä.
  • Mukauta idiomit luonnollisesti. Esimerkiksi "kills your Friday" suora käännös saksaksi on järjetön; natiiviversio samasta metaforasta toimii.
  • Säädä CTA:t kielen mukaan. Imperatiivi tuntuu saksaksi painostavammalta, joten pehmennän sitä; japaniksi CTA yleensä muotoillaan kohteliaaksi kutsuksi.
  • Säädä otsikot pituuden mukaan. Saksan otsikot ovat yleensä noin 30% pidempiä kuin englanninkieliset. Japanilaiset otsikot ovat usein lyhyempiä. Lucas pitää otsikot alle 60 merkin SERP-rajan kielikohtaisesti.

Monikielinen julkaisu oli aiemmin työnkulun hitain vaihe. Nyt se on vain viimeinen vaihe samassa agentin suorituksessa.


Mitä ei automatisoida

Lyhyt mutta tärkeä osio. Kaikkea tässä työnkulussa ei ole automatisoitu, tarkoituksella:

  • Aihevalinta strategisella tasolla. Lucas valitsee avainsanat aiheen sisällä, mutta aiheen valitsen minä – yleensä tuotejulkaisuista, asiakaskeskusteluista tai tiekartan muutoksista.
  • Lopullinen toimituksellinen tarkistus. Luetan jokaisen luonnoksen ennen julkaisua. Erityisesti EN-version. Sävyn, teknisten väitteiden paikkansapitävyyden ja sisäisten viittausten pitää olla ihmisen tarkistamia.
  • Natiivikielen tarkistus kielissä, joita en puhu sujuvasti. En lue saksaa sujuvasti. DE-luonnos menee natiiviarvioijalle ennen julkaisua.
  • Promootio. Julkaisu X:ssä, tilaajille lähettäminen ja yhteisöissä jakaminen ovat toistaiseksi manuaalisia.

Tarkoitus ei ole poistaa itseäni prosessista. Tarkoitus on poistaa minut niistä vaiheista, joissa minua ei oikeasti tarvita.


Miten päädyin tähän työnkulkuun

En suunnitellut tätä viikonlopussa. Se kertyi postaus postaukselta, kun huomasin mitkä vaiheet veivät eniten aikaa.

Huomasin, että automatisoinnin arvo ei ollut luovissa vaiheissa vaan yhdistävissä: avainsanahaussa, kansikuvien generoinnissa, latauksissa, kieliversioiden luonnissa, esikatselu-URL:ien muotoilussa. Kun kirjasin ajan rehellisesti, käytin enemmän aikaa logistiikkaan kuin itse kirjoittamiseen.

Siirsin siis logistiikan agentille. Malli kirjoittaa; agentti hoitaa siirtelyn. Teen yhä päätökset siitä, mitä kirjoitetaan ja miltä sen pitää kuulostaa, mutta en enää sido aikaa palasten yhdistelyyn.

Minulle sisällön automaatio ei käytännössä tarkoittanut "AI kirjoittaa blogin". Se tarkoitti "AI hoitaa kaiken kirjoittamisen ympärillä, jotta minulla on aikaa keskittyä itse tekstiin".


Jos haluat kokeilla vastaavaa

Jos olet samassa tilanteessa, monta hattua päässä ja sisältö yhtenä niistä, suurin osa tästä on toistettavissa:

  • Agenttialusta, jossa agentille voi antaa pysyvän roolin ja taidot (meillä Zero, jossa Lucas toimii).
  • Liittimet nykyisiin työkaluihisi: CMS, avainsanatyökalu, kuvageneraattori, Slack.
  • Pieni joukko brändillesi räätälöityjä taitoja (meillä draw kansille ja copywriting äänensävylle).
  • Pysyvät ohjeet, jotka kantavat kontekstin, jotta kehotteet voivat olla lyhyitä.

Aloita ilmainen Zero workspace →

Tai jos haluat nähdä lisää agenttityönkulkuja ennen rekisteröitymistä, käyttötapauskirjastossamme on 19 valmista automaatiota kopioitavaksi tekniikan, tuotekehityksen, markkinoinnin ja operatiivisen työn tarpeisiin.

Jos haluat kloonata Lucaksen: luo agentti, anna rooliksi Marketing manager, yhdistä Strapi (tai oma CMS) + Ahrefs + kuvageneraattori, lisää draw-taito mallina omastasi ja copywriting-taito, joka tallentaa brändisi äänen. Hän oppii loput ensimmäisestä kehotteestasi.

Stay in the loop

// Get the latest insights on AI teammates and collaboration.