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

Strategia wyszukiwania

Wyszukiwanie hybrydowe

Stosujemy dwuetapowy proces wyszukiwania:

  1. Vector Search: Wyszukiwanie wektorowe: Podobieństwo cosinusowe z operatorem <=> pgvector
  2. 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 5

Generowanie 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.