Miten LLM toimii? Osa 2 – Ohjelmiston rakenne

ryoji_ikeda_datapath2
Kuva Ryoji Ikedan teoksesta Datapath.

Edellisessä osassa kävin läpi, miten aivot ja LLM erovat ja missä asioissa niissä on samaa. Nyt isketään kiinni LLM-ohjelmistoihin!

Mitä tapahtuu keskustelussa LLM:n kanssa

Kun kirjoitat kysymyksen ChatGPT:lle tai Claudelle, vastaus ei synny kerralla. Ensin teksti pilkotaan tokeneiksi, tokenit muutetaan luvuiksi, luvut lasketaan mallin matriisien läpi ja lopuksi saadaan todennäköisyysjakauma seuraavalle tokenille. Jakaumalta valitaan yksi token, se lisätään tekstin perään, ja koko kierros alkaa alusta. Näin vastaus syntyy token kerrallaan. Lopulta malli antaa itse lopetustokenin merkiksi siitä, että vastaus on valmis.

LLM-osa_2-kuva_1

Kuva 1. Yhden tokenin matka tekstistä seuraavaan sanaan. Vihreän katkoviivan sisällä on itse malli: tokenit muutetaan vektoreiksi, ja vektorit kulkevat N kerroksen läpi. Jokaisessa kerroksessa on kaksi vaihetta: huomio ja MLP. Tässä blogissa käydään läpi kokonaisuus ja tokenisointi. Mallin sisällä tapahtuva laskenta on seuraavan blogin aihe. Kirjoittajan tekoälyllä luoma kuva.

Kuvassa on kaksi eri osaa. Ensimmäinen on itse malli eli ladattavat painot ja niiden arkkitehtuuri: se ottaa vastaan lukuja ja antaa ulos lukuja eikä näe tekstiä lainkaan. Keskustelun muistaminen on ympäröivän ohjelmiston tehtävä.

Mallin ympärillä on sitä pyörittävä ohjelmisto (inference engine), joka muuttaa kysymyksen tekstin tokeneiksi, tekee laskennan, valitsee seuraavan tokenin, pyörittää token-silmukkaa mallin läpi ja muuttaa lopputuloksen takaisin tekstiksi. Lisäksi ympärillä on muutakin, mutta siitä lisää myöhemmissä blogin osissa.

Mitä LLM sisältää?

LLM-maailman sanasto on hieman sekavaa, koska samoja sanoja käytetään osin eri asioista. Kun puhutaan mallin lataamisesta, ladataan joukko koulutuksessa syntyneitä lukuja eli painoja (weights). Niitä kutsutaan myös parametreiksi.

Malli (model) tarkoittaa painoja yhdessä arkkitehtuurikuvauksen kanssa: lukuja ja ohjetta siitä, miten niitä käytetään.

Se, minkä kanssa käyttäjä oikeasti keskustelee, on LLM-järjestelmä: malli sekä sen ympärillä oleva toimintaa ohjaava ohjelmisto.

Ladattavia painotiedostoissa on painomatriiseja, niissä ei ole todennäköisyyksiä. Ne määrittelevät kiinteän ja deterministisen funktion: sama syöte tuottaa aina saman tuloksen. Todennäköisyys syntyy vasta lopussa, kun malli tuottaa jakauman seuraavalle tokenille.

Edellisessä osassa mainitsin open weight -mallit. Useimmat niin sanotut avoimet mallit, niin kiinalaiset kuin länsimaisetkin, ovat nimenomaan avoimia painoja (open weights) eivätkä kokonaan avointa lähdekoodia (open source). Avoimet painot ovat ikään kuin valmis kakkupohja: sitä voisi jo syödä sellaisenaan tai ensin koristella haluamallaan tavalla. Avoin lähdekoodi sisältäisi myös kakun reseptin ja raaka-aineluettelon, jolloin kakkupohjan voisi halutessaan leipoa itse uudelleen. Avointe painojen mallin voi siis ajaa omilla koneilla ja jopa hienosäätää, mutta sen rakentamista ei voi itse toistaa eikä tarkistaa, millä datalla se on koulutettu.

Mitä tiedostoja mallissa on?

