All Right Brain — тестове завдання

Внутрішня
AI-база знань

Перше питання яке я собі поставив: а навіщо будувати щось складне, якщо більшість проблем вирішує простий RAG за два тижні? Нижче — як я бачу цю систему: від того як знання потрапляють всередину до того хто і як ними користується. Головний принцип — запустити щось реальне швидко, а не проектувати ідеальне роками.

RAG VECTOR SEARCH HYBRID RETRIEVAL MULTI-SOURCE PGVECTOR
Загальна архітектура
Джерела знань — звідки беремо текст
📄
Google Docs
Гайди, процеси, методичні матеріали. Найбільше актуальних знань — стартуємо тут.
🔗
Confluence
Технічна документація, рішення по продукту. Беремо конкретні spaces, не все підряд.
⚙️
GitHub
README, docs/, CHANGELOG. Тільки документація — не вихідний код. Webhook для миттєвого ре-індексу при push.
💬
Slack + Manual Upload
Тільки закріплені повідомлення з важливих каналів. Плюс ручне завантаження PDF/CSV через адмін-панель.
⚠️ Не індексуємо все підряд. Тільки верифіковані папки та сторінки — сміття в базі дає сміття у відповідях. Кожне джерело має відповідального в команді.
↓ ingestion pipeline
Обробка — що відбувається з текстом перед збереженням
01
Connector
Polling кожні 30–60 хв або webhook при зміні. Порівнює last_modified — переіндексує тільки змінені документи.
02
Chunking
Ріжемо на шматки ~512 токенів з overlap 50. Кожен чанк отримує source_url, title, last_updated, author.
03
Embedding
text-embedding-3-small. Перетворює текст на вектор — числовий опис змісту. Дозволяє шукати за сенсом, а не за словами.
↓ store
Сховище
🗄️
pgvector
Векторна база поверх PostgreSQL. Якщо PG вже є в інфрі — не потрібен новий сервіс.
📦
Metadata
Та сама PostgreSQL: source, title, last_updated, owner, tags. Дозволяє фільтрувати по джерелу і даті.
🔍
Full-text index
PG FTS як страховка для точних термінів: назви курсів, коди задач. Вектор їх часто пропускає.
↑↓ query / retrieve
RAG-ядро — як відповідаємо на запити
Query Engine
Запит проходить весь pipeline і повертається відповіддю з посиланнями на джерела
запит → вектор vector search + FTS rerank top-6 LLM (Claude / GPT-4o) відповідь + source URLs
↓ interfaces
Інтерфейси — один мозок, різні "роти"
💬
Slack-бот + Web Chat
Люди вже в Slack — /ask і відповідь прямо в чаті. Web UI для тих хто хоче більше: перегляд джерел, довгі відповіді.
REST API / MCP + Admin
API для AI-агентів і автоматизацій (n8n, Zapier). Admin-панель для управління джерелами і моніторингу якості.
Як знання залишаються актуальними

Це найважливіше питання в будь-якій базі знань. Залити документи один раз — легко. Зробити так щоб вони не протухали — складніше. Мій підхід: автоматичне відстеження змін як основа, мінімум ручної роботи.

🔁 Polling по last_modified
Воркер раз на 30–60 хв запитує: "що змінилось з минулого разу?" Якщо документ не змінювався — пропускаємо. Якщо змінився — переіндексуємо тільки його, не весь корпус. Просто, дешево, надійно на старті.
⚡ Webhooks для миттєвого оновлення
GitHub і Confluence підтримують webhooks: документ змінився → сигнал → миттєвий ре-індекс. Для Google Docs — polling: Google Pub/Sub складніший і не виправданий на старті.
🏷️ Дата документа у відповіді
Кожен чанк зберігає last_updated. LLM отримує цю дату в промпті і може попередити: "цей документ оновлено 7 місяців тому, варто перевірити актуальність." Краще попередити, ніж відповісти застарілим.
🚫 Що свідомо не індексуємо
Весь Slack, черновики, заархівовані сторінки — ні. Сміття в базі = сміття у відповідях. Кожне джерело має відповідального — він підтримує актуальність свого розділу.
Ключові рішення та чому саме так

Кожен вибір — свідомий trade-off. Я вибирав "що можна запустити малою командою за тиждень", а не "що ідеально з архітектурної точки зору".

