Hero imageMobile Hero image
  • Facebook
  • LinkedIn

March 27, 2025

Jos RAG-sovellus olisi elokuva, olisi tekoäly sen sankari. Mutta ilman luotettavaa hakuindeksiä tämän sankarin seikkailut saattaisivat loppua lyhyeen. 

Tyypillisesti RAG-sovellukseen liittyy hakuindeksi. Hakuindeksi on tietokanta, jota hakuohjelmat käyttävät tehokkaaseen tiedonhakuun. Hakuindeksissä olevat tietueet sisältävät avainsanoja tai muuta tietoa niistä dokumenteista, joihin ne viittaavat. Näin ollen hakuohjelman on helppo löytää relevantti dokumentti. 

RAG-sovelluksella tarkoitetaan sellaista generatiivisen tekoälyn sovellusta, joka osaa vastailla käyttäjän kyselyihin hakuindeksistä löydetyn tiedon perusteella. Käytännössä käyttäjä esittää kyselyn tekoälylle, joka suorittaa haun ja vastaanottaa haussa löydetyt tiedot, joita sitten käytetään käyttäjän kyselyyn vastaamiseen. 

”Keskustele dokumenttiesi kanssa” on tyypillinen RAG-sovellus, jossa käyttäjä ohjaa tekoälyä kyselyiden avulla. Tulevaisuudessa on kuitenkin todennäköistä, että tyypillinen RAG-sovelluksen käyttäjä on tekoälyagentti, eli ei kannata jumiutua siihen, että tässä tarvittaisi ihmistä mihinkään. 

Alkuaikojen RAG 

Kaksi vuotta sitten, kun pioneerit lähtivät rakentamaan RAG-ratkaisuja, harva mietti miten rakentaa tehokkain mahdollinen hakuindeksi. Yleinen tapa käyttäjän dokumenttien indeksointiin oli niiden pilkkominen paloiksi ja palojen sekä paloista muodostettujen vektoreiden tallettaminen tietueiksi hakuindeksiin. 

Vektorit ovat avainasemassa kaikessa generatiiviseen tekoälyyn liittyvässä toiminnassa. Yksi generatiivisen tekoälyn pääperiaatteista on tekstin, ja varsinkin tekstissä olevan tarkoituksen, muuttaminen vektoreiksi, eli numerosarjoiksi. Näitä vektoreita tekoäly sitten käyttää vastaillessaan käyttäjän kyselyihin. 

Hakuindeksiin talletettuja vektoreita käytetään lisäksi vektoripohjaisessa tiedonhaussa. Eli käytännössä käyttäjän kysely muutetaan vektoriksi, jota sitten vertaillaan hakuindeksissä oleviin vektoreihin, ja poimitaan parhaat osumat. 

Alkuaikojen RAG-ratkaisujen suurimpana haasteena oli konteksti-ikkunan pienuus. Dokumentteja jouduttiin palastelemaan puolikkaan sivun mittaisiin palasiin, jotta niiden vektorisointi oli mahdollista. Tämä johti siihen, että dokumentit silppuuntuivat, mikä vaikutti tekoälyn luomien vastauksien laatuun. 

Kun tekoäly lähti hakemaan tietoa hakuindeksistä, se sai vastauksena puolen sivun mittaisia dokumentin palasia, joita se sitten yhdisteli parhaansa mukaan. Varsinkin jos kyseessä oli laajoja dokumentteja, tämä ei aina onnistunut täydellisesti. 

Seuraava kehitysaskel 

Nykyään konteksti-ikkunan koko ei enää ole ongelma. Tänä päivänä tekoäly kykenee vektorisoimaan hyvinkin laajoja dokumentteja, mikä ratkaisee silppuuntumiseen liittyvän ongelman. Nykyään dokumentteja on mahdollista vektorisoida kokonaisuudessaan, tai ainakin dokumenttien rakenteen kannalta järkevästi, esimerkiksi sivuittain tai luvuittain. 

Toinen parannus alkuaikoihin verrattuna on dokumentissa käytetyn typografisen hierarkian säilyttäminen. Alkuaikoina, dokumentteja paloiteltaessa, ei kauheasti kiinnitetty huomiota dokumenttien typografiaan, eli josko jokin tietty teksti on otsikko, väliotsikko tai osa taulukkoa. Se mitä niistä haluttiin, oli pelkkä, raaka sisältö. 

Nykyään tekstin ekstrahoinnissa on mahdollista käyttää esimerkiksi Markdown-muotoa, joka säilyttää tiedon siitä, minkälainen typografinen elementti on kyseessä. Tämä on kätevää, koska generatiivinen tekoäly osaa käsitellä Markdown-koodattuja dokumentteja erittäin hyvin. 

Kun hakuindeksi palauttaa järkevästi paloiteltuja, Markdown-koodattuja dokumentteja, tekoälyn on paljon helpompi muodostaa hyviä vastauksia käyttäjän kyselyihin. Nyt sen ei enää tarvitse työskennellä pieniksi pilkotuilla tekstin palasilla, nyt sen on paljon helpompi ymmärtää mistä lähdemateriaalissa on kyse. 

