Suurten kielimallien yleistymisen myötä ai-pöhinä on noussut dominovaksi diskurssiksi melkein kaikessa tietotyössä. Markkinatutkimuksen osalta tämä tarkoittaa muiden sovellusten ohella puhetta synteettisistä vastaajista.

Synteettisellä vastaajalla tarkoitetaan kielimallin simuloimaa haastateltavaa tai kyselyvastaajaa. Markkinointipuheen mukaan vastaajien generoiminen vähentää tutkimusten kustannuksia ja niihin kuluvaa aikaa. Vaikeatkin kohderyhmät on helppo tavoittaa, kun niitä ei tavoiteta ollenkaan vaan ne simuloidaan ChatGPT:llä! Vastaajia voi generoida niin paljon kuin tarvitsee, joten pienestä näytekoosta johtuvat tarkkuusongelmat jäävät historiaan.

Synteettiset vastaajat ovat houkutteleva paradigma siitäkin syystä, että ne sopivat nykyisiin prosesseihin saumattomasti. Tehdään asioita niin kuin ennenkin, mutta halvemmalla ja nopeammin.

Qualtricsin tekemä kysely paljastaa, että suuri osa alustan käyttäjistä ajattelee synteettisten vastaajien täyttävän kahdessa vuodessa suurimman osan vastaajatarpeista. Hype on huipussaan. (Koko raporttia ei näköjään ole enää saatavilla ilman rekisteröintiä.)

Onneksi synteettistä näytettä on helppo testata, joten kokeillaan.

Minulla on käsillä muutaman kuukauden vanha kyselydata, jossa yhtenä osiona on tekoälyasenteet. Se tuntuu sopivalta aiheelta siksikin, että internet on pullollaan aihetta, joten sen pitäisi olla tekoälylle helppo aihe verrattuna vaikka hypoteettisiin keksikonsepteihin tai marginaalibrändien penetraation q2-q3 muutoksiin.

Prosessi synteettisten vastaajien luonnissa on seuraavanlainen: annetaan kielimallille syöte, jossa se pyydetään ottamaan jokin rooli jossain kontekstissa, esimerkiksi "On 2024 syksy. Olet 37-vuotias kahden lapsen äiti, joka asuu Itä-Suomessa n. 25000 asukkaan kunnassa, on vakituisessa työsuhteessa ja kokeilet uusia tuotteita yleensä ensimmäisten joukossa." Sitten tekoälyä pyydetään vastaamaan kyselyyn tässä roolissa. Tämä ei olennaisesti eroa tavasta, jolla synteettisiä vastaajia tarjoavat tahot toimivat - lähes kaikki pienemmät sovellukset ovat ns. wrappereitä teknojättien kielimalleille. Kun joku puhuu esimerkiksi tekoälyn kouluttamisesta omalla datalla, hän suurella todennäköisyydellä tarkoittaa tämän oman datan antamista syötteenä valmiille kielimallille, ei firman itse kehittämää mallia.

Tässä kiinnostuneille koodinpätkä, jolla loin alkuperäistä demografioiltaan vastaavan synteettisen datasetin. Voit turvallisesti hypätä tämän osion yli.

import pandas as pd
import numpy as np
import openai

openai.api_key = "XXX"

def vastaa_kyselyyn(kuvaus, survey):
    
    messages = [
        {"role": "system", "content": f"Olet satunnaisesti valittu {kuvaus}. Vastaat internetkyselyyn."},
        {"role": "user", "content": "Kysymykset ovat tässä kysymykset ovat <Kulmasulkeissa> ja vastausvaihtoehdot alla muotossa [koodi]:vaihtoehto. \n\n. Vastaa JSON-formaatissa esim."+ '{"Q1":1, "Q2":1 ...} Ei muuta tekstiä.\n\n'+f'{survey}' }
    ]

    response = openai.ChatCompletion.create(
        model="gpt-4o", 
        messages=messages,
        max_tokens=500,  
        temperature=0.5  
    )

    return response

