Архітектура (Посібник для 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Стратегія пошуку
Гібридний пошук
Ми використовуємо двоетапний процес пошуку:
- Vector Search: Векторний пошук: Косинусна подібність з використанням оператора <=> pgvector
- 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.