Lyhennelmät  

Välillä RAG-ratkaisussa käytetyt dokumentit ovat niin laajoja, tai rakenteeltaan niin kryptisiä, että niiden vektorisoiminen ja tallettaminen hakuindeksiin ei ole järkevää. Lisäksi välillä voi olla toivottavaa, että yhdestä dokumentista ei olisi hakuindeksissä enempää kuin yksi tietue. 

Kuvitellaan esimerkiksi tilanne, jossa käyttäjä haluaa löytää kaikki tiettyä aihetta koskevat dokumentit. Jos dokumentit on paloiteltu, hakuindeksi saattaa palauttaa useita paloja samasta dokumentista, ja jättää pois jonkun dokumentin kokonaan. Tällaisessa tilanteessa ratkaisu voi olla dokumenttien lyhentäminen ja lyhennelmien tallettaminen hakuindeksiin. 

Käytännössä dokumentti syötetään tekoälylle ja pyydetään sitä luomaan siitä lyhennelmä tiettyjen ennalta määriteltyjen sääntöjen mukaan. Tekoälyä voidaan pyytää esimerkiksi poimimaan dokumentista tietoa henkilöistä tai yrityksistä, dokumentin aiheesta tai teemoista, tai mistä tahansa relevantista asiasta. Tämän jälkeen lyhennelmä ja siitä tehty vektori syötetään tietueeksi hakuindeksiin metatietojen kanssa. Metatietoihin kuuluu yleensä dokumentin nimi ja tieto mistä sen löytää. 

Näin ollen tekoäly hakee ensin tietoa sopivista dokumenteista lyhennelmien perusteella, ja sen jälkeen varsinaisia dokumentteja lyhennelmistä löytyvien metatietojen perusteella. Tällä tavoin hakuindeksi pysyy selkeänä ja siitä löytyvät dokumentit samanarvoisina, riippumatta siitä kuinka laajoja ne ovat. 

Tekoälyavusteinen tägitys 

Kun hakuindeksit kasvavat ja niissä olevan tiedon määrä lisääntyy, tulee relevantin tiedon löytäminen väistämättä vaikeammaksi. Tällöin on hyvä, jos tietoa voi suodattaa, ennen kuin varsinainen haku suoritetaan. 

Kuvitellaan, että hakuindeksissä on miljoona tietuetta. Jos käyttäjän haku koskee kaloja, ja puolet tietuista on luokiteltu niin, että ne koskevat kaloja, ja toinen puoli niin, että ne koskevat lintuja, voidaan tietueita suodattamalla pienentää haussa käytettyjen tietueiden määrä puoleen miljoonaan. Jos kaloja koskevat tietueet ovat lisäksi luokiteltu makean veden ja suolaisen veden kaloihin, pienenee tietueiden määrä ennestään. 

Tiedon luokittelu, eli tägitys, on erittäin tehokas keino relevantin tiedon suodattamiseen. Tämä on myös jotain, mitä tekoäly voi tehdä. 

Käytännössä tekoälylle annetaan tietyt ennalta määritellyt luokat, tai vapaus luoda omia luokkia tiettyjen rajojen puitteissa, joiden mukaan tekoäly luokittelee kaikki sille syötetyt dokumentit. Nämä luokat lisätään sitten dokumenttien metatietoihin niin, että niitä voi käyttää tietueiden suodattamiseen. 

Moni-indeksijärjestelmä 

Jokainen RAG-ratkaisu vaatii hyvin suunnitellun hakuindeksin, josta haetaan relevanttia tietoa. On tärkeää ymmärtää, minkälaisesta tiedosta on kyse, jotta sille voidaan suunnitella paras mahdollinen indeksi. 

Välillä voidaan kuitenkin päätyä tilanteeseen, jossa tieto on niin moninaista, että yhden yhtenäisen indeksirakenteen löytäminen ei ole mahdollista. Tieto, eli käytetyt dokumentit, voivat olla rakenteeltaan selkeästi erilaisia, koskea selkeästi eri asioita, tai niiden käyttötarkoitus voi olla selkeästi erilaista. Tällöin voi olla järkevää jakaa tietoa useampaan eri hakuindeksiin. 

Tämän tyyppinen moni-indeksijärjestelmä on mahdollinen tekoälyagenttien ja agenttimaisen tekoälyn myötä. Lue lisää tekoälyagenteista vaikka täältä. RAG-ratkaisuun lisätty agentti kykenee tulkitsemaan sille esitettyjä kyselyjä ja päättelemään mistä indeksistä se lähtee hakemaan tietoa. 

Tekoälyagentit tuovat generatiivisen tekoälyn käyttöön uusia ulottuvuuksia ja mahdollistavat entistä tehokkaampia RAG-ratkaisuja. 

TLDR 

Kun lähdetään rakentamaan hakuindeksiä RAG-ratkaisuun on tärkeää, että ymmärretään, miten ratkaisua on tarkoitus käyttää ja minkälaista tietoa indeksiin tullaan syöttämään. Sen jälkeen valitaan sopiva ratkaisu. 

Henri Forss

Henri Forss

Generative AI Developer