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: stringHämtningsstrategi
Hybridsökning
Vi använder en tvåstegs hämtningsprocess:
- Vector Search: Vektorsökning: Kosinuslikhet med pgvectors <=>-operator
- 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 5Svarsgenerering
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.