Otetaan konkreettinen esimerkki. Kun kiinalaisen DeepSeek-R1-mallin (DeepSeek-AI, 2025) lataa Hugging Face -palvelusta, joka on yksi avointen mallien jakelupaikoista, saa noin 689 gigatavua tiedostoja (Hugging Face, 2025). Lähes kaikki tuosta datamäärästä on painoja: 163 tiedostoa, joiden pääte on .safetensors. Painot on pilkottu enintään viiden gigatavun sirpaleiksi (shard) siksi, että ne olisi helpompi ladata. Jako tehdään koon mukaan, eikä yksittäinen sirpale vastaa mitään mallin osaa sinällään.

LLM-osa_2-kuva_2

Kuva 2. DeepSeek-R1-mallin tiedostoista yli 99,9 % on painoja. Kirjoittajan tekoälyllä luoma kuva.

Loput tiedostot ovat pieniä mutta välttämättömiä. Arkkitehtuurikuvaus kertoo, miten luvut kytketään toimivaksi kokonaisuudeksi: DeepSeek-R1:ssä jokainen token kuvataan 7168 luvulla, ja kerroksia on 61 (Hugging Face, 2025). Tokenisaattori kertoo, miten teksti muutetaan tokeneiksi ja takaisin. Ilman sitä painot ovat käyttökelvottomia, ja siksi se toimitetaan aina painojen mukana. Lisäksi paketissa on käyttöohje ja lisenssin kuvaus, DeepSeek-R1:n tapauksessa MIT-lisenssi, joka sallii mallin vapaan käytön ja muokkaamisen.

Paketissa ei ole koulutusdataa eli niitä biljoonia tokeneita, joista malli oppi. Ei myöskään koulutukseen käytettyä koodia eikä optimoijan tilaa, jota tarvittaisiin alkuperäisen koulutuksen jatkamiseen siitä, mihin se jäi. Malli tarjoaa koulutuksen lopputuloksen, ei keinoja toistaa sitä itse. Tämä on ero avointen painojen ja avoimen lähdekoodin välillä. Täysin avoimia malleja on vähän, mutta esimerkiksi Allen Institute for AI:n OLMo on sellainen: painojen lisäksi myös koulutusdata ja -koodi on julkaistu (Groeneveld ym., 2024). Eurooppalainen OpenEuroLLM-hanke kehittää parhaillaan täysin avoimia malleja kaikille EU:n virallisille kielille, ja sitä johtaa yhdessä tšekkiläisen Kaarlen yliopiston kanssa suomalaislähtöinen AMD Silo AI (OpenEuroLLM, 2026).

DeepSeekin mallin tiedostot jakautuvat neljään ryhmään:

TiedostoryhmäDeepSeek-R1:n tiedostotMitä ne sisältävät
Painotmodel-00001-of-000163.safetensors …Kaikki mallin oppimat luvut, yhteensä noin 689 Gt.
Arkkitehtuurikuvausconfig.json, configuration_deepseek.py, modeling_deepseek.py, generation_config.jsonMallin koko ja rakenne (7168 lukua per token, 61 kerrosta, sanaston koko, kontekstin maksimipituus…), mallin koodi ja tekstin tuottamisen oletusasetukset.
Tokenisaattoritokenizer.json, tokenizer_config.json, special_tokens_map.jsonSanasto ja yhdistämissäännöt, joilla teksti muutetaan tokeneiksi ja takaisin.
Ohjeet ja lisenssiREADME, LICENSEMallin kuvaus, käyttöohjeet ja MIT-lisenssi.

Mistä painot malliin tulevat?

Kenenkään ei ole tarvinnut kirjoittaa mallin satoja miljardeja lukuja käsin. Ne syntyvät koulutuksessa, jonka perusidean kävin läpi osassa 1: malli arvaa seuraavan tokenin, arvauksen virhe mitataan ja jokaista painoa siirretään hieman suuntaan, joka pienentää virhettä. Sitten sama toistetaan valtavan monta kertaa. Virheen mittaa virhefunktio (loss), ja vastavirta-algoritmi (backpropagation) laskee, kuinka paljon kukin paino vaikutti virheeseen. Itse säätö tehdään gradienttimenetelmällä (gradient descent). Pienen kielimallin voi myös rakentaa ja kouluttaa täysin itse, ja siihen löytyy paljon ohjeistusta, kuten Girish Guptan Build an LLM -sivusto, jossa koko prosessin voi käydä läpi vaihe vaiheelta.

