Iltakooste

Tekoälyn päivälehti — mallit, työkalut ja hardware

Tiistai · 18. elokuuta 2026Iltapainos · klo 21Nro 46
← Takaisin etusivulle

Päivän promptivinkki · Vinkit

Älä pyydä mallia noudattamaan muotoa — kirjoita sen vastauksen ensimmäiset merkit itse

Pieni paikallinen malli tottelee muotovaatimusta huonosti mutta jatkaa aloitettua tekstiä erinomaisesti. Kun asetat vastauksen ensimmäiset merkit valmiiksi, mallilla ei ole enää mitään mahdollisuutta aloittaa selittelyllä.

Kuka kirjoittaa ensimmäisen merkinilman esitäyttöäToki! Tässä pyytämäsi JSON-muotoinen vastaus:{"nimi": "Aino", "ika": 34}esitäytöllä{"nimi": "Aino", "ika": 34}keltainen merkki on sinun, loppu mallinjatkaminen on helpompaa kuin tottelu

Ongelma on tuttu jokaiselle, joka on yrittänyt saada pienestä paikallisesta mallista koneluettavaa ulos. Pyydät JSONia, ja saat JSONia — mutta sitä edeltää kohtelias virke, sen jäljessä on selitys, ja koko komeus on kääritty koodilohkoon, jonka merkintä vaihtelee ajokerroittain. Jäsennin kaatuu, ja kirjoitat uuden säännön, joka poistaa ensimmäisen rivin. Sitten malli keksii uuden tavan aloittaa.

Juurisyy on se, että muotovaatimus on ohje, ja ohjeiden noudattaminen on nimenomaan se kyky, joka pienissä malleissa on heikoin. Sen sijaan tekstin jatkaminen on se kyky, joka on vahvin — se on kirjaimellisesti ainoa asia, jota malli osaa. Vinkki on siis olla pyytämättä ja antaa sen sijaan mallille teksti, jonka jatkaminen johtaa väistämättä haluttuun muotoon.

Käytännössä se tarkoittaa, että kirjoitat assistentin vuoron ensimmäiset merkit itse ja annat mallin jatkaa siitä. llama.cpp:n palvelimessa ja useimmissa OpenAI-yhteensopivissa rajapinnoissa tämä onnistuu lisäämällä viestilistan loppuun keskeneräisen assistentin viestin. Kehote näyttää tällaiselta:

"messages": [ {"role": "system", "content": "Vastaat vain JSON-objektilla. Et kirjoita mitään objektin ulkopuolelle."}, {"role": "user", "content": "Poimi seuraavasta tekstistä henkilon nimi ja ikä.\n\n<teksti>"}, {"role": "assistant", "content": "{\"nimi\":"} ]

Viimeinen viesti on tarkoituksella kesken. Malli ei näe sitä kysymyksenä vaan omana aloittamanaan vastauksena, ja ainoa luonteva jatko on arvo. Kohteliaisuusvirkettä ei voi enää tulla, koska vastaus on jo alkanut. Sama temppu toimii kaikelle, jolla on tunnistettava alku: markdown-taulukolle esitäyttö on rivi pystyviivoja, luettelolle "1. ", kirjeelle "Hei" ja XML-vastaukselle avaava tagi.

Miksi tämä toimii paremmin kuin sääntö, sanottuna suoraan: sääntö kilpailee kaiken muun kanssa, mitä kehotteessa on, ja pieni malli painottaa kilpailevia ohjeita epävakaasti. Esitäyttö ei ole ohje vaan tila. Malli ei voi valita, noudattaako se sitä, koska konteksti on jo siinä tilassa. Vinkki on samalla ilmainen: se ei vie yhtään kehotetokenia enempää, päinvastoin, ja se lyhentää ulostuloa poistamalla saatesanat.

Mitä tämä ei ratkaise. Esitäyttö takaa vastauksen alun, ei sen loppua — malli voi silti jatkaa objektin sulkemisen jälkeen selityksellä, joten lopetusmerkkijono kannattaa asettaa erikseen. Se ei myöskään takaa, että sisältö on oikein: väärä nimi väärässä kentässä on yhtä hyvin muotoiltu kuin oikea. Ja jos tarvitset takuun siitä, että ulostulo on aina kelvollista JSONia, esitäyttö on käsityökalu eikä korvaa kieliopilla rajoitettua generointia, jota llama.cpp osaa tehdä valmiiksi annetusta skeemasta. Esitäyttö on nopea, universaali ja toimii kaikilla malleilla — mutta se on tapa nostaa todennäköisyyttä, ei tapa poistaa mahdollisuutta.

Muut jutut tässä numerossa