Survey = """
<Q1>
Yleisesti ottaen, onko Suomi menossa mielestäsi oikeaan vai väärään suuntaan?
1: Oikeaan suuntaan
2: Hieman oikeaan suuntaan
3: hieman väärään suuntaan
4: Väärään suuntaan
99:En osaa sanoa

<Q21>
Oletko kuullut tekoälystä (AI) tai sen sovelluksista?
1: Kyllä
2: En

<Q22>
Kuinka hyvin tunnet olevasi perillä tekoälyn ja sen sovellusten käytöstä?
1: En lainkaan perehtynyt
2: En kovin perehtynyt
3: En osaa sanoa
4: Perehtynyt
5: Hyvin perehtynyt

<Q23r1>
Oletko koskaan käyttänyt tekoälyteknologioita työelämässäsi?
17335: Kyllä
17336: En
17337: En ole töissä

<mita_tyota>
Mitä työtä teet?
[avoin vastaus]

<miten_hyodyntanyt_tyo>
Miten olet hyödyntänyt tekoälyä työssäsi?
[avoin vastaus]

<Q23r2>
Oletko koskaan käyttänyt tekoälyteknologioita henkilökohtaisessa elämässäsi?
17338: Kyllä
17339: Ei

<miten_hyodyntanyt_vapaa>
Mihin olet käyttänyt tekoälyä?
[avoin vastaus]

<ai_hyoty>
Kuinka hyödylliseksi koet tekoälyn käytön?
1: Täysin hyödyttömäksi
2: Melko hyödyttömäksi
3: En hyödylliseksi tai hyödyttömäksi
4: Melko hyödylliseksi
5: Erittäin hyödylliseksi

<Q24>
Missä määrin haluaisit lapsesi työskentelevän tekoälyn parissa?
1: Ehdottomasti en haluaisi
2: En haluaisi
3: En osaa sanoa
4: Haluaisin
5: Ehdottomasti hauluaisin
98: Minulla ei ole lapsia
"""

attitude_statements = [
('ai_att_1' , 'Tekoäly tulee korvaamaan useita nykyisiä työpaikkoja ja aiheuttamaan merkittävää työttömyyttä'),
('ai_att_2' , 'Tekoälyn käyttöön liittyy merkittäviä eettisiä ongelmia'),
('ai_att_3' , 'Tekoäly parantaa merkittävästi ihmisten elämänlaatua'),
('ai_att_4' , 'Tekoäly tulee mullistamaan terveydenhuollon tarjoamalla tarkempia diagnooseja ja hoitosuosituksia'),
('ai_att_5' , 'Tekoälyn kehittyminen vaarantaa yksityisyyden suojan ja lisää valvontayhteiskunnan riskejä'),
('ai_att_6' ,'Tekoäly tulee parantamaan koulutuksen laatua ja tehostamalla oppimista'),
('ai_att_7' ,'Tekoälyn kehitystä ja käyttöä tulisi säädellä tiukasti'),
('ai_att_8' ,'Tekoälyn käyttäminen päätöksenteossa vähentää inhimillisiä virheitä ja tekee prosesseista oikeudenmukaisempia'),
('ai_att_9' ,'Tekoälyn tekemät päätökset ja analyysit ovat luotettavampia kuin ihmisten tekemät'),
('ai_att_10' ,'Tekoäly pystyy luomaan taidetta ja kulttuurituotteita, jotka ovat yhtä arvokkaita kuin ihmisten tekemät'),
('ai_att_11' ,'Tekoäly ei koskaan pysty korvaamaan ihmisajattelua'),
('ai_att_12' ,'Tekoäly ahdistaa minua'),
('ai_att_13' ,'Tekoälyn vaikutusta liioitellaan suuresti')
]

for code,statement in attitude_statements:
    Survey += f'\n\n<{code}>\nMiten samaa tai eri mieltä olet: {statement}\n'
    Survey += """
1:1 Täysin eri mieltä 
2:2 Jokseenkin eri mieltä
3:3 En samaa enkä eri mieltä
4:4 Jokseenkin samaa mieltä
5:5 Täysin samaa mieltä"""

