Architektura (przewodnik dla Vibe Coderów)
Szczegółowy opis pipeline'u RAG dla deweloperów, którzy chcą zrozumieć, jak to działa.
Przegląd pipeline'u RAG
LaunchChat wykorzystuje Retrieval Augmented Generation (RAG) do odpowiadania na pytania na podstawie dokumentacji.
1. Pozyskiwanie
Parsowanie → Chunkowanie → Embedding → Zapis
2. Wyszukiwanie
Zapytanie → Wyszukiwanie wektorowe → Ranking
3. Generowanie
Kontekst → LLM → Odpowiedź + Cytaty
Pipeline pozyskiwania
1. Parsowanie
Treść jest parsowana z różnych źródeł do zwykłego tekstu:
- Notion: Parsowanie blok po bloku z zachowaniem hierarchii
- DOCX: Ekstrakcja przez mammoth.js
- Markdown: Parsowanie przez remark/unified
- Website: Strona: Skanowanie i oczyszczanie z nawigacji/stopki
2. Chunkowanie
Tekst jest dzielony na nakładające się chunki dla optymalnego wyszukiwania:
{
targetSize: 400, // tokens per chunk
overlap: 50, // token overlap between chunks
preserveHeadings: true, // keep heading context
minChunkSize: 100 // minimum viable chunk
}Każdy chunk zachowuje hierarchię nadrzędnych nagłówków dla kontekstu.
3. Embedding
Chunki są konwertowane na 1536-wymiarowe wektory:
Model: text-embedding-3-small
Dimensions: 1536
Provider: OpenAI (via OpenRouter)4. Przechowywanie
Wektory są przechowywane w PostgreSQL z rozszerzeniem pgvector:
-- content_chunks table
id: uuid
knowledge_base_id: uuid
page_id: string
page_title: string
content: text
embedding: vector(1536)
parent_heading: stringStrategia wyszukiwania
Wyszukiwanie hybrydowe
Stosujemy dwuetapowy proces wyszukiwania:
- Vector Search: Wyszukiwanie wektorowe: Podobieństwo cosinusowe z operatorem <=> pgvector
- Keyword Fallback: Fallback słów kluczowych: Jeśli wyniki wektorowe mają niskie podobieństwo, dodajemy chunki dopasowane słowami kluczowymi
Ocena podobieństwa
-- Vector similarity query
SELECT *, 1 - (embedding <=> query_embedding) as similarity
FROM content_chunks
WHERE knowledge_base_id = $1
ORDER BY embedding <=> query_embedding
LIMIT 5Generowanie odpowiedzi
Ocena pewności
Przed wygenerowaniem obliczamy wynik pewności:
confidence = bestSimilarity + (hasMultipleChunks ? 0.1 : 0) + 0.2
// Capped at 1.0
if (confidence < threshold) {
return refusalMessage; // Don't hallucinate
}Ekstrakcja cytatów
LLM jest instruowany, aby używać formatu [Source N]. Parsujemy je i łączymy z oryginalnymi stronami:
// 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])Najlepsze praktyki dokumentacji
Strukturyzuj dokumentację dla optymalnego wyszukiwania AI:
Zalecane
- Używaj jasnych, opisowych nagłówków
- Utrzymuj sekcje skupione na jednym temacie
- Dołączaj przykłady i fragmenty kodu
- Definiuj terminy i akronimy
- Aktualizuj dokumentację, gdy zmieniają się funkcje
Unikaj
- Bardzo długich stron bez struktury
- Duplikowania treści na wielu stronach
- Nieaktualnych lub sprzecznych informacji
- Nadmiernego użycia obrazów bez tekstu alternatywnego
- Stron zawierających tylko nawigację
Szablon promptu AI
Skopiuj ten prompt do Cursor, Windsurf lub Claude Code, aby pomóc w integracji LaunchChat:
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.