Architektura (Průvodce pro Vibe kodéry)
Hluboký ponor do RAG pipeline pro vývojáře, kteří chtějí pochopit, jak to funguje.
Přehled RAG Pipeline
LaunchChat používá RAG (Retrieval Augmented Generation) k zodpovídání otázek na základě vaší dokumentace.
1. Příjem dat
Parsování → Rozdělení → Vložení → Uložení
2. Vyhledávání
Dotaz → Vektorové vyhledávání → Řazení
3. Generování
Kontext → LLM → Odpověď + Citace
Pipeline příjmu dat
1. Parsování
Obsah je parsován z různých zdrojů do prostého textu:
- Notion: Parsování blok po bloku se zachováním hierarchie
- DOCX: Extrahováno přes mammoth.js
- Markdown: Parsováno pomocí remark/unified
- Website: Web: Procházen a očištěn od navigace/patičky
2. Rozdělení na fragmenty
Text je rozdělen na překrývající se fragmenty pro optimální vyhledávání:
{
targetSize: 400, // tokens per chunk
overlap: 50, // token overlap between chunks
preserveHeadings: true, // keep heading context
minChunkSize: 100 // minimum viable chunk
}Každý fragment zachovává hierarchii nadřazených nadpisů pro kontext.
3. Vkládání
Fragmenty jsou převedeny na 1536-dimenzionální vektory:
Model: text-embedding-3-small
Dimensions: 1536
Provider: OpenAI (via OpenRouter)4. Ukládání
Vektory jsou uloženy v PostgreSQL s rozšířením pgvector:
-- content_chunks table
id: uuid
knowledge_base_id: uuid
page_id: string
page_title: string
content: text
embedding: vector(1536)
parent_heading: stringStrategie vyhledávání
Hybridní vyhledávání
Používáme dvoustupňový proces vyhledávání:
- Vector Search: Vektorové vyhledávání: Kosinová podobnost pomocí operátoru <=> pgvector
- Keyword Fallback: Záložní klíčová slova: Pokud mají vektorové výsledky nízkou podobnost, přidáme fragmenty odpovídající klíčovým slovům
Hodnocení podobnosti
-- Vector similarity query
SELECT *, 1 - (embedding <=> query_embedding) as similarity
FROM content_chunks
WHERE knowledge_base_id = $1
ORDER BY embedding <=> query_embedding
LIMIT 5Generování odpovědi
Hodnocení spolehlivosti
Před generováním vypočítáme skóre spolehlivosti:
confidence = bestSimilarity + (hasMultipleChunks ? 0.1 : 0) + 0.2
// Capped at 1.0
if (confidence < threshold) {
return refusalMessage; // Don't hallucinate
}Extrakce citací
LLM je instruován používat formát [Source N]. Tyto citace parsujeme a propojujeme s původními stránkami:
// 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])Osvědčené postupy pro dokumentaci
Strukturujte dokumenty pro optimální AI vyhledávání:
Doporučeno
- Používejte jasné, popisné nadpisy
- Udržujte sekce zaměřené na jedno téma
- Zahrňte příklady a ukázky kódu
- Definujte termíny a zkratky
- Aktualizujte dokumenty při změně funkcí
Vyhněte se
- Velmi dlouhým stránkám bez struktury
- Duplicitnímu obsahu napříč stránkami
- Zastaralým nebo protichůdným informacím
- Nadměrnému používání obrázků bez alt textu
- Stránkám pouze s navigací
Šablona AI promptu
Zkopírujte tento prompt do Cursor, Windsurf nebo Claude Code pro pomoc s integrací 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.