Projektit — 2024
RAG-chatbot asiakkaalle ja henkilöstölle
Kaksi rinnakkaista chatbotia samalla arkkitehtuurilla — julkinen asiakaspalvelu ja sisäinen Entra ID -suojattu henkilöstöassari, molemmat groundattuna organisaation omaan dataan
RAG yhdistää tiedonhaun ja generoinnin: käyttäjä kirjoittaa kysymyksen omalla kielellään, järjestelmä hakee lähteet ja LLM muotoilee vastauksen — grounded, ei hallusinoitu. Sama pohja-arkkitehtuuri tuotti kaksi erillistä chatbottia eri käyttäjäkunnille.
Asiakas
Asiakas
Aikajakso
2024
Tekninen pino
- Azure OpenAI (EU Data Zone)
- Azure AI Search (vektorihaku + hybrid)
- Next.js + TypeScript (frontend)
- FastAPI (Python, backend/orkestrointi)
- Azure Container Apps
- Entra ID Easy Auth (sisäinen chatbot)
- Streaming SSE (nopea vastausrenderöinti)
- 01
Julkinen chatbot asiakkaiden kysymyksiin — vastaa organisaation oman tietokannan pohjalta, lähdelinkit mukana, ei hallusinaatioita
- 02
Sisäinen chatbot henkilöstölle — Entra ID -kirjautumisen takana, pääsee rajoitetusti sisäisiin ohjeisiin ja dokumentteihin joita ei saa näyttää ulkopuolelle
- 03
Sama arkkitehtuuripohja molemmille: erottelu tehdään käyttäjän tunnistamisella ja datankäyttörajauksilla, ei kahdella erillisellä koodipinolla
- 04
Streaming-vastaukset: käyttäjä näkee vastauksen muotoutuvan reaaliajassa — kokemus tutusta ChatGPT-käyttöliittymästä mutta organisaation omalla datalla
- 05
Ei mallikoulutusta, ei EU:n ulkopuolista tiedonkulkua — compliance on koodissa, ei sopimustekstissä
- 06
Lähdeviitteet vastauksissa — jokainen faktaväite on klikattavissa alkuperäiseen dokumenttiin
Mikä on RAG?
Retrieval Augmented Generation — tiedonhaun ja tekstingeneroinnin yhdistelmä. LLM ei vastaa muistinsa varassa vaan hakee ensin relevantit lähdekatkelmat ja kirjoittaa vastauksen niiden pohjalta. Merkittävä ero vs. “puhdas” LLM:
- Vastaus on jäljitettävissä — joka väite voidaan kytkeä lähteeseen
- Tuore data — päivittyy kun dokumentit päivittyvät, ei vaadi mallin uudelleenkoulutusta
- Organisaation oma tieto — LLM ei ole koskaan “nähnyt” sitä mallinkoulutuksessa, mutta hakee sen hakuajoissa
- Hallusinaatiot minimoituvat — kun konteksti tulee haetuista lähteistä, malli ei keksi tietoa tyhjästä
RAG on nykyisen “tekoälyä tietovarasta” -käyttötapauksen perusta, ja toteutin sen kahdessa rinnakkaisessa muodossa samalle asiakkaalle.
Lähtötilanne
Organisaatiossa oli kaksi erillistä tietotarvetta:
- Ulkoiset asiakkaat kysyivät yhä useammin samanlaisia peruskysymyksiä — jäsenyys, palvelut, edut, yhteystiedot. Verkkosivun FAQ vastasi osaan, mutta ei löytänyt monisanaisille luonnollisen kielen kysymyksille.
- Oma henkilöstö tarvitsi nopeamman pääsyn sisäisiin ohjeisiin, säännöstöihin, työohjeisiin, prosessikuvauksiin — asioita joita ei voinut eikä saanut näyttää julkisesti, mutta joita etsittiin päivittäin ja joista tulkittiin eri tavoin eri henkilöiden kesken.
Molempiin olisi voitu tehdä erillinen ratkaisu, mutta arkkitehtuuritasolla ne ovat sama ongelma eri oikeuksilla.
Tehty ratkaisu
Rakensin pohjan, joka palvelee molempia käyttötapauksia:
- Dokumentti-indeksointi Azure AI Searchiin — sekä tekstihaku että vektorihaku (hybrid). Asiakirjat segmentoidaan sopivan kokoisiksi katkelmiksi ja ajetaan embedding-mallin läpi.
- Orkestrointikerros FastAPI:lla — ottaa käyttäjän kysymyksen, tekee haut AI Searchiin, rakentaa kontekstin, kutsuu Azure OpenAI:n chat-mallia, streamaa vastauksen SSE:llä takaisin käyttöliittymään.
- Two-deployment -malli. Sama sovellus deployattuna kaksi kertaa: julkinen ilman tunnistusta ja rajoitettu ulkoiselle datalle; sisäinen Entra ID Easy Authin takana ja pääsee sisäiseen indeksiin. Käyttäjän oikeudet ratkaisevat mitä dataa haku voi ylipäätään nähdä.
- Lähdeviitteet aina näkyvissä. Jokainen vastaus sisältää linkit niihin dokumenttikohtiin joiden pohjalta se muodostui. Hallusinaatioriski pienenee, ja käyttäjä voi aina tarkistaa.
- Streaming UI. Vastaukset muotoutuvat ruudulle sanana kerrallaan — sama tuttu kokemus kuin ChatGPT:ssä, mutta organisaation omalla datalla ja sisäisen chatbotin osalta oman tietoturvarajan sisällä.
Ero kahden deploymentin välillä
| Julkinen chatbot | Sisäinen chatbot | |
|---|---|---|
| Tunnistautuminen | Ei (tai kevyt rate limit) | Entra ID Easy Auth |
| Datalähde | Julkinen tietopankki | Sisäinen dokumentaatio |
| Käyttötapaus | Asiakkaiden peruskysymykset | Henkilöstön sisäinen tietohaku |
| Käyttöliittymä | Upotettu nettisivulle | Sisäinen portaali |
Lopputulos
- Asiakas sai kaksi tuotemaista chatkokemusta yhdellä kehitysprojektilla — arkkitehtuurin uusiokäyttö teki toisesta deploymentista nopean rakentaa kun ensimmäinen oli pystyssä.
- Tietoturva kestävällä pohjalla. Sisäinen chatbot toimii vain kirjautuneelle henkilöstölle, sen data ei koskaan vuoda julkiselle puolelle, ja koko pino pysyy EU-alueella.
- Hallusinaatioriski minimoitu lähdeviitteillä ja groundingilla — käyttäjä näkee mistä vastaus tulee, organisaatio voi päivittää vastausta päivittämällä dokumenttia eikä muuttamalla promptteja.
- Skaalautuva pohja. Saman arkkitehtuurin päälle voi rakentaa kolmannen, neljännen, viidennen chatbotin — kukin omalla datalähteellään ja oikeusrajauksellaan. Teknologiavalinta oli tuotteistuksen, ei yksittäisen projektin.
Tämä oli oma esityöni myöhemmille projekteille — erityisesti omalle raportointialustalle jossa sama RAG-logiikka on osana suurempaa kokonaisuutta. RAG ei ole lopputuote vaan menetelmä, joka sopii moneen tilanteeseen.