Hem

Om Chatbotten

Chatbotten är en AI-baserad assistent som hjälper dig att navigera och söka i Smart Built Toolbox.

Funktioner

  • Intelligent sökning - Chatbotten kan söka igenom projektdatabasen och hitta relevant information baserat på dina frågor.
  • Naturligt språk - Du kan ställa frågor på svenska eller engelska i naturligt språk.
  • Kontextmedveten - Chatbotten förstår sammanhanget i din fråga och kan ge relevanta svar.

Hur använder jag chatbotten?

  1. Klicka på chatbubble-ikonen i nedre högra hörnet
  2. Skriv din fråga i textfältet
  3. Tryck på Enter eller klicka på skicka-knappen
  4. Vänta på svar från chatbotten

Chattsidan och sparade chattar

Chatten finns också som en egen sida på /chat. Öppna den med knappen uppe i chattfönstret eller från användarmenyn.

  • Sparade chattar - Till vänster finns dina tidigare chattar, sorterade efter när de senast användes. Klicka på en för att fortsätta den, eller starta en ny med Ny chatt.
  • Rubriker - En ny chatt får en kort rubrik av AI strax efter den första frågan.
  • Byt namn och ta bort - Varje chatt har en meny med Byt namn och Ta bort. Längst ner i listan finns Ta bort alla chattar.
  • Bredare lista - Dra i listans högra kant för att göra den bredare eller smalare. Dubbelklicka på kanten för att återställa.
  • Var chattarna sparas - Är du inloggad sparas de på ditt konto och följer med mellan webbläsare och enheter. Är du inte inloggad sparas de bara i webbläsaren du använder.
  • Flytta chattar till kontot - Har du chattat i webbläsaren innan du loggade in frågar chattsidan om chattarna ska flyttas till ditt konto. Väljer du Inte nu ligger de kvar i webbläsaren och du får inte frågan igen för de chattarna.
  • När du loggar ut - Det du har lämnat efter dig av chattarna i webbläsaren tas bort.
  • Vem som ser dem - Sparade chattar visas bara för dig. Andra användare och administratörer i verktygslådan kan inte öppna dem. Tas ditt konto bort ur verktygslådan tas dina chattar där också bort.
  • Vad som sparas - Texten i dina frågor och i svaren.
  • Chattfönstret i hörnet - Det du frågar där sparas som en chatt på samma sätt och syns i listan på chattsidan. Fönstret fortsätter på samma chatt tills du startar en ny med knappen Ny chatt. Knappen bredvid öppnar chatten på chattsidan.

Tips för bästa resultat

  • Var specifik i dina frågor
  • Använd relevanta nyckelord
  • Om du inte får det svar du förväntar dig, försök omformulera din fråga

Begränsningar

Chatbotten kan hjälpa dig med information som finns i systemet, men har begränsningar:

  • Den kan inte utföra ändringar i databasen
  • Den kan inte ge råd utanför sitt kunskapsområde
  • Svaren baseras på tillgänglig data i systemet

Teknisk Arkitektur

Här beskriver vi hur chatbotten faktiskt fungerar under huven. Den bygger på en RAG-arkitektur (Retrieval-Augmented Generation).

1. Datainsamling

Vi hämtar information från flera källor automatiskt:

  • Webbsidor: Vi skrapar HTML-sidor och plockar ut texten (tar bort scripts, CSS och taggar). PDF-länkar på sidorna hittas automatiskt.
  • PDF:er: Vi försöker först läsa texten direkt. Om det är en skannad PDF utan text läser vi den med OCR (Mistral).

All text sparas på projektnoden i Neo4j (websiteText, pdfText).

2. Chunking och Embedding

Texten delas upp i mindre bitar (chunks) med lite överlapp så att sammanhanget bevaras:

  • Chunk-storlek: 2000 tecken
  • Överlapp: 200 tecken

Varje chunk görs om till en vektor (en lista med 3072 tal) med en embedding-modell. Matematiskt:

E:T→R3072E: T \rightarrow \mathbb{R}^{3072}

