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 через адмін-панель.
⚠️
Не індексуємо все підряд. Тільки верифіковані папки та сторінки — сміття в базі дає сміття у відповідях. Кожне джерело має відповідального в команді.
Обробка — що відбувається з текстом перед збереженням
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. Перетворює текст на вектор — числовий опис змісту. Дозволяє шукати за сенсом, а не за словами.
Сховище
🗄️
pgvector
Векторна база поверх PostgreSQL. Якщо PG вже є в інфрі — не потрібен новий сервіс.
📦
Metadata
Та сама PostgreSQL: source, title, last_updated, owner, tags. Дозволяє фільтрувати по джерелу і даті.
🔍
Full-text index
PG FTS як страховка для точних термінів: назви курсів, коди задач. Вектор їх часто пропускає.
RAG-ядро — як відповідаємо на запити
Query Engine
Запит проходить весь pipeline і повертається відповіддю з посиланнями на джерела
запит → вектор
→
vector search + FTS
→
rerank top-6
→
LLM (Claude / GPT-4o)
→
відповідь + source URLs
Інтерфейси — один мозок, різні "роти"
💬
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.
Приклад конфігурації коннекторів
Завдання згадує конкретні джерела — тому ось як виглядала б їх конфігурація.
Кожне джерело окремий блок: тип, що беремо, як часто синхронізуємо, що виключаємо.
Принцип: краще менше джерел але верифікованих, ніж все підряд.
# 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 — тільки якщо з'явиться реальна потреба.