Koulutus tapahtuu kahdessa vaiheessa, jotka tuottavat kaksi eri asiaa: ensin mallin tiedot, sitten sen avuliaisuuden (helpfulness) eli kyvyn toimia avustajana. Tämä tarkoittaa kykyä vastata kysymykseen, noudattaa ohjeita ja pysyä asiassa.

Ensimmäisessä vaiheessa, esikoulutuksessa (pre-training), mallille näytetään biljoonia tokeneita tekstiä. Kukaan ei opeta sille kielioppia tai faktoja, vaan ne syntyvät itsestään, kun ohjelmisto löytää tokeneiden esiintymisessä säännönmukaisuuksia. Tuloksena on pohjamalli (base model), joka tietää, mutta ei osaa avustaa. Jos pohjamallilta kysyy jotain, se saattaa jatkaa tekstiä kolmella uudella kysymyksellä, koska se on oppinut jatkamaan tekstiä, ei auttamaan.

Avustajaksi pohjamalli muuttuu toisessa vaiheessa, jälkikoulutuksessa (post-training). Ensin mallia hienosäädetään esimerkkidialogeilla, joissa on valittuja kysymys–vastaus-pareja (ohjattu hienosäätö, supervised fine-tuning). Sen jälkeen ihmiset tai toinen tekoäly vertailevat mallin vastauksia ja merkitsevät, kumpi on parempi, ja mallia ohjataan suosimaan parempia vastauksia. Tätä kutsutaan vahvistusoppimiseksi ihmispalautteesta (reinforcement learning from human feedback, RLHF; Ouyang ym., 2022). Jos arvioijana on tekoäly, puhutaan RLAIF-menetelmästä (reinforcement learning from AI feedback; Bai ym., 2022). Tässä vaiheessa malli oppii noudattamaan ohjeita, myöntämään, ettei tiedä jotain, ja kieltäytymään haitallisiksi katsotuista pyynnöistä.

LLM-osa_2-kuva_3

Kuva 3. Kaksi koulutusvaihetta, kaksi tuotetta. Esikoulutus tekee biljoonista tokeneista tietävän pohjamallin, jälkikoulutus tekee siitä avuliaan ja turvallisen avustajan. Sen jälkeen painot jäädytetään. Kirjoittajan tekoälyllä luoma kuva.

Koulutuksen jälkeen painot jäädytetään ja tallennetaan tiedostoihin käyttöä varten. Kun mallia käytetään, painot eivät enää muutu: kaikki, mitä keskustelussa tapahtuu, on jäädytetyn mallin ajamista.

Jälkikoulutus on pieni esikoulutukseen verrattuna: se muokkaa mallin käytöstä mutta ei opeta maailmaa uudelleen. Siksi pienempää avointa mallia voi hienosäätää jopa kotilaitteilla, mutta sen esikouluttaminen uudelleen vaatisi valtavat resurssit. Kieltäytyminen haitallisiksi katsotuista pyynnöistä opitaan jälkikoulutuksessa, joten sen voi myös kouluttaa pois. Siksi verkosta löytyy ”uncensored”-versioita avoimista malleista. Tämä on avoimiin painoihin liittyvä turvallisuuskysymys: kuka tahansa voi periaatteessa jälkikouluttaa mallin omien tarkoitustensa mukaiseksi.

Tekstistä tokeneiksi

Malli ei näe sanoja tai edes kirjaimia, vaan tokeneita. Token on tekstin palanen: yleinen sana, sanan osa tai joskus yksittäinen merkki. Englannissa token on keskimäärin noin kolme neljäsosaa sanasta. Tokenisaattori (tokeniser) on ikään kuin mallin sanakirja. Teknisesti se on hakutaulukko, jossa jokaisella tokenilla on oma kokonaislukutunniste (ID).

Kun kirjoitat kysymyksen, tokenisaattori muuttaa sen tunnisteiksi, ja lopuksi vastauksen tunnisteet muutetaan takaisin tekstiksi. Voit kokeilla itse, miten teksti pilkkoutuu tokeneiksi, esimerkiksi OpenAI:n tokenisaattorilla. Transformer Explainer -työkalun visualisoinnin alkuosasta (Embedding) näet lisäksi, miten tokenit saavat tunnisteensa ja muuttuvat malliin syötettäviksi luvuiksi.

