Mimari (Vibe Coder Rehberi)

Nasıl çalıştığını anlamak isteyen geliştiriciler için RAG pipeline'ına derinlemesine bakış.

RAG Pipeline Genel Bakış

LaunchChat, belgelerinize dayalı soruları yanıtlamak için Retrieval Augmented Generation (RAG) kullanır.

1. Alım

Ayrıştır → Parçala → Gömme → Depola

2. Getirme

Sorgu → Vektör Arama → Sıralama

3. Üretim

Bağlam → LLM → Yanıt + Kaynaklar

Alım Pipeline'ı

1. Ayrıştırma

İçerik çeşitli kaynaklardan düz metne ayrıştırılır:

  • Notion: Hiyerarşiyi koruyan blok blok ayrıştırma
  • DOCX: mammoth.js ile çıkarılır
  • Markdown: remark/unified ile ayrıştırılır
  • Website: Web Sitesi: Taranır ve navigasyon/altbilgi temizlenir

2. Parçalama

Metin, optimal getirme için örtüşen parçalara bölünür:

{
  targetSize: 400,    // tokens per chunk
  overlap: 50,        // token overlap between chunks
  preserveHeadings: true,  // keep heading context
  minChunkSize: 100   // minimum viable chunk
}

Her parça, bağlam için üst başlık hiyerarşisini korur.

3. Gömme

Parçalar 1536 boyutlu vektörlere dönüştürülür:

Model: text-embedding-3-small
Dimensions: 1536
Provider: OpenAI (via OpenRouter)

4. Depolama

Vektörler pgvector uzantısıyla PostgreSQL'de depolanır:

-- content_chunks table
id: uuid
knowledge_base_id: uuid
page_id: string
page_title: string
content: text
embedding: vector(1536)
parent_heading: string

Getirme Stratejisi

Hibrit Arama

İki aşamalı bir getirme süreci kullanıyoruz:

  1. Vector Search: Vektör Arama: pgvector'ün <=> operatörünü kullanan kosinüs benzerliği
  2. Keyword Fallback: Anahtar Kelime Yedekleme: Vektör sonuçları düşük benzerliğe sahipse anahtar kelime eşleşmeli parçalar eklenir

Benzerlik Puanlama

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

Yanıt Üretimi

Güven Puanlama

Üretmeden önce bir güven puanı hesaplıyoruz:

confidence = bestSimilarity + (hasMultipleChunks ? 0.1 : 0) + 0.2
// Capped at 1.0

if (confidence < threshold) {
  return refusalMessage;  // Don't hallucinate
}

Kaynak Çıkarma

LLM'e [Source N] formatını kullanması talimatı verilir. Bunları ayrıştırıp orijinal sayfalara bağlarız:

// 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])

Dokümantasyon En İyi Uygulamaları

Belgelerinizi optimal AI getirmesi için yapılandırın:

Yapın

  • Açık, tanımlayıcı başlıklar kullanın
  • Bölümleri tek bir konuya odaklı tutun
  • Örnekler ve kod parçacıkları ekleyin
  • Terimleri ve kısaltmaları tanımlayın
  • Özellikler değiştiğinde belgeleri güncelleyin

Kaçının

  • Yapısız çok uzun sayfalar
  • Sayfalar arasında yinelenen içerik
  • Güncel olmayan veya çelişkili bilgiler
  • Alt metin olmadan yoğun görsel kullanımı
  • Yalnızca navigasyon içeren sayfalar

AI İstem Şablonu

LaunchChat entegrasyonuna yardımcı olmak için bu istemi Cursor, Windsurf veya Claude Code'a kopyalayın:

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.