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: string

Strategie vyhledávání

Hybridní vyhledávání

Používáme dvoustupňový proces vyhledávání:

  1. Vector Search: Vektorové vyhledávání: Kosinová podobnost pomocí operátoru <=> pgvector
  2. 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 5

Generová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.