AI-помощник по корпоративной базе знаний: технический разбор архитектуры
Как технически устроен корпоративный AI-помощник по документам: от парсинга до ответа со ссылками. Реальный stack AGmind и компромиссы при выборе компонентов.
Корпоративный AI-помощник по базе знаний — это не одна модель, а архитектура из 8-10 компонентов, каждый из которых отвечает за свою задачу. Когда говорят “AI-чат по документам”, обычно имеют в виду RAG-систему (Retrieval-Augmented Generation), но за этим стоит конкретный стек технических решений с компромиссами на каждом шаге.
Этот текст — про реальную архитектуру, которую мы используем в AGmind. Без маркетинговых упрощений, с разбором почему выбраны именно эти компоненты и где можно было бы пойти иначе.
Высокоуровневая архитектура
┌─────────────────────────────────────────────────────────────┐
│ Пользовательский слой (Dify / Telegram-бот / API) │
└──────────────────────┬──────────────────────────────────────┘
│
┌──────────────────────▼──────────────────────────────────────┐
│ Оркестратор (Dify Workflow / агент) │
│ - роутинг запроса │
│ - composition промпта │
│ - постобработка ответа │
└──────────────────────┬──────────────────────────────────────┘
│
┌──────────────┴──────────────────┐
│ │
┌───────▼────────┐ ┌────────▼─────────┐
│ Retrieval │ │ LLM │
│ - Эмбеддер │ │ - vLLM сервис │
│ - Векторная БД │ │ - Llama 70B / │
│ - Реранкер │ │ Qwen 32B / etc │
│ - BM25 search │ └──────────────────┘
└───────┬────────┘
│
┌───────▼────────┐
│ Document Layer │
│ - Парсер PDF │
│ - OCR (если │
│ нужно) │
│ - Chunker │
│ - Vision LLM │
│ для картинок │
└────────────────┘
Каждый блок — отдельный сервис в контейнере. Все стыкуются через стандартные API (HTTP, gRPC).
Слой 1: парсинг документов
Задача: превратить PDF/DOCX/PPTX/XLSX в структурированный markdown с сохранением иерархии (заголовки, таблицы, списки) и описаниями картинок.
Используем:
- Docling (IBM, GPU-accelerated) — основной парсер для текстовых PDF. Быстрый (1-3 секунды на страницу), хорошо держит таблицы, выдаёт чистый markdown
- RAGFlow (специализированный) — для сложных документов: сканированные PDF, документы с картинками, отчёты с многоколоночной вёрсткой
- Unstructured.io — fallback для DOCX/PPTX/XLSX/HTML
Вышли альтернативы которые рассмотрели и отвергли:
- PyPDF2 / pdfplumber — слишком слабый, теряет таблицы и форматирование
- GROBID — академическая ориентация, плохо на бизнес-документах
- Azure Document Intelligence / Yandex AI — облачные, не подходят для self-hosted
OCR (для отсканированных PDF):
- Cascade-OCR через RAGFlow — поддерживает Latin/Cyrillic/Chinese
- EasyOCR — fallback для ультра-плохих сканов
Качество OCR определяет всё дальше. Если в OCR попало «г.0рловка» вместо «г. Горловка», AI это запомнит как факт.
Слой 2: vision LLM для картинок и схем
Задача: превратить картинки и диаграммы внутри документов в текстовое описание, чтобы они попали в RAG-индекс.
Используем:
- Gemma 4 vision-instruct для русских документов
- Qwen-VL для смешанных языковых случаев
Pipeline:
- Парсер выделяет картинки из документа
- Каждая картинка отправляется в vision LLM с промптом «опиши что на изображении подробно»
- Описание встраивается в markdown на месте картинки
- Дальше как обычный текст — чанкируется, эмбеддится, индексируется
Когда нужно: документация со схемами, презентации, инженерные чертежи, инфографика. Без vision-LLM эти документы становятся бесполезными для AI.
Слой 3: чанкинг
Задача: нарезать документы на куски такого размера, чтобы каждый помещался в LLM-контекст вместе с запросом и ответом, при этом не разрывая логические единицы.
Используем три типа чанкинга:
- Recursive character chunking (стандартный) — режет по параграфам с overlap’ом 200 токенов. Подходит для прозы, регламентов, методичек.
- Title hierarchy chunking (5-уровневая иерархия) — для документов с чёткой структурой (главы → разделы → пункты). Сохраняет parent context в каждом чанке.
- Token chunker для атомарных таблиц — таблицы не режутся пополам, идут целиком как один чанк (если помещаются) или с обязательным сохранением header’а в каждой части.
Параметры:
- Размер чанка: 500-1500 токенов (sweet spot для bge-m3)
- Overlap: 100-200 токенов
- Минимальный чанк: 100 токенов (мелкие куски склеиваются с соседними)
Слой 4: эмбеддинг
Задача: превратить каждый чанк в вектор фиксированной размерности (1024) для семантического поиска.
Используем:
- deepvk/USER-bge-m3 — для русских корпоративных документов (default)
- BAAI/bge-m3 — для мультиязычных документов
Подробное сравнение моделей — в статье про эмбеддеры.
Inference:
- Через vLLM (single GPU, batch processing 64-128 параллельных)
- Скорость: ~2000 чанков в минуту на DGX Spark
- Память: 2.3 GB VRAM
Слой 5: векторная база
Задача: хранить эмбеддинги и быстро искать топ-N похожих по запросу.
Используем Weaviate по причинам:
- Hybrid search (vector + BM25) встроен из коробки
- Поддерживает 100M+ векторов на одной ноде
- Хорошие операционные характеристики (горячая перезагрузка, snapshots, replication)
- Open-source с активной комьюнити
Альтернативы которые рассматривали:
- Qdrant — быстрее в чистом vector search, но без встроенного BM25 hybrid. Подходит для real-time use-case’ов
- Milvus — для очень больших масштабов (1B+ векторов). Overkill для большинства корпоративных кейсов
- pgvector (PostgreSQL extension) — для случаев когда уже есть Postgres и не хочется отдельного сервиса. Производительность ниже специализированных
- Chroma — для прототипов и небольших баз (<1M векторов)
Слой 6: реранкер
Задача: из топ-20 кандидатов после векторного поиска выбрать топ-3-5 самых точных для отправки в LLM.
Используем BAAI/bge-reranker-v2-m3:
- Специальная архитектура (cross-encoder), сравнивает пары «запрос-чанк» точнее чем bi-encoder эмбеддер
- Работает на тот же mulitlingual датасет, поддерживает русский
- Скорость: ~50 пар в секунду на одном GPU
Без реранкера качество финального ответа падает на 10-20% — эмбеддеры приближённы, реранкер делает финальную сортировку.
Слой 7: hybrid search
Задача: объединить семантический (vector) поиск с классическим текстовым (BM25) для лучшего recall на запросах с конкретными именами/числами/кодами.
В Weaviate:
search(
query="штрафы за просрочку поставки в договоре №432",
alpha=0.7, # 70% веса векторам, 30% BM25
limit=20
)
Vector часть находит семантически похожие чанки даже без точных слов. BM25 часть гарантирует что чанки с конкретным «договор №432» попадут в результат.
Hybrid search даёт +5-10% recall на сложных запросах.
Слой 8: LLM-сервис
Задача: генерировать финальный ответ на основе предоставленного контекста (топ-5 чанков от реранкера).
Используем vLLM:
- Модель: Llama 3.3 70B (или Qwen 3, или Gemma 4 26B в зависимости от железа)
- Контекст: до 128K токенов (помещаются 5-10 чанков плюс запрос + history)
- Концепция: PagedAttention для эффективной памяти, continuous batching для пропускной способности
- Скорость: 23-50 токенов/сек на одиночный запрос, до 400 toks/sec при concurrency
Промпт:
Ты корпоративный ассистент. Отвечай только на основе предоставленных документов.
Если ответа в документах нет — говори "не знаю".
В каждом утверждении указывай источник в формате [doc_name, страница X].
Документы:
[Чанк 1: ...]
[Чанк 2: ...]
...
Вопрос пользователя: ...
Ответ:
Слой 9: оркестратор
Задача: управлять flow обработки запроса — что в каком порядке делать, какие модели использовать, как форматировать ответ.
Используем Dify:
- Drag-n-drop workflow builder
- Готовые блоки для retrieval, генерации, postprocessing
- Поддержка multi-step рассуждений и агентов
- Web-интерфейс для пользователей и API для интеграций
Альтернативы:
- LangChain / LlamaIndex — программное управление, более гибко но требует кода
- n8n — workflow automation общего назначения, можно использовать но менее специализирован под AI
Слой 10: пользовательский слой
Задача: дать пользователям удобный интерфейс.
Каналы доступа:
- Dify web-чат — основной для desktop-пользователей
- Telegram-бот — для мобильного доступа и быстрых вопросов
- API — для интеграции в существующие системы (CRM, корп. портал)
- Slack/Mattermost integration — если используется в команде
Все каналы используют тот же бэкенд, разница только в интерфейсе.
Производительность на реальной нагрузке
Замеры на DGX Spark с базой из 50K документов (200K чанков):
- Поиск (retrieval + rerank): 280-450 мс
- Генерация ответа (top-5 контекст, 500 токенов output): 12-18 секунд
- Полный round-trip: 12-19 секунд от запроса до окончательного ответа
- Concurrency: 30-45 параллельных запросов без деградации
Для большинства корпоративных кейсов это нормально. Если нужно быстрее (real-time голос) — больше железа или более лёгкие модели.
Безопасность и compliance
Изоляция: весь стек работает в изолированной сети, без выхода в интернет (кроме опционального обновления моделей).
Аудит-логи: каждый запрос и ответ записываются с временной меткой, user ID, источниками контекста. Нужно для compliance в финансах/медицине/госзаказах.
Доступы: интеграция с корп. SSO (Active Directory / Keycloak), RBAC на уровне коллекций документов (юристы видят свою базу, HR — свою).
Что дальше — направления развития
- Multi-modal: добавление обработки голоса (транскрипция звонков, поиск по аудио-записям совещаний)
- Tool-using agents: AI способный делать действия (отправить email, создать задачу в CRM, вызвать API)
- Long-term memory: персональная память по каждому пользователю, накапливаемая между сессиями
- Continuous fine-tuning: автоматическое улучшение модели на основе пользовательских отметок «хорошо/плохо»
Все эти направления — следующая волна для корпоративных AI после того как базовый RAG-помощник стабильно работает.
Итог
Корпоративный AI-помощник — это не одна модель и не «плагин». Это полноценная микросервисная архитектура из 10 слоёв, каждый из которых требует осмысленного выбора компонентов. AGmind — наш конкретный взвешенный выбор для русского B2B на 2026 год.
Если хочется обсудить архитектуру под вашу специфику — пилот за 2-3 недели включает архитектурный аудит и proof-of-concept. От 100 000 ₽.
Для понимания того, как техническая архитектура соотносится с executive-уровнем корпоративного ИИ-помощника — читайте executive-уровень корпоративного ИИ-помощника.
Технические детали реального deploy — в статье про DGX Spark setup на Habr. Про эмбеддеры — отдельно. Про RAG в общем — explainer.