Projektit — 2026
Oma raportointialusta ostetun työkalun tilalle
Interaktiivinen portaali — luonnollisen kielen kyselyt, dokumenttihaku tekoälyllä, rivitason oikeudet
Loppukäyttäjä esittää kysymyksen omalla kielellään ja saa vastauksen: datakyselyä ei tarvitse osata, raporttia ei tarvitse tilata, dokumenttipinoa ei tarvitse penkoa — tekoäly tekee käännöstyön käyttäjän oikeuksien sisällä.
Asiakas
Asiakas
Aikajakso
2026
Tekninen pino
- Next.js 15 (App Router) + TypeScript
- Tailwind CSS + shadcn/ui
- ECharts + Recharts + TanStack Table
- FastAPI + SQLAlchemy
- Azure Container Apps (ulkoinen web + sisäinen API)
- Azure AI Search + Azure OpenAI (EU Data Zone)
- Entra ID Easy Auth + B2B Guest
- Row-level security + auditointilokit
- 01
Luonnollisen kielen kyselyt datavarastoon — käyttäjä kirjoittaa kysymyksen arkisuomeksi, alusta kääntää sen SQL-kyselyksi, ajaa sen käyttäjän oikeuksien rajoissa ja esittää vastauksen taulukkona ja visualisointina
- 02
Dokumenttihaku satojen/tuhansien tiedostojen yli RAG-mallilla — kysymys arkisuomeksi, vastaus groundattuna ja lähdeviitteillä, ei hallusinaatioita
- 03
Ulkoisten vieraskäyttäjien hallinta ilman erillislisenssejä — Entra ID B2B -guestimalli, Easy Auth reunatasolla
- 04
Tietoturvamalli jossa backend ei ole koskaan julkista — BFF-kuvio estää tunnistuksen kiertämisen arkkitehtuurin tasolla
- 05
Jokainen kysely rajataan käyttäjän oikeuksiin automaattisesti — ei manuaalista "muistithan suodattaa" -tarkistusta
- 06
EU Data Zone -alueellinen pakko kaikkeen AI-liikenteeseen — EU-jurisdiktiovaatimus on jo koodissa, ei operaattoritoiminnan varassa
Lähtötilanne
Asiakkaan raportointi rakentui kolmelle epäoptimaaliselle kerrokselle: kaupalliseen BI-tuotteeseen joka vaati lisenssimaksun jokaisesta aktiivisesta käyttäjästä (mukaan lukien kumppaniorganisaatioiden vieraista), kymmeniin hand-maintained HTML-raporttitiedostoihin joita ylläpiti yksittäinen henkilö, sekä Excel-taulukoihin joita johdanto vertaili manuaalisesti. Vieraskäyttäjien hallinta oli jatkuva kitkalähde ja lisenssimenot skaalautuivat väärään suuntaan jokaisen uuden kumppanin myötä.
Lisäksi suuri osa organisaation tiedosta oli dokumenteissa — toimintaohjeissa, sopimuksissa, pöytäkirjoissa, työehtosopimuksissa — joita oli satoja tai tuhansia, eikä niistä löytänyt vastauksia ilman että joku tiesi missä etsiä. Loppukäyttäjän tietotarve syntyi, ja sen tyydyttämiseen kului asiantuntijan työpanos.
Tavoite oli korvata pino omalla interaktiivisella alustalla joka madaltaa tiedon hakuun kynnystä, ei maksa käyttäjämäärästä, kunnioittaa rivitasoista käyttöoikeutta automaattisesti ja on helppo laajentaa uusilla raporteilla ja ominaisuuksilla.
Tehty ratkaisu
Rakensin portaalin jossa sekä frontend että backend elävät samassa monorepossa ja puhuvat tiukasti tyypitetyllä OpenAPI-sopimuksella.
Loppukäyttäjän kannalta
- Luonnollisen kielen kyselyt datavarastoon. Käyttäjä kirjoittaa “paljonko jäseniä liittyi viime vuonna yhdistykseen X” tai “näytä eroamissyyt viimeisiltä 12 kuukaudelta”. Portaali muuntaa kysymyksen SQL-kyselyksi suoraan käyttäjän oikeusrajauksen sisällä, ajaa sen, ja esittää vastauksen sekä taulukkona että valittuna visualisointityyppinä (aikasarja, palkki, piirakka, heatmap). SQL-taitoa tai raportin tilausta ei tarvita.
- Dokumenttihaku RAG-mallilla. Asiakkaan satoja/tuhansia PDF- ja Word-dokumentteja indeksoidaan automaattisesti vektorihakuun. Käyttäjä kysyy “mitä työehtosopimus sanoo irtisanomisajasta tilanteessa X”, portaali hakee relevantit tekstikatkelmat ja vastaa niihin nojaten — vastaus on aina groundattu oikeisiin lähteisiin, ja linkit alkuperäisiin kohtiin ovat mukana jatkotutkimusta varten.
- Interaktiiviset raportit. Suodattimet, aikasarjat, porautuminen yhdestä näkymästä toiseen — ei enää kokoelma PDF:iä tai HTML-tiedostoja joita joku tuottaa kuukausittain.
- Samat käyttöoikeudet, riippumatta työkalusta. Kirjautuneena omalla Entra ID -tunnuksella käyttäjä näkee vain ne tiedot joita kuuluu nähdä, olipa kyse raportista, vapaasta kyselystä tai dokumenttihausta.
Arkkitehtuurin kannalta
- BFF-arkkitehtuuri sisäisellä ingressillä. Backend-API ei ole koskaan tavoitettavissa julkisesta verkosta. Vain frontin server-kerros voi kutsua sitä sisäverkossa. Tunnistuksen kiertäminen on mahdotonta arkkitehtuurin tasolla — ei riippuvainen siitä että joku muistaa laittaa lukon päälle.
- Easy Auth reunatasolla. Entra ID -kirjautuminen hoidetaan Azure Container Apps -tasolla ennen kuin pyyntö päätyy sovelluksen koodiin. B2B-vieraat tunnistetaan natiivisti — ei SAML-konfiguraatiota sovelluksen puolella. Sisäiset työntekijät kirjautuvat saumattomasti, vieraat saavat oman hyväksymiskulkunsa kerran, jälkeenpäin SSO.
- Row-level security kyselytasolla. Jokainen SQL-kysely rajataan käyttäjän sallittuihin resursseihin automaattisesti backendin yhdessä kohdassa — ei raporttikohtaista “muista lisätä WHERE”-tarkistusta, jota voi unohtaa. Sama sääntö koskee myös LLM:n generoimia kyselyjä: käyttäjä ei voi pyytää dataa johon hänellä ei ole oikeutta.
- LLM groundattuna oikeaan dataan, ei muistiin. Sekä datakyselyominaisuus että dokumenttihaku rakentuvat tiukasti sille periaatteelle että LLM ei kerro vastauksia — se hakee vastaukset ja esittää ne. Väärä luku tai olematon lause ei mahdu vastaukseen koska se ei löydy lähteestä.
- EU Data Zone alueellinen pakko. Kaikki Azure OpenAI / AI Search -resurssit on pinnattu Sveden ja Länsi-/Pohjois-Euroopan alueisiin ja DataZoneStandard-SKU:hun. Terraform-validaattori hylkää apply-ajon jos globaali alue yritettäisiin erehdyksessä konfiguroida.
- Dynaamiset raportit, ei HTML-artefakteja. Uusi raportti = yksi SQL-näkymä + yksi React-komponentti + yksi rivi raporttirekisteriin. Ei build-aikaisia generointiskriptejä, ei sata erillistä HTML-tiedostoa. Interaktiivinen suodatus ja porautuminen on oletus, ei jälkikäteisprojekti.
- Audit-loki kaikesta liiketoimintakriittisestä toiminnasta. Kuka kysyi mitä, milloin, ja minkä käyttäjän oikeuksilla (impersonaatio mukaan lukien) — tallennetaan immutabiliin lokiin jonka voi tarvittaessa tuottaa viranomaisselvityksessä. Kattaa raportit, vapaat datakyselyt ja dokumenttihaut.
Lopputulos
Asiakas sai oman brändimukaisen portaalin, joka:
- Madalsi radikaalisti tiedonsaannin kynnystä. Aiemmin “pitää osata SQL:ää tai pyytää asiantuntijalta” → nyt “kysy omalla kielelläsi ja saat vastauksen”. Sama koskee dokumenttipinoa: ennen “tarvitset henkilön joka muistaa missä asia on kirjattu”, nyt “kysy ja katso viittaus”.
- Korvasi maksullisen BI-tuotteen asiakkaan ja kumppaniorganisaatioiden käyttäjille — käyttäjämäärä ei enää aja lisenssikustannusta.
- Yhdisti aiemmin hajallaan olleet HTML-raportit yhdeksi interaktiiviseksi palveluksi, josta suodatus, aikasarjat ja porautuminen onnistuvat ilman että joku ylläpitää erillistä skriptikokoelmaa.
- Kunnioitti käyttöoikeuksia automaattisesti kaikissa kanavissa — raporteissa, datakyselyissä ja dokumenttihaussa.
- Täyttää EU-residenssivaatimukset sisäänrakennetusti — compliance on arkkitehtuurin ominaisuus, ei erillinen tarkistuslista.
Projektissa yhdistyi strategiataso (teknologiavalinnat, kustannusmallin muutos, käyttökokemuksen radikaali parannus), tekninen arkkitehtuuri (BFF, RLS, RAG, NL-to-SQL, EU Data Zone -pakotus, OpenAPI-codegen) ja tuotteistusajattelu (per-deployment multi-tenancy, jotta alusta on siirrettävissä samankaltaisille organisaatioille).