diff --git a/README.md b/README.md index 4821b9c..cb6fc96 100644 --- a/README.md +++ b/README.md @@ -8,16 +8,16 @@ **Архитектура**: платформа состоит из трех основных слоев: -1. **RAG-ядро (HTTP-сервис)** – центральный компонент, выполняющий все этапы обработки запросов: классификацию намерений, расширение запроса, гибридный поиск (dense + sparse) в Qdrant, переранжирование через локальный кросс-энкодер, синтез ответа через GigaChat, самокритику и перегенерацию. Ядро также управляет индексацией документов и хранением истории диалогов в PostgreSQL. RAG-ядро реализовано как отдельный HTTP-сервер (FastAPI + Uvicorn), что позволяет использовать его для любых клиентов (XMPP, Telegram, Mastodon, веб-интерфейс, системы аналитики). +1. **RAG-ядро (HTTP-сервис)** — центральный компонент, выполняющий все этапы обработки запросов: классификацию намерений, расширение запроса, гибридный поиск (dense + sparse) в Qdrant, переранжирование через локальный кросс-энкодер, синтез ответа через GigaChat, самокритику и перегенерацию. Ядро также управляет индексацией документов и хранением истории диалогов в PostgreSQL. RAG-ядро реализовано как отдельный HTTP-сервер (FastAPI + Uvicorn), что позволяет использовать его для любых клиентов (XMPP, Telegram, Mastodon, веб-интерфейс, системы аналитики). -2. **Тонкие XMPP-боты-клиенты** – каждый профиль (методолог, коробочник, персональный ассистент) представляет собой отдельный XMPP-клиент, который подключается к ejabberd, обрабатывает команды, принимает файлы и пересылает запросы пользователей в RAG-ядро по HTTP. Боты не содержат RAG-логики, не имеют локальной БД или Qdrant, а только загружают свои промпты и передают их в запросах. Это делает их легковесными и независимыми. +2. **Тонкие XMPP-боты-клиенты** — каждый профиль (методолог, коробочник, персональный ассистент) представляет собой отдельный XMPP-клиент, который подключается к ejabberd, обрабатывает команды, принимает файлы и пересылает запросы пользователей в RAG-ядро по HTTP. Боты не содержат RAG-логики, не имеют локальной БД или Qdrant, а только загружают свои промпты и передают их в запросах. Это делает их легковесными и независимыми. 3. **Внешние системы хранения и API**: - - **ejabberd** – XMPP-сервер (сообщения, MUC-комнаты, HTTP Upload). - - **PostgreSQL** – централизованное хранилище метаданных документов, истории диалогов, прав доступа, списка комнат, шаблонов и оценок обратной связи. - - **Qdrant** – векторная БД с двумя полями (dense, sparse) для гибридного поиска. Доступна только RAG-ядру. - - **GigaChat API** – генерация текста и эмбеддингов. Вызовы осуществляются только из RAG-ядра, что позволяет централизованно управлять кэшированием и лимитами. + - **ejabberd** — XMPP-сервер (сообщения, MUC-комнаты, HTTP Upload). + - **PostgreSQL** — централизованное хранилище метаданных документов, истории диалогов, прав доступа, списка комнат, шаблонов и оценок обратной связи. + - **Qdrant** — векторная БД с двумя полями (dense, sparse) для гибридного поиска. Доступна только RAG-ядру. + - **GigaChat API** — генерация текста и эмбеддингов. Вызовы осуществляются только из RAG-ядра, что позволяет централизованно управлять кэшированием и лимитами. **Философия**: @@ -28,40 +28,40 @@ **Сервисы распределены по jails FreeBSD/Linux**: -- `rag-server` (Python 3.11/3.12) – HTTP-сервис RAG-ядра. -- `metabot`, `korobot`, `persobot` – отдельные XMPP-клиенты (также на Python), которые общаются с RAG-ядром через HTTP. -- `ejabberd`, `PostgreSQL`, `Qdrant` – внешние системы. +- `rag-server` (Python 3.11/3.12) — HTTP-сервис RAG-ядра. +- `metabot`, `korobot`, `persobot` — отдельные XMPP-клиенты (также на Python), которые общаются с RAG-ядром через HTTP. +- `ejabberd`, `PostgreSQL`, `Qdrant` — внешние системы. ## 3. Уникальность решения -1. **Гибридный RAG (dense + sparse) с самокритикой и централизованным ядром** – не используется в корпоративных ботах массово. Коммерческие решения (Microsoft Copilot, IBM Watson) часто ограничиваются простым семантическим поиском без переранжирования и самокритики. Вынесение RAG-логики в отдельный HTTP-сервис позволяет легко масштабировать и подключать любые клиентские интерфейсы. +1. **Гибридный RAG (dense + sparse) с самокритикой и централизованным ядром** — не используется в корпоративных ботах массово. Коммерческие решения часто ограничиваются простым семантическим поиском без переранжирования и самокритики. Вынесение RAG-логики в отдельный HTTP-сервис позволяет легко масштабировать и подключать любые клиентские интерфейсы. -2. **Персональный ассистент как часть экосистемы** – типичные персональные ассистенты не имеют доступа к внутренней базе знаний и не умеют отвечать на сложные вопросы по документам. Эфцекабот объединяет общие и персональные функции в едином RAG-ядре, при этом каждый бот-профиль использует свои промпты, что позволяет гибко настраивать поведение под конкретные задачи. +2. **Персональный ассистент как часть экосистемы** — типичные персональные ассистенты не имеют доступа к внутренней базе знаний и не умеют отвечать на сложные вопросы по документам. Эфцекабот объединяет общие и персональные функции в едином RAG-ядре, при этом каждый бот-профиль использует свои промпты, что позволяет гибко настраивать поведение под конкретные задачи. -3. **Единая чат-среда и единый RAG-бэкенд для всех коммуникаций** – не требуется переключаться между десятками каналов (чат-боты в Telegram, веб-формы, почта). Весь документооборот, командировки, экспертные вопросы – в одном интерфейсе (корпоративном мессенджере), а при необходимости те же функции доступны через Telegram, Mastodon или веб-интерфейс благодаря универсальному HTTP API RAG-ядра. +3. **Единая чат-среда и единый RAG-бэкенд для всех коммуникаций** — не требуется переключаться между десятками каналов (чат-боты в Telegram, веб-формы, почта). Весь документооборот, командировки, экспертные вопросы — в одном интерфейсе (корпоративном мессенджере), а при необходимости те же функции доступны через Telegram, или веб-интерфейс благодаря универсальному HTTP API RAG-ядра. -4. **Полный контроль над данными** – все компоненты развернуты внутри компании. Никакие документы или переписка не покидают периметр. История и документы хранятся только на серверах компании. +4. **Полный контроль над данными** — все компоненты развернуты внутри компании. Никакие документы или переписка не покидают периметр. История и документы хранятся только на серверах компании. -5. **Открытая агентная архитектура** – можно подключить любого RPA, внешнее API, 1С, SAP, календарь, тревел-агрегатор без необходимости переписывать ядро бота – достаточно реализовать HTTP-клиент к RAG-ядру. Конкуренты, как правило, предлагают закрытые экосистемы. +5. **Открытая агентная архитектура** — можно подключить любого RPA, внешнее API, 1С, SAP, календарь, тревел-агрегатор без необходимости переписывать ядро бота — достаточно реализовать HTTP-клиент к RAG-ядру. Конкуренты, как правило, предлагают закрытые экосистемы. -6. **Автоматическая индексация файлов в комнатах** – файл, попавший в групповой чат, автоматически становится доступен всей команде через RAG-ядро. Даже у Slack и Teams нет такой функции «из коробки». +6. **Автоматическая индексация файлов в комнатах** — файл, попавший в групповой чат, автоматически становится доступен всей команде через RAG-ядро. Даже у Slack и Teams нет такой функции «из коробки». ## 4. Преимущества и недостатки работы бота в чате #### Преимущества: -- **Единое корпоративное окно** – пользователь не переключается между приложениями, получает экспертные ответы прямо в рабочем чате. -- **Мгновенный обмен файлами** – встроен HTTP Upload, бот автоматически отправляет файлы в RAG-ядро для индексации (в т.ч. в групповых комнатах). -- **Учет контекста беседы** – история диалога хранится централизованно в RAG-ядре, что обеспечивает единый контекст для всех клиентов (XMPP, Telegram, веб). -- **Поддержка комнат (MUC)** – документы, загруженные в комнату, видны всем участникам, а переписка в комнате служит общим контекстом. -- **Легковесные клиенты** – боты не содержат сложной RAG-логики, что упрощает их обновление и развертывание; все изменения в RAG вносятся в одном месте – RAG-ядре. -- **Не требует установки уникального клиентского ПО** – достаточно любого XMPP-клиента (Conversations, Gajim, Pidgin) или работать через web-интерфейс (который также может использовать RAG-ядро). -- **Полный контроль данных** – развертывание внутри периметра, никаких облачных сервисов. +- **Единое корпоративное окно** — пользователь не переключается между приложениями, получает экспертные ответы прямо в рабочем чате. +- **Мгновенный обмен файлами** — встроен HTTP Upload, бот автоматически отправляет файлы в RAG-ядро для индексации (в т.ч. в групповых комнатах). +- **Учет контекста беседы** — история диалога хранится централизованно в RAG-ядре, что обеспечивает единый контекст для всех клиентов (XMPP, Telegram, веб). +- **Поддержка комнат (MUC)** — документы, загруженные в комнату, видны всем участникам, а переписка в комнате служит общим контекстом. +- **Легковесные клиенты** — боты не содержат сложной RAG-логики, что упрощает их обновление и развертывание; все изменения в RAG вносятся в одном месте — RAG-ядре. +- **Не требует установки уникального клиентского ПО** — достаточно любого XMPP-клиента (Fluux, Conversations, Gajim, Pidgin) или работать через web-интерфейс (который также может использовать RAG-ядро). +- **Полный контроль данных** — развертывание внутри периметра, никаких облачных сервисов. - **Поддерживаемые форматы**: DOCX, PDF, XLSX, PPTX, TXT, CSV, JSON, изображения (OCR), аудио (SaluteSpeech), архивы ZIP/7z. - **Размер загружаемого файла**: до 1 Гб. #### Недостатки: -- **Задержка** – добавлен сетевой вызов от бота к RAG-ядру (~1–2 мс внутри сети) и несколько вызовов GigaChat (3–10 секунд). Однако благодаря кэшированию (классификация, расширение, эмбеддинги) и локальному кросс-энкодеру итоговое время ответа в большинстве случаев составляет 3–7 секунд, что приемлемо для экспертной системы. -- **Сложность отладки** – распределенная система (RAG-ядро, боты-клиенты, ejabberd, PostgreSQL, Qdrant) усложняет трассировку ошибок, но централизованное логирование и единая точка входа (RAG-ядро) упрощают мониторинг. +- **Задержка** — добавлен сетевой вызов от бота к RAG-ядру (1–2 мс внутри сети) и несколько вызовов GigaChat (3–10 секунд). Однако благодаря кэшированию (классификация, расширение, эмбеддинги) и локальному кросс-энкодеру итоговое время ответа в большинстве случаев составляет 3–7 секунд, что приемлемо для экспертной системы. +- **Сложность отладки** — распределенная система (RAG-ядро, боты-клиенты, ejabberd, PostgreSQL, Qdrant) усложняет трассировку ошибок, но централизованное логирование и единая точка входа (RAG-ядро) упрощают мониторинг. ## 5. Как чат-бот влияет на работу с GigaChat @@ -111,9 +111,9 @@ ``` **Ключевые компоненты:** -- **RAG-сервер** – единая точка входа для всех RAG-запросов. Содержит всю бизнес-логику (поиск, генерацию, самокритику, индексацию). Запускается как отдельный HTTP-сервис. -- **Тонкие клиенты** – боты-профили (XMPP, Telegram, Mastodon и т.д.), которые только передают запросы в RAG-сервер и не содержат RAG-логики. -- **Внешние системы** – PostgreSQL, Qdrant, GigaChat API – доступны только RAG-серверу. +- **RAG-сервер** — единая точка входа для всех RAG-запросов. Содержит всю бизнес-логику (поиск, генерацию, самокритику, индексацию). Запускается как отдельный HTTP-сервис. +- **Тонкие клиенты** — боты-профили (XMPP, Telegram, Mastodon и т.д.), которые только передают запросы в RAG-сервер и не содержат RAG-логики. +- **Внешние системы** — PostgreSQL, Qdrant, GigaChat API — доступны только RAG-серверу. ### 6.2. Структура каталогов проекта @@ -135,7 +135,7 @@ │ ├── LICENSE │ └── README.md │ -├── core/services/ # СеВИСЫ – долгоживущие компоненты +├── core/services/ # СЕРВИСЫ – долгоживущие компоненты │ ├── __init__.py │ ├── postgres_service.py # Пул соединений с PostgreSQL │ ├── qdrant_service.py # Векторная БД (создание, поиск, удаление) @@ -145,7 +145,7 @@ │ ├── giga_client.py # Клиент GigaChat (chat, upload_file) │ └── reranker_service.py # Кросс-энкодер для переранжирования (локально) │ -├── core/functions/ # НеАВИСИМЫЕ ЧИСТЫЕ ФУНКЦИИ +├── core/functions/ # НЕЗАВИСИМЫЕ ФУНКЦИИ │ ├── __init__.py │ ├── intent_classify.py # Классификация намерений │ ├── expand_query.py # Расширение запроса (синонимы, аббревиатуры) @@ -167,7 +167,7 @@ │ ├── subscription_handler.py # Подписки (roster subscription) │ └── health_handler.py # Очистка файлов, healthcheck БД/Qdrant │ -├── core/workers/ # ФОНОВЫЕ АСИНХРОННЫЕ ВОРКеЫ +├── core/workers/ # ФОНОВЫЕ АСИНХРОННЫЕ ВОРКЕРЫ │ ├── __init__.py │ └── indexing_worker.py # Индексация файлов и URL (через HTTP в RAG-сервер) │ @@ -175,8 +175,8 @@ │ ├── __init__.py │ ├── registry.py # Регистрация команд, алиасы, подсказки │ ├── base.py # Базовый класс Command -│ ├── info.py # !info – краткая справка -│ ├── help.py # !help – подробная справка +│ ├── info.py # !info — краткая справка +│ ├── help.py # !help — подробная справка │ ├── learn.py # !learn, !stop_learn, !global_learn │ ├── kb.py # !clear, !global_clear, !kb │ ├── stats.py # !stats, !status, !clean @@ -186,7 +186,7 @@ │ ├── create.py # !create (генерация по шаблону) │ └── global_remove.py # !global_remove – удаление глобального документа (админ) │ -├── core/tests/ # ЮНИТ-ТеТЫ (pytest) +├── core/tests/ # ЮНИТ-ТЕСТЫ (pytest) │ ├── __init__.py │ ├── conftest.py # Фикстуры и моки │ ├── test_intent_classify.py # Тесты классификации намерений @@ -197,7 +197,7 @@ │ ├── test_critique.py # Тесты самокритики │ └── test_check_spelling.py # Тесты проверки орфографии │ -├── core/utils/ # ВСПОМОГАТеЬНЫЕ УТИЛИТЫ +├── core/utils/ # ВСПОМОГАТЕЛЬНЫЕ УТИЛИТЫ │ ├── __init__.py │ ├── config_loader.py # Загрузка core.conf + bot.conf, чтение .env │ ├── logger.py # Настройка логирования @@ -206,18 +206,17 @@ │ ├── web_utils.py # Веб-скрапинг (fetch_any_url, crawl_url) │ └── arg_parser.py # Парсинг аргументов команд (--flag value) │ -├── core/xmpp/ # XMPP-КЛИеТ (тонкий) +├── core/xmpp/ # XMPP-КЛИЕНТ (тонкий) │ ├── __init__.py │ └── client.py # Основной класс Bot (наследует slixmpp.ClientXMPP) │ -├── metabot/ # ПРОФИЛЬ: МеОДОЛОГ +├── metabot/ # ПРОФИЛЬ: МЕТОДОЛОГ │ ├── bot.conf # Конфиг профиля (JID, БД, коллекция Qdrant, промпты) │ ├── bot.conf.sample # Пример конфига -│ ├── metabot.rc.template # Шаблон rc-файла для запуска │ ├── schema.sql # Схема БД -│ ├── LICENSE +│ ├── LICENSE # Лицензия │ ├── README.md -│ ├── prompts/ # ПРОМПТЫ ДЛЯ МеОДОЛОГА +│ ├── prompts/ # ПРОМПТЫ ДЛЯ МЕТОДОЛОГА │ │ ├── system.txt # Роль, стиль, правила поведения (строгий RAG) │ │ ├── synthesis.txt # Шаблон синтеза ответа (контекст + запрос → ответ) │ │ ├── intent_classify.txt # Классификация намерений (FACT, PROCEDURE, METRICS и др.) @@ -232,7 +231,7 @@ │ ├── data/ # Постоянные копии файлов │ └── temp/ # Временные файлы │ -├── korobot/ # ПРОФИЛЬ: КОРОБОЧНЫЕ РееИЯ +├── korobot/ # ПРОФИЛЬ: КОРОБОЧНЫЕ РЕШЕИЯ │ ├── bot.conf │ ├── bot.conf.sample │ ├── korobot.rc.template @@ -254,14 +253,14 @@ │ ├── data/ │ └── temp/ │ -├── persobot/ # ПРОФИЛЬ: ПеСОНАЛЬНЫЙ АССИСТеТ +├── persobot/ # ПРОФИЛЬ: ПЕРСОНАЛЬНЫЙ АССИСТЕНТ │ ├── bot.conf │ ├── bot.conf.sample │ ├── persobot.rc.template │ ├── schema.sql │ ├── LICENSE │ ├── README.md -│ ├── prompts/ # ПРОМПТЫ ДЛЯ ПеСОНАЛЬНОГО АССИСТеТА (аналогичный набор) +│ ├── prompts/ # ПРОМПТЫ ДЛЯ ПЕРСОНАЛЬНОГО АССИСТЕНТА (аналогичный набор) │ │ ├── system.txt │ │ ├── synthesis.txt │ │ ├── intent_classify.txt @@ -276,12 +275,12 @@ │ ├── data/ │ └── temp/ │ -├── venv/ # ВИРТУАЛЬНОЕ ОКРУЖеИЕ Python +├── venv/ # ВИРТУАЛЬНОЕ ОКРУЖЕНИЕ Python │ ├── bin/ # Исполняемые файлы (python, pip, activate) │ ├── lib/ # Установленные библиотеки │ └── ... │ -└── .env # ПеееНЫЕ ОКРУЖеИЯ +└── .env # ПЕРЕМЕННЫЕ ОКРУЖЕНИЯ ├── XMPP_PASSWORD=... ├── DB_PASSWORD=... ├── GIGACHAT_API_KEY=... @@ -293,22 +292,22 @@ ``` ┌─────────────┐ HTTP ┌─────────────┐ SQL ┌─────────────┐ │ Пользова- │ ──────────────▶│ RAG- │ ──────────────▶│ PostgreSQL │ -│ тель │ │ СеВе │ │ (история, │ -│ (XMPP) │ ◀──────────────│ (ядро) │ ◀──────────────│ документы) │ +│ тель │ │ сервер │ │ (история, │ +│ (XMPP) │ ◀──────────────│ (ядро) │ ◀──────────────│ документы) │ └─────────────┘ └─────────────┘ └─────────────┘ │ │ │ │ XMPP │ HTTP (gRPC) │ ▼ ▼ ▼ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ -│ ejabberd │ │ Qdrant │ │ GigaChat │ -│ (чат-серв.)│ │ (векторная │ │ (API) │ -└─────────────┘ │ БД) │ └─────────────┘ +│ ejabberd │ │ Qdrant │ │ GigaChat │ +│ (чат-серв.) │ │ (векторная │ │ (API) │ +└─────────────┘ │ БД) │ └─────────────┘ │ └─────────────┘ │ │ XMPP │ │ ▼ ▼ ▼ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ XMPP-бот │ │ FastEmbed │ │ Файлы │ -│ (тонкий) │ │ (локальный │ │ (диск) │ +│ (тонкий) │ │ (локальный │ │ (диск) │ │ клиент │ │ кросс-энк.) │ └─────────────┘ └─────────────┘ └─────────────┘ ``` @@ -375,8 +374,8 @@ pytest tests/ -v | Место | Функция | Обоснование | | ----- | ------- | ----------- | -| **🥇 1** | Генерация по шаблону | Основной инструмент для создания коробочных решений – автоматизирует производство документов | -| **🥈 2** | Гибридный RAG | Без него бот не может отвечать по документам – фундамент системы | +| **🥇 1** | Генерация по шаблону | Основной инструмент для создания коробочных решений — автоматизирует производство документов | +| **🥈 2** | Гибридный RAG | Без него бот не может отвечать по документам — фундамент системы | | **🥉 3** | Комнатные/глобальные БЗ | Обеспечивают коллективную работу над коробочными решениями | | **4** | Хирургическая замена | Ускоряет доработку документов, критично для подготовки финальных версий | | **5** | Проверка орфографии | Повышает качество исходящих документов | @@ -401,18 +400,18 @@ pytest tests/ -v **Что делает**: По команде `!create "Коробочное решение"` бот генерирует готовый коробочный документ на основе шаблона, заполняя все плейсхолдеры `{{...}}` данными из базы знаний комнаты. Шаблон содержит следующие разделы (соответствует файлу `Шаблон коробочного решения.docx`): -1. **Профиль коробочного решения** – параметры внедрения, ресурсы, сроки. -2. **Актуальность коробочного решения** – потенциал повышения производительности, задачи, ожидаемые результаты. -3. **Решаемая проблема** – типовой процесс (до улучшения), проблемные зоны, коренные причины. -4. **Решение** – целевой процесс (после улучшения), детальное описание решений, результаты внедрения. -5. **Алгоритм внедрения коробочного решения** – состав рабочей группы, последовательность этапов. -6. **Риски** – описание рисков и мер по их снижению. -7. **Термины, сокращения, определения** – глоссарий из документов комнаты. -8. **Сопроводительные документы** – перечень приложений, шаблонов, регламентов. -9. **Лучшие практики** – ссылки на реализованные аналогичные решения. +1. **Профиль коробочного решения** — параметры внедрения, ресурсы, сроки. +2. **Актуальность коробочного решения** — потенциал повышения производительности, задачи, ожидаемые результаты. +3. **Решаемая проблема** — типовой процесс (до улучшения), проблемные зоны, коренные причины. +4. **Решение** — целевой процесс (после улучшения), детальное описание решений, результаты внедрения. +5. **Алгоритм внедрения коробочного решения** — состав рабочей группы, последовательность этапов. +6. **Риски** — описание рисков и мер по их снижению. +7. **Термины, сокращения, определения** — глоссарий из документов комнаты. +8. **Сопроводительные документы** — перечень приложений, шаблонов, регламентов. +9. **Лучшие практики** — ссылки на реализованные аналогичные решения. **Уникальность**: -Превращает бота из информатора в **инструмент производства готовых коробочных решений**. Достаточно один раз настроить шаблон, и бот будет генерировать документы на основе актуальных данных из базы знаний. Все, что требуется от пользователя – загрузить в комнату документы-источники (регламенты, отчеты, методики, ГОСТы, аналитические записки). +Превращает бота из информатора в **инструмент производства готовых коробочных решений**. Достаточно один раз настроить шаблон, и бот будет генерировать документы на основе актуальных данных из базы знаний. Все, что требуется от пользователя — загрузить в комнату документы-источники (регламенты, отчеты, методики, ГОСТы, аналитические записки). **Польза**: Автоматизация подготовки коробочных решений, сокращение времени на создание документов с 1-2 недель до 10-30 минут, исключение ошибок ручного ввода, единообразие документов, возможность быстрого масштабирования на любые типы организаций. @@ -460,14 +459,14 @@ pytest tests/ -v - Лучшие практики: `{{BEST_PRACTICE_1_LINK}}`, `{{BEST_PRACTICE_1_DESC}}`. 3. **Для каждого плейсхолдера выполняет поиск** в базе знаний комнаты (личные + комнатные + глобальные документы). Поиск использует: - - Семантический поиск (dense-эмбеддинги) – для общих запросов. - - Полнотекстовый поиск (MatchText) – для точных цитат и номеров пунктов. - - Расширение запроса (query expansion) – добавляет синонимы и аббревиатуры. - - Переранжирование (кросс-энкодер) – отбирает только релевантные фрагменты. + - Семантический поиск (dense-эмбеддинги) — для общих запросов. + - Полнотекстовый поиск (MatchText) — для точных цитат и номеров пунктов. + - Расширение запроса (query expansion) — добавляет синонимы и аббревиатуры. + - Переранжирование (кросс-энкодер) — отбирает только релевантные фрагменты. 4. **Формирует промпт для GigaChat** с инструкцией заполнить плейсхолдер на основе найденных фрагментов. Промпт содержит контекст из фрагментов документов и сам плейсхолдер. -5. **Генерирует значение для каждого плейсхолдера** – например, для `{{TYPICAL_PROBLEM_DESCRIPTION}}` GigaChat напишет: «В региональной системе наблюдается дефицит сотрудников с профильным образованием (только 30% из 100), нерегулярное планирование, отсутствие единой методики оценки компетенций». +5. **Генерирует значение для каждого плейсхолдера** — например, для `{{TYPICAL_PROBLEM_DESCRIPTION}}` GigaChat напишет: «В региональной системе наблюдается дефицит сотрудников с профильным образованием (только 30% из 100), нерегулярное планирование, отсутствие единой методики оценки компетенций». 6. **Заменяет плейсхолдеры в копии шаблона**, сохраняя все форматирование (жирный шрифт, курсив, цвета, таблицы, колонтитулы). Замена выполняется с учетом возможного разбиения текста на несколько `runs` в DOCX, что повышает точность.