def kuvaus(D1, talouden_tyyppi, ammatti, talouden_tila, omaksuminen, ika, asuinpaikka):
    sukup = {1:'mies', 2:'nainen'}.get(D1, '')
    ika_d = {1: (18,25), 2:(25, 34), 3:(35,45), 4: (45,55), 5:(55,67), 6:(65,75), 7:(75,80)}
    ika = np.random.randint(*ika_d[ika])
    ttyyppi = {1: 'asut yksin', 2: 'asut yksin lasten kanssa', 3: 'asut kaksin puolison kanssa', 4:'asut puolison ja lasten kanssa', 5: 'taloutesi on epätavallinen'}.get(talouden_tyyppi, '')
    työ = {1:'käyt töissä', 2:'olet työtön', 3:'olet eläkeläinen', 4:'olet opiskelija', 5:''}.get(ammatti,'')
    taloudentila = 'taloutesi tila '+{1: 'on heikko', 2:'ei ole kovin vahva', 3:'on melko vahva', 4:'on vahva', 5:'on erittäin vahva'}.get(talouden_tila, 'ei ole tiedossasi')
    omaks = { 
        1: 'olet se, joka kokeilee uusia asioita aivan ensimmäisenä',
        2: 'olet ensimmäisten joukossa kokeilemassa uutta',
        3: 'kokeilet mielelläsi uusia asioita, mutat et aivan ensimmäisten joukossa',
        4: 'kokeilet uutta yleensä vasta kun se on jo muiden käytössä',
        5: 'kokeilet uusia asioita vasta aivan viimeisenä'
        }.get(omaksuminen, '')
    asuminen = {
        1: 'asut kaupungin keskustassa',
        2: 'asut vanhassa lähiössä',
        3: 'asut uudessä lähiössä',
        4: 'asut pienessä kaupungissa',
        5: 'asut haja-asutusalueella',
    }.get(asuinpaikka, '')
    
    
    return f"""
Olet {ika}-vuotias {sukup},
{asuminen}
{työ}
{ttyyppi}
{taloudentila}
{omaks}
"""

import json

CSV = pd.read_csv('data.csv', delimiter=";")

vastaukset = []

taustat = ['D1','talouden_tyyppi','ammatti','talouden_tila','omaksuminen','ika','asuinpaikka']

for i, row in CSV.iterrows():
    Kuvaus = kuvaus(row['D1'], row['talouden_tyyppi'], row['ammatti'], row['talouden_tila'], row['omaksuminen'], row['ika'], row['asuinpaikka'])
    
    response = vastaa_kyselyyn(Kuvaus, Survey)["choices"][0]["message"]["content"]
    
    response = response[7:-3]
    
    jsonresponse = json.loads(response)

    for t in taustat:
        jsonresponse[t] = row[t]

    vastaukset.append(jsonresponse)
    print(f"Vastaus {i} käsitelty")

pd.DataFrame(vastaukset).to_csv('chatgpt-4o-responses.csv')

Kuten koodistakin näkee, annoin syötteessä vähän ylimääräistä informaatiota, jota ei todellisuudessa ole saatavilla ilman kyselyä (yleisasenne uuden kokeiluun).

Tuloksena oli varsin uskottavat rivit vastaajadataa!

Screenshot 2025-03-13 102726

Ensi näkemältä tulokset vaikuttavat siis hyvältä! Jokainen vastausrivi on johdonmukainen, avoimiinkin on vastattu monipuolisesti. (Joskin oikeat ihmiset eivät vastaa avoimiin näin pieteetillä, saati näin hyvällä kieliopilla)

Vastaukset näyttävät aggrekoidulla tasollakin hyvältä. Edes harjaantunut silmä ei huomaa ensinäkemältä mitään outoa vastausten jakaumissa ja vastaukset tuntuvat uskottavilta. Jopa asennekysymyksistä tehty pääkomponenttianalyysi on uskottava.

Mutta epistemologinen tieto on sekä perusteltu että tosi uskomus. Vastaukset ovat johdonmukaisia ja uskottavia, mutta miten hyvin ne vastaavat todellisuutta? Silmämääräisesti tuloksetkin ovat oikeansuuntaisia, vaikka eroja selvästi on.

Mitatakseni vastausten todenmukaisuutta vertaan synteettistä näytettä siis alkuperäiseen, oikeasti kerättyyn dataan. Tuodakseni kontekstia sille, kuinka pielessä synteettinen näyte on, loin useita benchmarkkeja:

Otin alkuperäisestä toisen samankokoisen näytteen (N=100), joka kertoo siitä, miten erilaiset datat olisivat, jos täsmälleen sama näytteistäminen toistettaisi. Otin lisäksi pienempiä näytteitä (N=50,25,10) nähdäkseni näytekoon pienentämisen vaikutuksen. Tämän lisäksi loin "nollainformaatiobenchmarkin", jossa vastaukset aina jaettiin tasan jokaisen mahdollisen vaihtoehdon välillä (eli kyllä-ei kysymykset aina 50-50 ja viisiportainen skaala saa 20% jokaiseen vastaukseen). Lopuksi pyysin asiaan perehtymätöntä maallikkoa (vaimoani) arvaamaan taulukon prosenttiosuudet parhaan tietonsa mukaan.