pgvector vs Qdrant
Беремо pgvector якщо PostgreSQL вже є в інфрі — один сервіс замість двох. Qdrant має сенс якщо корпус виростає за 1M чанків або потрібні розширені фільтри. На старті — pgvector, міграція дешева якщо знадобиться.
OpenAI vs локальна модель
OpenAI — швидше запустити, якість хороша. Але дані виходять назовні. Якщо є вимоги конфіденційності — локальна BGE-M3. Для EdTech з дитячими даними варто це обговорити окремо.
Чому гібридний пошук
Vector search шукає за змістом, але погано знаходить точні терміни: назви курсів, коди задач, скорочення. Full-text знаходить точно але не розуміє синонімів. Hybrid + reranker дає найкращий результат на практиці.
Chunking: 512 токенів
Занадто великі чанки — embedding розмивається, якість падає. Занадто малі — втрачаємо зв'язний сенс. 512 з 50-токенним overlap — перевірений баланс для документної RAG. Потім тестуємо на реальних запитах.
LlamaIndex vs LangChain
Обидва мають готові коннектори. LlamaIndex краще для RAG-задач, LangChain — для складних агентів. Беремо LlamaIndex для MVP. Якщо агентний сценарій стає головним — переглядаємо.
Хто і як користується

Один RAG-pipeline — три різних інтерфейси. Не три системи, а один мозок з різними "ротами".

👩‍💻
Люди через чат
Саппорт питає: "як обробляти скаргу від батька?" — отримує відповідь з посиланням на Confluence. Методист: "вимоги до рівня B2?" — витяг з гайду. Slack-бот на старті, Web UI паралельно.
🤖
AI-агенти
Агент під час задачі звертається до Brain через API і отримує контекст. Наприклад: агент що готує відповідь на email — спершу питає Brain про правила комунікації. REST API або MCP.
Автоматизації
n8n або Zapier питають Brain як частину workflow. Новий тікет у підтримці → Brain знаходить релевантні документи → агент формує чернетку відповіді. Той самий REST API.
Приклад конфігурації коннекторів

Завдання згадує конкретні джерела — тому ось як виглядала б їх конфігурація. Кожне джерело окремий блок: тип, що беремо, як часто синхронізуємо, що виключаємо. Принцип: краще менше джерел але верифікованих, ніж все підряд.

connector-config.yaml
# All Right Brain — конфігурація джерел знань # Принцип: краще менше але верифікованих джерел sources: # Google Docs — стартуємо тут, найбільше актуальних знань - id: "gdocs_knowledge" type: "google_drive" folder_id: "<verified_folder_id>" # тільки верифіковані папки sync_interval_minutes: 30 exclude_labels: ["draft", "wip", "archived"] # Confluence — webhook для миттєвого оновлення при зміні сторінки - id: "confluence_core" type: "confluence" space_keys: ["PROD", "ENG", "SUPPORT"] webhook_enabled: true fallback_poll_minutes: 60 # якщо webhook впав exclude_labels: ["archived", "obsolete"] # GitHub — миттєвий ре-індекс при push, тільки документація - id: "github_docs" type: "github" repos: ["allright/backend", "allright/frontend"] include_paths: ["docs/**", "README.md", "CHANGELOG.md"] sync_on_push: true # webhook → instant re-index # Slack — не весь чат, тільки закріплене. Шум вбиває якість - id: "slack_pinned" type: "slack" channels: ["#announcements", "#decisions", "#eng-notes"] only_pinned: true sync_interval_minutes: 120 # Як ріжемо текст на шматки chunking: chunk_size: 512 # токенів. Баланс між контекстом і якістю embedding chunk_overlap: 50 # щоб думка не обривалась на межі чанку # Пошук: гібрид vector + full-text + reranker retrieval: top_k: 6 hybrid_search: true # vector для сенсу, FTS для точних термінів reranker: "cohere-rerank-3" include_doc_date: true # LLM бачить last_updated → може попередити про старий документ
Поетапність: що зараз, що потім

Я б не намагався запустити все одразу. Мета першого тижня — щоб хоч одна людина в команді отримала корисну відповідь. Далі нарощуємо на основі реального використання, а не гіпотез.

1
Тиждень 1–2
MVP: Google Docs + Confluence → Slack-бот
Два джерела де 80% актуальних знань. LlamaIndex + pgvector + OpenAI embeddings. Slack-бот /ask. Чому Slack-бот? Люди вже там — нульовий поріг входу. Чому не все одразу? Менше рухомих частин — менше де щось піде не так на першому тижні.
2
Тиждень 3–5
Якість + автосинк + GitHub
Reranker (одразу помітне покращення якості відповідей), GitHub-коннектор з webhook, автоматичний ре-індекс при змінах. Web UI для тих хто хоче більше ніж чат. На цьому етапі стає зрозуміло де система відповідає погано — виправляємо на основі реальних запитів, а не гіпотез.
3
Місяць 2+
API для агентів + Slack + Admin Panel
REST/MCP API — Brain стає інструментом для AI-агентів і автоматизацій (n8n). Закріплені Slack-повідомлення. Admin-панель щоб нетехнічні люди могли керувати джерелами. Що свідомо відкладаємо: автодетекція суперечностей між документами, локальна LLM — тільки якщо з'явиться реальна потреба.