Avainsana: LLM

Mitä ovat suurten kielimallien tuottamat upotukset eli embeddingit?

http://Taikurin%20hattu,%20jonne%20putoaa%20A-kirjain%20ja%20joukko%20numeroita
2.12.2024

Tavallinen käyttäjä käyttää suuria kielimalleja, kuten ChatGPT:tä, kirjoittamalla sille kehotteita (prompteja) käyttöliittymän kautta. Tämän lisäksi suuret kielimallit tarjoavat teknisesti harjaantuneille käyttäjille toisenlaisen toiminnon - upotusten (englanniksi embeddings) luonnin tekstin pohjalta. Mutta mitä nämä upotukset oikein ovat ja mihin niitä käytetään? Tekstin merkitys vektoreissa Kun suurelle kielimallille antaa tekstiä upotettavaksi, se tuottaa tulokseksi vektorin. Vektori on lista numeroita, jonka merkitys ei avaudu ihmissilmälle, mutta se avaa mahdollisuuden tutkia tekstin merkitystä matemaattisin keinoin. Näitä kielimallin tuottamia vektoreita kutsutaan upotuksiksi eli embeddingeiksi.  UralicNLP-Python-kirjasto tarjoaa keinoja upottaa tekstiä eri kielimallien avulla. Tässä on esimerkki siitä, miten UralicNLP:llä voi upottaa tekstin OpenAI:n mallilla. from uralicNLP.llm import get_llmllm = get_llm("chatgpt", "VAIHDA TÄHÄN API-AVAIMESI", model="text-embedding-3-small")llm.embed("Teksti, jonka haluat upottaa")>>[-0.1803697, 1.1973963, 0.5283669, 1.5049516, -0.27077377...] Kuten esimerkistä näkee, upotuksen tulos on lista numeroita. Nämä numerot kuvastavat tekstin merkitystä, ja niiden avulla voidaan vertailla tekstien samankaltaisuutta matemaattisin keinoin. Mitä hyötyä on upotuksista? Upotusten avulla tekstimassoja voidaan tallentaa nopeasti haettaviksi vektoritietokantaan. Näin tietokantahakua ei tehdä kirjainmerkkien vaan merkityksen avulla. Yleisin käyttötapaus tällaisille vektoritietokannoille on tällä hetkellä RAG-malli. RAG tulee sanoista Retrieval-Augmented Generation ja se tarkoittaa sitä, että suurelle kielimallille haetaan kehotteen lisäksi lähdeaineistoa, jonka avulla malli tuottaa vastauksen. Lähdeaineiston hakeminen tapahtuu hakemalla upotusten avulla käyttäjän syötteeseen sopivia dokumentteja vektoritietokannasta. Esimerkiksi Metropolian oma Mikro-Mikko toimii tällä periaatteella.  Upotusten avulla tekstidokumentteja voi myös ryhmitellä automaattisesti samankaltaisten tekstien ryhmiin. UralicNLP:llä tämä hoituu seuraavalla tavalla. from uralicNLP.llm import get_llmfrom uralicNLP import semanticsllm = get_llm("chatgpt", "VAIHDA TÄHÄN API-AVAIMESI", model="text-embedding-3-small")texts = [“koirat on hauskoja”, “autot ajaa nopeasti”, “kissat leikkii keskenään”, “rekat ajaa kaupungista toiseen”]semantics.cluster(texts, llm)>>[[“koirat on hauskoja”, “kissat leikkii keskenään”], [“autot ajaa nopeasti”, “rekat ajaa kaupungista toiseen”]] Tuloksena tekstit ryhmitellään samankaltaisten tekstien ryhmiin käyttäen upotuksia sekä laskien niiden samankaltaisuuden. Onko mallilla väliä upottaessa? Upotuksia voidaan tuottaa sekä kaupallisilla suurilla kielimalleilla että avoimilla kielimalleilla. Mallia valittaessa kannattaa muistaa, etteivät upotukset ole keskenään yhteensopivia. Osaa upotuksista ei siis voi tehdä OpenAI:n GPT-4:llä ja osaa avoimella LLaMA:lla, ja olettaa, että ne toimisivat yhteen. Jokainen malli on oppinut omanlaisensa merkitysrepresentaation datasta, joten upotuksen numeerinen sisältö vaihtelee eri mallien välillä. Mallia valitessa kannattaa miettiä mallin hintaa, sen tukemia kieliä sekä konteksti-ikkunaa. Suuremmat mallit voivat mahduttaa suurenkin tekstin konteksti-ikkunaan, jolloin kokonaiselle tekstille voidaan tehdä yksi upotus. Pienemmät mallit vaativat tekstin pilkkomista osiin. Tämä tekninen rajoite voi olla merkityksellinen riippuen siitä, mihin upotuksia käyttää. Kaikki mallit eivät myöskään osaa kaikkia kieliä. Jos kielimalli tuottaa kehnoa suomea vastauksena kehotteisiin, se ei todennäköisesti myöskään ymmärrä suomea kovinkaan hyvin. Tästä seuraa se, että suomenkieliselle tekstille tehtävät upotuksetkaan eivät kuvaa merkitystä riittävän hyvin.