-
Notifications
You must be signed in to change notification settings - Fork 5
Cloud AI Training
Раздел Cloud AI позволяет управлять базой знаний для облачных языковых моделей (Gemini, OpenAI, Claude, DeepSeek и др.). В отличие от локального LoRA-дообучения, здесь не меняются веса модели — вместо этого формируется контекстная база документов, которая автоматически подставляется в промпт при каждом запросе пользователя.
Доступ: Админ-панель → Fine-tune → Cloud AI (для роли web — единственный режим на странице Fine-tune).
Пользователь задаёт вопрос
↓
Wiki RAG ищет релевантные секции в базе знаний (TF-IDF)
↓
Найденные секции добавляются в системный промпт
↓
Облачная LLM получает запрос + контекст из документации
↓
Ответ учитывает информацию из ваших документов
Это называется RAG (Retrieval-Augmented Generation) — поиск + генерация. Модель не «запоминает» ваши данные, а получает их как контекст к каждому вопросу.
| Cloud AI (RAG) | Local (LoRA) | |
|---|---|---|
| GPU | Не нужен | RTX 3060+ (12GB) |
| Время подготовки | Мгновенно (загрузил файл — готово) | Часы на обучение |
| Обновление данных | Загрузил новый файл — сразу работает | Переобучение модели |
| Стоимость | API-ключ облачного LLM | Своё железо |
| Качество | Точные цитаты из документов | Модель «знает» стиль ответов |
Лучший результат — комбинация обоих подходов: LoRA для стиля и тона, RAG для актуальных данных.
Первый блок на странице Cloud AI показывает текущее состояние поисковой базы:
| Метрика | Описание |
|---|---|
| Секций | Сколько секций (## и ### заголовков) проиндексировано из всех документов |
| Файлов | Сколько .md файлов обработано |
| Уникальных токенов | Размер словаря (количество уникальных слов в индексе) |
| Статус | «Активен» (есть документы) или «Пуст» (нет документов) |
Ниже — список проиндексированных файлов (имена без расширения).
Перечитывает все .md файлы из папки wiki-pages/ и заново строит поисковый индекс в оперативной памяти. Используйте после:
- Ручного добавления/изменения файлов на сервере
- Изменения содержимого документов через файловую систему
- Если поиск возвращает устаревшие результаты
Переиндексация при загрузке/удалении через UI происходит автоматически.
Таблица всех документов с колонками: файл, название, тип, количество секций, размер.
- Нажмите «Выбрать файл» — поддерживаются форматы
.mdи.txt - После выбора появится имя файла и кнопка «Загрузить»
- Файл сохраняется в папку
wiki-pages/на сервере - Автоматически происходит переиндексация
Файлы .txt автоматически конвертируются в .md (меняется расширение).
Документы в формате Markdown. Для лучшего качества поиска структурируйте их с заголовками:
# Название документа
## Раздел 1
Текст раздела. Минимум 50 символов в каждой секции, чтобы
она попала в индекс.
## Раздел 2
Ещё один раздел. Каждый ## или ### заголовок создаёт
отдельную секцию в поисковом индексе.
### Подраздел 2.1
Подразделы (###) тоже индексируются как отдельные секции.Рекомендации:
- Используйте
##и###заголовки для разбиения на секции - Каждая секция должна быть самодостаточной (содержать полный ответ на вопрос)
- Минимум 50 символов на секцию — короткие секции пропускаются
- Файлы, начинающиеся с
_(например_Sidebar.md), игнорируются
Нажмите кнопку удаления (корзина) справа от документа. Удаляются и файл с диска, и запись в базе данных. Индекс обновляется автоматически.
При первом открытии страницы система сканирует папку wiki-pages/ и создаёт записи в БД для файлов, которые есть на диске, но ещё не зарегистрированы. Это полезно если вы добавили файлы напрямую через файловую систему.
Позволяет проверить, как работает поиск по базе знаний, до того как пользователи начнут задавать вопросы боту.
- Введите запрос в поле поиска (например, «как установить систему»)
- Выберите количество результатов: Top 3, Top 5 или Top 10
- Нажмите «Поиск» (или Enter)
Для каждого найденного результата отображается:
| Поле | Описание |
|---|---|
| Заголовок | Название секции (## или ### заголовок из документа) |
| Score | Числовой показатель релевантности (TF-IDF). Чем выше — тем лучше совпадение |
| Источник | Имя файла, из которого взята секция |
| Текст | Превью содержимого секции (до 500 символов) |
- > 5.0 — отличное совпадение, запрос точно покрыт документацией
- 2.0 – 5.0 — хорошее совпадение, контекст релевантен
- < 2.0 — слабое совпадение, возможно стоит добавить документ по этой теме
Если результатов нет — значит ни одно слово из запроса не найдено в индексе. Добавьте документ, содержащий ответ на этот вопрос.
Wiki RAG работает автоматически — никакой специальной настройки system prompt не нужно. Достаточно загрузить документы в базу знаний, и система сама начнёт подставлять контекст.
Пользователь отправляет сообщение
↓
1. Бэкенд берёт текст сообщения
↓
2. WikiRAGService.retrieve(текст, top_k=3, max_chars=1500)
→ TF-IDF поиск по всем секциям в индексе
→ Возвращает top-3 релевантных секции
↓
3. Секции форматируются в блок:
[Документация по теме:]
## Заголовок секции (имя_файла)
Тело секции...
↓
4. Блок добавляется В КОНЕЦ системного промпта:
system_prompt = "{промпт персоны}\n\n{блок документации}"
↓
5. LLM получает: system prompt + контекст + историю + вопрос
↓
6. Ответ учитывает информацию из документов
| Канал | RAG работает? | Как |
|---|---|---|
| Чат (админ-панель) | Да | Напрямую в app/routers/chat.py
|
| Виджет (на сайте) | Да | Через тот же чат-роутер |
| Telegram бот | Да | Бот ходит через API оркестратора → чат-роутер |
| WhatsApp бот | Да | Бот ходит через API оркестратора → чат-роутер |
Все каналы проходят через один endpoint (POST /admin/chat/sessions/{id}/stream), где и происходит RAG-инжекция.
RAG дополняет системный промпт, а не заменяет его. Промпт формируется по приоритетам:
- Кастомный промпт (если задан в настройках виджета/бота) → используется он
-
Промпт персоны (Анна/Марина) → берётся из
SECRETARY_PERSONASвvllm_llm_service.py - Wiki RAG контекст → всегда добавляется в конец, к любому промпту
Пример итогового system prompt:
Ты — Анна, виртуальный секретарь компании. Ты помогаешь клиентам
с вопросами о продуктах и услугах. Отвечай вежливо и по делу.
[Документация по теме:]
## Код для встраивания (Widget)
Виджет — это чат-окно, которое встраивается на любой сайт
одним <script> тегом. Формат:
<script>
window.aiChatSettings = {
apiUrl: 'https://your-server.com',
instanceId: 'sales-widget'
};
</script>
## Размещение (Widget)
Вставьте код перед закрывающим тегом </body> на вашем сайте.
-
Загрузите документы — Админ-панель → Fine-tune → Cloud AI → загрузите
.mdфайлы -
Структурируйте заголовками — каждый
##создаёт отдельную секцию в индексе - Проверьте поиск — используйте тестовый поиск на той же странице
- Кастомизируйте промпт (опционально) — в настройках виджета/бота можно задать свой system prompt, например:
Ты — консультант по продукту X. Используй информацию из документации ниже
для точных ответов. Если в документации нет ответа — скажи честно.
RAG-контекст добавится автоматически после этого промпта.
| Параметр | Значение | Описание |
|---|---|---|
| top_k | 3 | Количество лучших секций для контекста |
| max_chars | 1500 | Максимальный размер контекста (символов) |
| min_section_len | 50 | Минимальная длина секции для индексации |
| header_boost | x2 | Слова в заголовках ## весят вдвое больше |
Эти параметры зашиты в коде (app/routers/chat.py:316, app/services/wiki_rag_service.py). Для изменения требуется редактирование кода.
Пользователь спрашивает: «Как подключить виджет на сайт?»
Система находит в Wiki RAG секцию «Встраивание на сайт» из файла Widget.md и добавляет её в промпт. Облачная LLM отвечает на основе этой документации — с точными инструкциями и примерами кода.
# Статус и управление
GET /admin/wiki-rag/stats # Статистика индекса + список файлов
POST /admin/wiki-rag/reload # Переиндексация wiki-pages/
POST /admin/wiki-rag/search # Поиск: query → scored results
# Документы (CRUD)
GET /admin/wiki-rag/documents # Список документов (+ автосинхронизация)
POST /admin/wiki-rag/documents/upload # Загрузка .md/.txt файла
GET /admin/wiki-rag/documents/{id} # Метаданные + превью содержимого
PUT /admin/wiki-rag/documents/{id} # Обновить title/content
DELETE /admin/wiki-rag/documents/{id} # Удалить файл + запись в БД
wiki-pages/ # Директория с документами базы знаний
├── Home.md # Главная страница документации
├── Installation.md # Инструкция по установке
├── Chat.md # Документация по чату
├── LLM.md # Документация по LLM
├── ... # Другие .md файлы
├── _Sidebar.md # Навигация (игнорируется при индексации)
└── images/ # Изображения для документов
app/services/wiki_rag_service.py # TF-IDF поисковый движок
app/routers/wiki_rag.py # API-роутер (8 эндпоинтов)
db/models.py → KnowledgeDocument # SQLAlchemy модель
db/repositories/knowledge_document.py # Репозиторий
modules/knowledge/service.py → KnowledgeDocService # Доменный сервис (ранее AsyncKnowledgeDocManager в db/integration.py)
-
Один документ — одна тема. Файл
pricing.mdлучше, чем «всё в одном файле» -
Заголовки — это ключ. Слова в заголовках
##весят вдвое больше при поиске - Пишите как FAQ. Секция с вопросом в заголовке и ответом в теле — идеальный формат
- Русский и английский. Индекс работает с обоими языками, стоп-слова фильтруются для обоих
- Минимум 50 символов. Короткие секции (< 50 символов) пропускаются при индексации
- Проверяйте через тестовый поиск. После загрузки нового документа — сразу проверьте, что поиск находит нужные секции по типичным запросам пользователей
← Finetune | Cloud-LLM-Providers →