Mittarina käytin solutason virhettä, kun vertaa alkuperäiseen dataan. Esimerkiksi jos jakauman solu on todellisuudessa 20 % ja synteettisessä datassa 30 %, virhe on 10 %. Keskiarvo näistä poikkeamista kertoo, kuinka monta prosenttiyksikköä satunnainen solu on pielessä keskimäärin.

Alla tulokset. Tässä siis isompi luku on huonompi ja kertoo suuremmasta keskimääräisestä virheestä.

BenchmarkVirhe
N=100 resample3%
N=50 resample6%
N=25 resample7%
N=10 resample13%
Nollainformaatio (vastaukset aina tasan)14%
Maallikon arvaus12%
Synteettinen näyte (gpt4o)15%

Synteettiset vastaajat johdonmukaisuudestaan huolimatta poikkeavat todellisuudesta enemmän kuin asiaan perehtymättömän ihmisen arvaus ja jopa täysi nollainformaatioarvaus (eli vastaukset jaettiin aina tasan kaikkien vaihtoehtojen välillä), oikeasta datasta nyt puhumattakaan.

Kaiken tekno- ja menetelmähypen lomassa tuntuu unohtuvan, että tutkimuksen lopullinen tarkoitus ei ole kehittyneet menetelmät, dynaamiset visualisaatiot ja niiden avulla rakennetut kiinnostavat narratiivit - se on saada paikkaansa pitävää tietoa maailmasta. Synteettisillä vastaajilla voi saada kaiken muun kustannustehokkaasti, mutta tällä tavalla "kerätty" data ei yksinkertaisesti vastaa todellisuutta. Sitä voi verrata lähinnä kelvolliseen väärennökseen, jossa ei ole ilmiselviä virheitä, tai siihen, että joku klikkifarmilta samaistuu yksi kerrallaan vastaajiin ja vastaa tässä roolissa kyselyihin. Toki tällä lailla luodulla datalla on myös ihan asiallisia sovelluksia, kuten testaus.

Myös AI-vastausten määrällinen helppous ja vaikeiden kohderyhmien supplementointi on illuusio. Datan laatu ei parane lainkaan lisäämällä näytekokoa, jos näyte, jota lisätään, ei ole lähteestä, jota halutaan mitata. Isomman näytekoon virhettä pienentävä vaikutus perustuu satunnaisvaihtelun minimointiin, johon synteettinen data ei tarjoa vastausta. (Tämä ei tarkoita, että AI ei kykene antamaan asiasta mitään tietoa, vaan ettei sitä pidä tehdä generoimalla vastauksia ja teeskentelmällä, että ne vastaavat luonnollista dataa.)

Tekoälykehityksen tavoite on luoda ihmismäinen, joustava äly. Vaikka tämä tavoite saavutettaisi tai ylitettäisi, ei tekoälystä silti tule kaikkitietävää yleissimulaattoria vaan ihmisillä testaaminen on silloinkin välttämätöntä, jos tarvittavaa tietoa ei ole jo saatavilla. Toisaalta tekoäly toimii jo nyt kelvollisesti rajatussa asiantuntijaroolissa (etsimään ja muokkaamaan tietoa aiemmista lähteistä ja sillä voi olettaa olevan hyödyllistä "hiljaista tietoa" yllättävistäkin aiheista) ja tämän roolin voi olettaa kasvavan.

Loin tätä ajatellen vielä yhden benchmarkin. Annoin tekoälyn arvata tulokset suoraan ilman synteettisten vastaajien välivaihetta.

BenchmarkVirhe
Tekoälyn arvaus8%

Tästä tekoäly suoriutui paremmin kuin maallikko, selvästi paremmin kuin N=10 näyte ja vain täpärästi huonommin kuin N=25 näyte.

Jos siis tekoälyä aikoo käyttää tiedon tuottamiseen, siihen kannattaa suhtautua asiantunijana, joka antaa suoraan valistuneen arvauksen lopputuloksesta. Menetelmänä se on merkittävästi parempi kuin synteettiset vastaajat.