Архітектура (Посібник для Vibe-кодерів)

Глибоке занурення в RAG-пайплайн для розробників, які хочуть зрозуміти, як це працює.

Огляд RAG Pipeline

LaunchChat використовує RAG (Retrieval Augmented Generation) для відповідей на питання на основі вашої документації.

1. Завантаження

Парсинг → Розбиття → Вбудовування → Збереження

2. Пошук

Запит → Векторний пошук → Ранжування

3. Генерація

Контекст → LLM → Відповідь + Цитати

Пайплайн завантаження

1. Парсинг

Контент парситься з різних джерел у звичайний текст:

  • Notion: Поблоковий парсинг зі збереженням ієрархії
  • DOCX: Витягнуто через mammoth.js
  • Markdown: Розпарсено за допомогою remark/unified
  • Website: Сайт: Просканований та очищений від навігації/футера

2. Розбиття на фрагменти

Текст розбивається на фрагменти з перекриттям для оптимального пошуку:

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

Кожен фрагмент зберігає ієрархію батьківських заголовків для контексту.

3. Вбудовування

Фрагменти перетворюються на 1536-вимірні вектори:

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

4. Збереження

Вектори зберігаються в PostgreSQL з розширенням pgvector:

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

Стратегія пошуку

Гібридний пошук

Ми використовуємо двоетапний процес пошуку:

  1. Vector Search: Векторний пошук: Косинусна подібність з використанням оператора <=> pgvector
  2. Keyword Fallback: Ключове слово як запасний варіант: Якщо векторні результати мають низьку подібність, ми додаємо фрагменти, знайдені за ключовими словами

Оцінка подібності

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

Генерація відповіді

Оцінка впевненості

Перед генерацією ми обчислюємо оцінку впевненості:

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

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

Витягнення цитат

LLM отримує інструкцію використовувати формат [Source N]. Ми парсимо їх та пов'язуємо з оригінальними сторінками:

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

Найкращі практики документації

Структуруйте документи для оптимального AI-пошуку:

Рекомендовано

  • Використовуйте чіткі, описові заголовки
  • Тримайте розділи зосередженими на одній темі
  • Включайте приклади та фрагменти коду
  • Визначайте терміни та абревіатури
  • Оновлюйте документи при зміні функцій

Уникайте

  • Дуже довгих сторінок без структури
  • Дублювання контенту на різних сторінках
  • Застарілої або суперечливої інформації
  • Надмірного використання зображень без alt-тексту
  • Сторінок лише з навігацією

Шаблон AI-промпту

Скопіюйте цей промпт у Cursor, Windsurf або Claude Code для допомоги з інтеграцією 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.