där TT är texten och resultatet är en 3072-dimensionell vektor. Dessa vektorer sparas i PostgreSQL med pgvector.

3. Sökning

När en användare skickar ett meddelande i chatten görs frågan också om till en vektor vq=E(q)\mathbf{v}_q = E(q). Sen hittar vi liknande dokument genom att räkna ut avståndet mellan vektorerna (L2-distans):

d(vq,vd)=∣∣vq−vd∣∣2=∑i=13072(vq,i−vd,i)2d(\mathbf{v}_q, \mathbf{v}_d) = ||\mathbf{v}_q - \mathbf{v}_d||_2 = \sqrt{\sum_{i=1}^{3072} (v_{q,i} - v_{d,i})^2}

Vi filtrerar bort resultat med avstånd över 1.2 och tar max 3 chunks per projekt för att få en bra mix.

4. Kontext till AI:n

De bästa matchningarna skickas med som kontext i prompten till AI-modellen. På så sätt kan den svara baserat på riktig projektdata istället för att gissa.

5. Tool Calling

AI-modellen kan också anropa verktyg för att hämta mer data:

VerktygVad den gör
searchProjectsSöker projekt med vektorsökning
searchNodesTextsökning via Meilisearch (projekt, organisationer, personer etc.)
getNodeDetailsHämtar detaljer och relationer från Neo4j
getCurrentViewNodesHämtar info om noderna användaren tittar på just nu

6. Svar

Till slut sätter AI-modellen ihop ett svar baserat på:

  1. Användarens fråga
  2. Matchade chunks från vektorsökningen
  3. Data från tool calls
  4. Tidigare meddelanden i konversationen

Svaret streamas tillbaka med markdown-formatering och länkar till projekten. När modellen hänvisar till en källa i sökresultaten blir hänvisningen en länk till projektet, inom parentes efter meningen.

Vart länkarna leder väljer administratören under Inställningar, AI-assistent: till noden i grafen, eller till nodens egen webbsida. Med webbsidor nämns en nod som saknar webbsida utan länk.

Systemdiagram

┌─────────────────────────────────────────────────────────────────┐
│                    INDEXERINGSFLÖDE (Batch)                     │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  ┌─────────────┐     ┌──────────────┐     ┌─────────────────┐  │
│  │  Webbsidor  │────▶│   Chunking   │────▶│   Embedding     │  │
│  │  PDF-filer  │     │  2000 tecken │     │   Embedding     │  │
│  │  (Mistral OCR)    │  200 overlap │     │   (3072-dim)    │  │
│  └─────────────┘     └──────────────┘     └────────┬────────┘  │
│                                                     │          │
│                                                     ▼          │
│                                            ┌─────────────────┐ │
│                                            │    pgvector     │ │
│                                            │   (PostgreSQL)  │ │
│                                            └─────────────────┘ │
└─────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────┐
│                     FRÅGEFLÖDE (Runtime)                        │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  ┌─────────────┐     ┌──────────────┐     ┌─────────────────┐  │
│  │ Användar-   │────▶│   Embedding  │────▶│  L2-distans     │  │
│  │ fråga (q)   │     │   Embedding  │     │  sökning        │  │
│  └─────────────┘     └──────────────┘     └────────┬────────┘  │
│                                                     │          │
│                      ┌──────────────┐               │          │
│                      │ Tool Calling │◀──────────────┤          │
│                      │ - searchNodes│               │          │
│                      │ - getDetails │               │          │
│                      └──────┬───────┘               │          │
│                             │                       ▼          │
│                             │              ┌─────────────────┐ │
│                             └─────────────▶│   AI-modell     │ │
│                                            │ + Streaming     │ │
│                                            └────────┬────────┘ │
│                                                     │          │
│                                                     ▼          │
│                                            ┌─────────────────┐ │
│                                            │  Formaterat     │ │
│                                            │  Markdown-svar  │ │
│                                            └─────────────────┘ │
└─────────────────────────────────────────────────────────────────┘