Sanastoa ei kirjoiteta käsin, vaan se opitaan datasta ennen mallin koulutusta. Yleisin menetelmä on BPE (Byte-Pair Encoding; Sennrich ym., 2016). Se aloittaa yksittäisistä merkeistä, etsii suuresta tekstiaineistosta useimmin vierekkäin esiintyvän parin, yhdistää sen uudeksi tokeniksi ja toistaa saman kymmeniä tai satoja tuhansia kertoja. Lopputuloksena on tyypillisesti 50 000–250 000 tokenin sanasto. Sanan osat ovat kompromissi kahden huonon ääripään välillä: jos jokainen kirjain olisi oma tokeninsa, tekstit olisivat hyvin pitkiä jonoja, ja jos jokainen sana olisi oma tokeninsa, sanastosta tulisi valtava eikä malli selviäisi sanoista, joita se ei ole nähnyt.

Tokenisaattorin valinta on mallin suunnittelupäätös, joka tehdään ennen koulutusta ja joka on sen jälkeen hitsattu painoihin kiinni. Sitä ei voi vaihtaa jälkikäteen ilman, että malli koulutettaisiin uudestaan. Tokenisaattorin ajaminen on mallin ympärillä olevan ohjelmiston tehtävä, ei itse mallin.

Suomen kielen kannalta tällä on merkitystä. Sanastot rakennetaan yleensä englantipainotteisesta aineistosta, joten englanti pilkkoutuu tehokkaasti, usein kokonaisiksi sanoiksi. Suomi taas hajoaa useampiin palasiin. Koska AI-käytön hinnoittelu, keskustelun enimmäispituus ja usein myös laatu riippuvat tokeneiden määrästä, englantipainotteisesta aineistosta rakennettu tokenisaattori asettaa muut kielet huomaamatta heikompaan asemaan (Petrov ym., 2023). Sama keskustelu englanniksi kuluttaa siksi yleensä vähemmän tokeneita ja on näin halvempaa.

LLM-osa_2-kuva_4

Kuva 4. Sama tervehdys voisi pilkkoutua tokeneiksi neljällä kielellä tällä tavalla. Kirjoittajan tekoälyllä luoma kuva.

Tokenisointi selittää myös kielimallien kummallisuuksia. Koska malli näkee tekstin palasina eikä kirjaimina, sen voi olla vaikea laskea sanan kirjaimia, kirjoittaa sanaa takaperin tai keksiä riimejä.

Kuuluisa esimerkki on kysymys siitä, montako r-kirjainta on sanassa ”strawberry”. Vuonna 2024 moni malli vastasi itsevarmasti ”kaksi”, ja aiheesta löytyy YouTubesta paljon hauskoja videoita. Uusimmat mallit vastaavat yleensä jo oikein, koska ne ovat oppineet tällaisissa tehtävissä kirjoittamaan sanan ensin auki kirjain kerrallaan, jolloin jokaisesta kirjaimesta tulee oma tokeninsa. Ongelma ei silti ole kokonaan kadonnut: malli ei edelleenkään näe kirjaimia suoraan. Harvinaisemmilla sanoilla tai pitkillä merkkijonoilla virheitä voi tulla.

Terminologiasta

Lopuksi vielä tämän osan keskeiset termit suomeksi ja englanniksi. Kaikille ei ole vakiintunutta termiä suomeksi.

SuomeksiEnglanniksiSelitys
Painot, parametritweights, parametersMallin matriisien kiinteät luvut eli ladattavien tiedostojen sisältö.
MallimodelPainot ja arkkitehtuurikuvaus yhdessä: ajettava kokonaisuus.
LLM-järjestelmäLLM systemMalli sekä sen ympärillä oleva ohjelmisto: mm. tokenisaattori, tokenin valinta ja silmukka. Tämä on se kokonaisuus, jonka kanssa käyttäjä toimii.
Avoimet painotopen weightsPainot ja tokenisaattori on julkaistu: mallin voi ajaa ja hienosäätää, mutta koulutusta ei voi toistaa.
Avoin lähdekoodiopen sourceAvoimet painot sekä koulutusdata ja -koodi: mallin koulutuksen voisi myös toistaa.
SirpaleshardYksi painojen osatiedostoista. Painot jaetaan osiin, jotta valtavan datamäärän lataaminen olisi helpompaa.
Esikoulutuspre-trainingSeuraavan tokenin ennustamisen opettelua edeltävien tokeneiden perusteella biljoonien tokeneiden koulutusaineistolla. Tuottaa pohjamallin.
Pohjamallibase modelEsikoulutuksen tulos: osaa laskea todennäköisyydet seuraavalle tokenille, mutta ei vielä osaa avustaa käyttäjää.
Jälkikoulutuspost-trainingOhjattu hienosäätö ja vahvistusoppiminen, jotka tekevät pohjamallista avustajan.
TokentokenTekstin palanen: sana, sanan osa tai merkki.
TokenisaattoritokeniserMuuttaa tekstin tokeneiden tunnisteiksi ja takaisin.
BPEByte-Pair EncodingYleisin menetelmä, jolla tokenisaattorin sanasto opitaan.

