Arkitektur (Vibe Coder-guide)

Djupdykning i RAG-pipelinen för utvecklare som vill förstå hur det fungerar.

RAG Pipeline-översikt

LaunchChat använder RAG (Retrieval Augmented Generation) för att besvara frågor baserat på din dokumentation.

1. Inmatning

Parsning → Uppdelning → Inbäddning → Lagring

2. Hämtning

Fråga → Vektorsökning → Rangordning

3. Generering

Kontext → LLM → Svar + Källhänvisningar

Inmatningspipeline

1. Parsning

Innehåll parsas från olika källor till ren text:

  • Notion: Block-för-block-parsning som bevarar hierarki
  • DOCX: Extraherat via mammoth.js
  • Markdown: Parsat med remark/unified
  • Website: Webbplats: Crawlad och rensad från navigering/sidfot

2. Uppdelning

Text delas upp i överlappande delar för optimal hämtning:

{
  targetSize: 400,    // tokens per chunk
  overlap: 50,        // token overlap between chunks
  preserveHeadings: true,  // keep heading context
  minChunkSize: 100   // minimum viable chunk
}

Varje del bevarar sin överordnade rubrikhierarki för kontext.

3. Inbäddning

Delar konverteras till 1536-dimensionella vektorer:

Model: text-embedding-3-small
Dimensions: 1536
Provider: OpenAI (via OpenRouter)

4. Lagring

Vektorer lagras i PostgreSQL med pgvector-tillägget:

-- content_chunks table
id: uuid
knowledge_base_id: uuid
page_id: string
page_title: string
content: text
embedding: vector(1536)
parent_heading: string

Hämtningsstrategi

Hybridsökning

Vi använder en tvåstegs hämtningsprocess:

  1. Vector Search: Vektorsökning: Kosinuslikhet med pgvectors <=>-operator
  2. Keyword Fallback: Nyckelordsfallback: Om vektorresultat har låg likhet lägger vi till nyckelordsmatchade delar

Likhetspoäng

-- Vector similarity query
SELECT *, 1 - (embedding <=> query_embedding) as similarity
FROM content_chunks
WHERE knowledge_base_id = $1
ORDER BY embedding <=> query_embedding
LIMIT 5

Svarsgenerering

Konfidenspoäng

Innan generering beräknar vi en konfidenspoäng:

confidence = bestSimilarity + (hasMultipleChunks ? 0.1 : 0) + 0.2
// Capped at 1.0

if (confidence < threshold) {
  return refusalMessage;  // Don't hallucinate
}

Källhänvisningsextraktion

LLM:en instrueras att använda [Source N]-format. Vi parsar dessa och länkar till originalsidor:

// Extract citations from answer
const citationPattern = /\[Source (\d+)\]/g;
const matches = answer.matchAll(citationPattern);

// Map to original pages
citations = matches.map(m => chunks[m[1] - 1])

Bästa praxis för dokumentation

Strukturera dina dokument för optimal AI-hämtning:

Gör

  • Använd tydliga, beskrivande rubriker
  • Håll sektioner fokuserade på ett ämne
  • Inkludera exempel och kodavsnitt
  • Definiera termer och förkortningar
  • Uppdatera dokument när funktioner ändras

Undvik

  • Mycket långa sidor utan struktur
  • Duplicerat innehåll på olika sidor
  • Föråldrad eller motsägelsefull information
  • Överdriven användning av bilder utan alt-text
  • Sidor med enbart navigering

AI-promptmall

Kopiera denna prompt till Cursor, Windsurf eller Claude Code för att hjälpa till med LaunchChat-integrationen:

I'm integrating LaunchChat, an AI-powered support widget.

Widget Setup:
1. Add to HTML: <script>window.LaunchChatConfig = {widgetId: "ID"}</script>
   <script src="https://domain.com/widget.js" async></script>

2. For React/Next.js, create a client component that:
   - Sets window.LaunchChatConfig
   - Dynamically loads widget.js
   - Cleans up on unmount

API Reference:
- window.LaunchChatWidget.open() - Open chat
- window.LaunchChatWidget.close() - Close chat
- window.LaunchChatWidget.on(event, callback) - Listen to events
- Events: 'open', 'close', 'message', 'escalate', 'feedback'

Help me integrate this into my [FRAMEWORK] app.