Testasin Jeviä saapuvien sähköpostien luokitteluun. Halusin selvittää, tunnistaako se viestin lähettäjän ja sopivan käsittelyreitin.
Onko kyseessä uusi asiakas? Vastaus aiempaan keskusteluun? Yhteistyötarjous? Mainos? Viesti, jonka ihminen saa katsoa itse?
Nykyisessä liidiputkessa viestit luokittelee tavallinen kielimalli. Sen tekstivastauksesta pitää saada ohjelmalle luokka, jonka perusteella viesti ohjataan seuraavaan vaiheeseen.
Ajoin TypeSafen Jev-mallia nykyisen järjestelmän rinnalla erillisenä kokeena.
Miten Jev palauttaa luokittelutuloksen
Jev on TypeSafen ensimmäinen System One -malli. Sille annetaan käsiteltävä tila, esimerkiksi viestin sisältö, sekä joukko tyypitettyjä kysymyksiä. Vastaukset ovat ohjelman käyttöön sopivia arvoja.1
Kysymys voi olla esimerkiksi:
- Onko tämä uusi myyntiliidi?
- Kuka viestin lähettäjä on?
- Mihin käsittelyreittiin viesti kuuluu?
- Tarvitaanko tähän ihmisen tarkistus?
Jevin vastaukset ovat ennalta rajattuja. Choice-kysymys valitsee yhden vaihtoehdon määritellystä listasta. Noul-kysymys arvioi, kuinka todennäköisesti jokin väite pitää paikkansa. Vastaukset voi lukea suoraan koodissa ilman, että ohjelma yrittää tulkita kielimallin kirjoittamaa selitystä.4
Jeviltä voi pyytää esimerkiksi valinnan neljästä lähettäjäroolista tai arvion välillä 0-1 siitä, onko viesti uusi liidi.
Ennalta määritetyt luokat
Tavallinen kielimalli on parhaimmillaan silloin, kun tarvitaan tekstiä, tulkintaa tai usean asian yhdistämistä ihmiselle ymmärrettävään muotoon. Se voi kirjoittaa luonnoksen, tiivistää pitkän viestin tai ehdottaa vastausta.
Luokittelussa tarvitsen vastauksen ennalta määritetyistä vaihtoehdoista. Ohjelman käsittelyä hankaloittavat puuttuvat kentät, luokkien synonyymit ja selitykset, joista luokka pitää päätellä.
Jev antaa mallille oman osuutensa päätöksestä ja jättää toiminnan ohjelmalle. Malli arvioi merkitystä. Koodi päättää, luodaanko tehtävä, ohjataanko viesti ihmiselle vai jatketaanko seuraavaan vaiheeseen.
Choice- ja Score-vastauksiin liittyvä confidence kertoo, miten keskittynyt mallin todennäköisyysjakauma on. Korkean varmuuden voi ohjata automaattiseen käsittelyyn, epäselvän tapauksen ihmisen tarkistettavaksi.6
Myös korkean confidence-arvon saanut valinta voi olla väärä.
Luokittelun jälkeen vastausluonnokseen
TypeSafe dokumentoi itse, että Jeviä ei ole koulutettu tekstin generointiin. Tekstin rakentaminen valintojen ketjuna on mahdollista, mutta hidasta ja huono idea. Jos pitää kirjoittaa asiakkaalle hyvä ja kohtelias vastaus, käytetään generatiivista mallia tai ihmistä.5
Oikea työnjako voisi näyttää tältä:
- Jev arvioi, onko viesti uusi liidi.
- Jev tunnistaa viestin tyypin ja ehdottaa reittiä.
- Tavallinen kielimalli voi kirjoittaa luonnoksen, jos siihen on aihetta.
- Ihminen tarkistaa luonnoksen ennen lähettämistä.
Tässä työnjaossa kirjoittava malli saa käsiteltäväkseen vain vastausluonnosta tarvitsevat viestit.
Näin testasin mallia
Tein testin shadow-tilassa. Nykyinen tuotantoputki jatkoi toimintaansa normaalisti, mutta Jevin vastaukset menivät vain erilliseen tulostiedostoon. Pilotin kautta ei syntynyt asiakkuudenhallinnan tietueita, sähköpostiluonnoksia eikä lähetyksiä.
Testiaineisto koostui 17 anonymisoidusta tapauksesta. Mukana oli uusia asiakasviestejä, aiempien keskustelujen vastauksia, artistien ja alihankkijoiden viestejä, uutiskirjeitä, epäselvää arkikieltä, peruutuksia, roskapostia ja toimitusvahvistuksia. Mukana oli myös englannin- ja ruotsinkielisiä reunatapauksia, joten kyse ei ole puhtaasti 17 suomenkielisen viestin testistä.
Seitsemäntoista tapausta riittää oman putken ensimmäiseen kokeeseen. Mallin soveltuvuus muihin yrityksiin ja kieliin pitää arvioida erikseen.
Tulos parani, kun kysymykset paranivat
Ensimmäinen seitsemän tapauksen ajo meni oikein vain 2/7 tapauksessa. Roolikriteerien tarkentamisen jälkeen tulos oli 4/7. Kun reititysjärjestystä muutettiin, tulos nousi 7/7:ään.
Sen jälkeen aineisto laajennettiin 17 tapaukseen. Ensimmäinen laajan aineiston ajo tuotti 15/17. Kaksi seuraavaa ajoa tuottivat molemmat 17/17.
| Ajo | Testitapauksia | Tulos |
|---|---|---|
| 1 | 7 | 2/7 |
| 2 | 7 | 4/7 |
| 3 | 7 | 7/7 |
| 4 | 17 | 15/17 |
| 5 | 17 | 17/17 |
| 6 | 17 | 17/17 |
Tulokset paranivat, kun määrittelin luokkien rajat tarkemmin. Mikä erottaa asiakkaan artistista? Milloin yhteistyötarjous ei ole myyntiliidi? Miten ketjuvastaus eroaa uudesta yhteydenotosta?
Kun nämä erot kirjoitettiin auki, malli sai helpomman ongelman ratkaistavakseen. Kun asia jäi epämääräiseksi, confidence laski ja viesti voitiin ohjata ihmiselle.
Testin rajaus ja mallin rajoitteet
17/17 kuvaa onnistumista tämän kokeen aineistossa. Testitapaukset syntyivät oman liidiputken tarpeista, joten toinen yritys saisi todennäköisesti erilaisen tuloksen.
Myös mallin omassa dokumentaatiossa listataan rajoitteita. Jev lukee ohjeet melko kirjaimellisesti, kärsii liian suuresta ja epäolennaisesta syötteestä, ei ole hyvä laskemaan ja tarvitsee tarkat kriteerit reunatapauksissa.5
Siksi en poistaisi tavallisia sääntöjä mallin ympäriltä. Jos viestin voi tunnistaa varmasti otsikosta, lähettäjän osoitteesta tai rakenteesta, se kannattaa käsitellä tavallisella koodilla. Mallia käytetään siinä kohdassa, jossa tarvitaan kielen merkityksen arviointia.
Kuuden ajon kustannukset
Kuuden ajon kokonaiskustannus oli omien lokieni mukaan noin 0,002 dollaria. TypeSafen Jev 1.13:n tämänhetkinen hinta on 0,042 dollaria miljoonaa syötetokenia kohti, eikä ulostulotokeneista veloiteta.3
Vertailuksi OpenRouterin mallimetatiedoissa GPT-5.4:n hinta on 2,50 dollaria miljoonaa syötetokenia ja 15 dollaria miljoonaa ulostulotokenia kohti. Claude Sonnet 4.6:n vastaavat hinnat ovat 3 ja 15 dollaria.8
Pelkkää syötehintaa verraten Jev on näillä hinnoilla noin 60 kertaa GPT-5.4:ää ja 71 kertaa Claude Sonnet 4.6:ta halvempi. Laskelma vertaa syötteen hintaa. Tekstin tuottaminen ja mallien suorituskyky ovat erillisiä vertailuja.
Kustannusetu syntyy siitä, että päätökseen ei käytetä tekstin tuottamiseen tarkoitettua mallia. Jos seuraava vaihe tarvitsee sähköpostiluonnoksen, sen tekeminen maksaa erikseen.
Näin tekisin saman kokeen
Jos haluat kokeilla tätä omassa automaatiossasi, aloita näin:
- Kerää 15–30 anonymisoitua viestiä, joiden oikea käsittely tunnetaan.
- Määrittele jokaiselle päätökselle yksi kysymys.
- Rajaa vaihtoehdot ja kirjoita auki myös se, mitä kukin vaihtoehto ei tarkoita.
- Aja malli shadow-tilassa ilman kirjoituksia.
- Tallenna valinnan lisäksi todennäköisyydet ja confidence.
- Ohjaa epäselvät tapaukset ihmiselle.
- Aja sama aineisto useamman kerran.
- Pidä varmat, tavalliseen koodiin perustuvat turvarajat mallin ympärillä.
Pseudokoodina perusidea on tämä:
answers = jev(
state=message,
questions={
"sender_role": choice(["customer", "artist", "subcontractor", "other"]),
"is_new_sales_lead": noul("Is this a new customer sales lead?"),
},
)
if answers["sender_role"].confidence < 0.5:
route_to_human()
elif answers["is_new_sales_lead"].noul >= 0.7:
send_to_lead_review()
else:
route_to_other_queue()
Kynnysarvot ovat esimerkkejä. Ne pitää säätää oman aineiston ja väärän päätöksen hinnan mukaan.
Seuraava testi
Jatkan Jevin kokeilua liidien luokittelussa. Seuraavaksi tarvitsen suuremman, ajallisesti erillisen testiaineiston ja lisää reunatapauksia. Tuotantoputki pysyy toistaiseksi ennallaan.