Seuraavassa osassa

Seuraavassa osassa tutkitaan, mitä tapahtuu, kun mallille kirjoitetaan kysymys: miten tokenit muuttuvat luvuiksi, miten tokenit ottavat toisensa huomioon, miten seuraava token valitaan ja miksi malli näyttää joskus keksivän asioita.

Lue lisää aiheesta

Elements of AI: Helsingin yliopiston maksuton verkkokurssi tekoälyn perusteista suomeksi. https://www.elementsofai.fi

OpenAI Tokenizer: kokeile itse, montako tokenia sama lause vie suomeksi ja englanniksi. https://platform.openai.com/tokenizer

Transformer Explainer: Georgia Techin interaktiivinen visualisointi, jossa selaimessa toimiva GPT-2-malli näyttää tokenisoinnin, upotukset ja huomiomekanismin vaihe vaiheelta. https://poloclub.github.io/transformer-explainer/

AnimatedLLM: maallikoille tehty animaatio siitä, miten kielimalli käsittelee tokeneita vaihe vaiheelta. https://animatedllm.github.io/

Build an LLM: Girish Guptan opetussivusto, jolla pienen kielimallin voi kouluttaa itse alusta alkaen. https://buildanllm.com/

3Blue1Brown: Neural networks -videosarja YouTubessa, erityisesti jaksot kielimalleista ja transformereista. Havainnollinen visuaalinen johdatus aiheeseen! https://www.youtube.com/playlist?list=PLZHQObOWTQDNU6R1_67000Dx_ZCJB-3pi

Andrej Karpathy: Intro to Large Language Models ja Deep Dive into LLMs like ChatGPT -videot YouTubessa. Yleistajuinen läpikäynti koulutuksesta, tokenisoinnista ja jälkikoulutuksesta. https://www.youtube.com/watch?v=zjkBMFhNj_g ja https://www.youtube.com/watch?v=7xTGNNLPyMI

What is ChatGPT doing … and why does it work?: Stephen Wolframin perusteellinen kuvaus siitä, miten ChatGPT tuottaa tekstiä sana kerrallaan. https://writings.stephenwolfram.com/2023/02/what-is-chatgpt-doing-and-why-does-it-work/

Hugging Face LLM Course: maksuton kurssi kielimalleista, myös tokenisaattoreista. https://huggingface.co/learn/llm-course

Lähteet

Bai, Y. ym. (2022). Constitutional AI: Harmlessness from AI feedback. arXiv. https://arxiv.org/abs/2212.08073

DeepSeek-AI. (2025). DeepSeek-R1: Incentivizing reasoning capability in LLMs via reinforcement learning. arXiv. https://arxiv.org/abs/2501.12948

Groeneveld, D. ym. (2024). OLMo: Accelerating the science of language models. arXiv. https://arxiv.org/abs/2402.00838

Hugging Face. (2025). deepseek-ai/DeepSeek-R1 [Mallin tiedostot]. https://huggingface.co/deepseek-ai/DeepSeek-R1

OpenEuroLLM. (2026, 6. maaliskuuta). OpenEuroLLM: First year progress and next steps. https://openeurollm.eu/blog/first-year-progress-and-next-steps

Ouyang, L. ym. (2022). Training language models to follow instructions with human feedback. Advances in Neural Information Processing Systems, 35. https://arxiv.org/abs/2203.02155

Petrov, A., La Malfa, E., Torr, P. H. S., & Bibi, A. (2023). Language model tokenizers introduce unfairness between languages. Advances in Neural Information Processing Systems, 36. https://arxiv.org/abs/2305.15425

Sennrich, R., Haddow, B., & Birch, A. (2016). Neural machine translation of rare words with subword units. Proceedings of the 54th Annual Meeting of the ACL, 1715–1725. https://arxiv.org/abs/1508.07909

Leave a Reply

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


The reCAPTCHA verification period has expired. Please reload the page.