Files
DLE/docs/ai-assistant-configuration.md
2025-10-26 00:23:11 +03:00

1119 lines
50 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Настройка AI Ассистента в DLE
> **Временный документ для внутреннего анализа**
---
## 📋 Содержание
1. [Обзор системы](#обзор-системы)
2. [Архитектура настроек](#архитектура-настроек)
3. [База данных](#база-данных)
4. [Backend API](#backend-api)
5. [Frontend страницы](#frontend-страницы)
6. [Настройка AI провайдеров](#настройка-ai-провайдеров)
7. [Настройка AI ассистента](#настройка-ai-ассистента)
8. [Правила AI (Rules)](#правила-ai-rules)
9. [Интеграции (Email, Telegram)](#интеграции-email-telegram)
10. [RAG конфигурация](#rag-конфигурация)
11. [Мониторинг системы](#мониторинг-системы)
---
## Обзор системы
### Что это?
Система настройки AI ассистента в DLE — это **модульная конфигурация** для управления поведением искусственного интеллекта, интеграциями с провайдерами LLM, базами знаний (RAG), и каналами связи.
### Ключевые компоненты
```
┌───────────────────────────────────────────────────────────┐
│ Настройка AI Ассистента в DLE │
├───────────────────────────────────────────────────────────┤
│ │
│ 🤖 AI Провайдеры: │
│ ├── OpenAI (GPT-4, GPT-3.5) │
│ ├── Anthropic (Claude) │
│ ├── Google (Gemini) │
│ └── Ollama (локальные модели) │
│ │
│ ⚙️ Настройки AI: │
│ ├── System Prompt │
│ ├── Выбор LLM модели │
│ ├── Выбор Embedding модели │
│ ├── Выбор RAG-таблиц │
│ ├── Правила (Rules) │
│ └── Настройки RAG поиска │
│ │
│ 📋 Правила (Rules): │
│ ├── JSON конфигурация поведения │
│ ├── Создание/редактирование/удаление │
│ └── Привязка к AI ассистенту │
│ │
│ 🔗 Интеграции: │
│ ├── Email (IMAP + SMTP) │
│ └── Telegram Bot │
│ │
│ 🔍 RAG: │
│ ├── Выбор таблиц для поиска │
│ ├── Настройки поиска (гибридный/семантический) │
│ ├── Порог релевантности │
│ └── Извлечение ключевых слов │
│ │
│ 📊 Мониторинг: │
│ ├── Статус сервисов (Backend, Ollama, Postgres) │
│ ├── Тест RAG-функциональности │
│ └── Отслеживание прогресса │
│ │
└───────────────────────────────────────────────────────────┘
```
---
## Архитектура настроек
### Иерархия настроек
```
Уровень 1: AI Провайдеры (ai_providers_settings)
├── OpenAI (API Key, Base URL, модели)
├── Anthropic (API Key, модели)
├── Google (API Key, модели)
└── Ollama (Base URL, локальные модели)
Уровень 2: AI Ассистент (ai_assistant_settings)
├── System Prompt
├── Выбранная LLM модель
├── Выбранная Embedding модель
├── Выбранные RAG-таблицы
├── Правила (Rules ID)
├── Telegram Bot ID
├── Email Settings ID
└── Настройки RAG поиска
Уровень 3: Правила AI (ai_assistant_rules)
├── Название
├── Описание
└── JSON конфигурация
```
### Процесс обработки сообщения
```
1. Пользователь → Сообщение
2. UnifiedMessageProcessor
3. Проверка языка (только русский)
4. Дедупликация (хеш сообщения)
5. Загрузка настроек (aiAssistantSettingsService)
6. Загрузка правил (aiAssistantRulesService)
7. RAG поиск (ragService)
├── Семантический поиск (vector search)
├── Поиск по ключевым словам
└── Гибридный поиск
8. Генерация ответа (generateLLMResponse)
├── System Prompt
├── История разговора
├── Контекст из RAG
└── Правила
9. Ответ → Пользователь
```
---
## База данных
### Таблица: `ai_providers_settings`
**Назначение**: Хранение настроек для AI провайдеров (OpenAI, Anthropic, Google, Ollama).
```sql
CREATE TABLE IF NOT EXISTS ai_providers_settings (
id SERIAL PRIMARY KEY,
provider_encrypted TEXT, -- Провайдер: openai, anthropic, google, ollama
api_key_encrypted TEXT, -- API ключ (зашифрован)
base_url_encrypted TEXT, -- Base URL для API
selected_model_encrypted TEXT, -- Выбранная LLM модель
embedding_model_encrypted TEXT, -- Выбранная Embedding модель
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
updated_at TIMESTAMP NOT NULL DEFAULT NOW()
);
```
**Шифрование**: Все чувствительные поля (`provider`, `api_key`, `base_url`, `selected_model`, `embedding_model`) зашифрованы с помощью AES-256.
**Примеры записей**:
```json
[
{
"id": 1,
"provider": "ollama",
"base_url": "http://ollama:11434",
"selected_model": "qwen2.5:7b",
"embedding_model": "mxbai-embed-large:latest"
},
{
"id": 2,
"provider": "openai",
"api_key": "sk-...",
"base_url": "https://api.openai.com/v1",
"selected_model": "gpt-4",
"embedding_model": "text-embedding-ada-002"
}
]
```
### Таблица: `ai_assistant_settings`
**Назначение**: Глобальные настройки AI ассистента.
```sql
CREATE TABLE IF NOT EXISTS ai_assistant_settings (
id SERIAL PRIMARY KEY,
system_prompt_encrypted TEXT, -- Системный промт
selected_rag_tables INTEGER[], -- Массив ID RAG-таблиц
languages TEXT[], -- Массив поддерживаемых языков
model_encrypted TEXT, -- Выбранная LLM модель
embedding_model_encrypted TEXT, -- Выбранная Embedding модель
rules JSONB, -- Правила (DEPRECATED)
rules_id INTEGER REFERENCES ai_assistant_rules(id), -- Ссылка на правило
telegram_settings_id INTEGER, -- Ссылка на Telegram бота
email_settings_id INTEGER, -- Ссылка на Email настройки
rag_settings JSONB, -- Настройки RAG поиска (NEW)
updated_at TIMESTAMP DEFAULT NOW(),
updated_by INTEGER
);
```
**Новое поле**: `rag_settings` (JSONB)
```json
{
"searchMethod": "hybrid", // "semantic", "keyword", "hybrid"
"maxResults": 5, // Максимальное количество результатов
"relevanceThreshold": 0.1, // Порог релевантности
"keywordExtraction": {
"enabled": true, // Включить извлечение ключевых слов
"minWordLength": 3, // Минимальная длина слова
"maxKeywords": 10, // Максимальное количество ключевых слов
"removeStopWords": true, // Удалять стоп-слова
"language": "ru"
},
"searchWeights": {
"semantic": 70, // Вес семантического поиска (%)
"keyword": 30 // Вес поиска по ключевым словам (%)
},
"advanced": {
"enableFuzzySearch": true, // Нечеткий поиск
"enableStemming": true, // Стемминг слов
"enableSynonyms": false // Поиск синонимов
}
}
```
**Пример записи**:
```json
{
"id": 1,
"system_prompt": "Вы — полезный ассистент. Отвечайте на русском языке.",
"selected_rag_tables": [1, 3],
"languages": ["ru"],
"model": "qwen2.5:7b",
"embedding_model": "mxbai-embed-large:latest",
"rules_id": 2,
"telegram_settings_id": 1,
"email_settings_id": 1,
"rag_settings": { /* см. выше */ }
}
```
### Таблица: `ai_assistant_rules`
**Назначение**: Наборы правил для управления поведением AI.
```sql
CREATE TABLE IF NOT EXISTS ai_assistant_rules (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL, -- Название набора правил
description TEXT, -- Описание правила
rules JSONB NOT NULL, -- JSON конфигурация
rules_encrypted TEXT, -- Зашифрованная версия правил (NEW)
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);
```
**Формат правил** (JSON):
```json
{
"checkUserTags": true, // Проверять теги пользователя
"searchRagFirst": true, // Искать в RAG сначала
"generateIfNoRag": true, // Генерировать ответ, если нет RAG
"requireAdminApproval": false, // Требовать одобрения админа
"maxTokens": 500, // Максимальное количество токенов
"temperature": 0.7, // Температура генерации
"customInstructions": "..." // Дополнительные инструкции
}
```
**Примеры правил**:
```json
[
{
"id": 1,
"name": "Строгий режим",
"description": "Только ответы из базы знаний, без генерации",
"rules": {
"checkUserTags": true,
"searchRagFirst": true,
"generateIfNoRag": false
}
},
{
"id": 2,
"name": "Гибридный режим",
"description": "RAG + генерация при необходимости",
"rules": {
"checkUserTags": true,
"searchRagFirst": true,
"generateIfNoRag": true,
"temperature": 0.7
}
}
]
```
---
## Backend API
### 1. Настройки AI провайдеров
#### GET `/settings/ai-settings/:provider`
Получить настройки провайдера (openai, anthropic, google, ollama).
**Требования**: Авторизация + Admin права
**Ответ**:
```json
{
"success": true,
"settings": {
"provider": "ollama",
"api_key": null,
"base_url": "http://ollama:11434",
"selected_model": "qwen2.5:7b",
"embedding_model": "mxbai-embed-large:latest"
}
}
```
#### PUT `/settings/ai-settings/:provider`
Сохранить/обновить настройки провайдера.
**Требования**: Admin права (`requireAdmin`)
**Тело запроса**:
```json
{
"api_key": "sk-...",
"base_url": "https://api.openai.com/v1",
"selected_model": "gpt-4",
"embedding_model": "text-embedding-ada-002"
}
```
#### DELETE `/settings/ai-settings/:provider`
Удалить настройки провайдера.
**Требования**: Admin права
#### GET `/settings/ai-settings/:provider/models`
Получить список доступных моделей для провайдера.
**Требования**: Admin права
**Ответ**:
```json
{
"success": true,
"models": [
{ "id": "gpt-4", "name": "GPT-4" },
{ "id": "gpt-3.5-turbo", "name": "GPT-3.5 Turbo" }
]
}
```
#### POST `/settings/ai-settings/:provider/verify`
Проверить валидность API ключа.
**Требования**: Admin права
**Тело запроса**:
```json
{
"api_key": "sk-...",
"base_url": "https://api.openai.com/v1"
}
```
**Ответ**:
```json
{
"success": true
}
```
### 2. Настройки AI ассистента
#### GET `/settings/ai-assistant`
Получить настройки AI ассистента.
**Требования**: Admin права
**Ответ**:
```json
{
"success": true,
"settings": {
"id": 1,
"system_prompt": "Вы — полезный ассистент.",
"selected_rag_tables": [1, 3],
"model": "qwen2.5:7b",
"embedding_model": "mxbai-embed-large:latest",
"rules_id": 2,
"telegram_settings_id": 1,
"email_settings_id": 1,
"ragSettings": {
"searchMethod": "hybrid",
"maxResults": 5
}
}
}
```
#### PUT `/settings/ai-assistant`
Сохранить/обновить настройки AI ассистента.
**Требования**: Admin права
**Тело запроса**:
```json
{
"system_prompt": "Вы — полезный ассистент.",
"selected_rag_tables": [1],
"model": "qwen2.5:7b",
"embedding_model": "mxbai-embed-large:latest",
"rules_id": 2,
"telegram_settings_id": 1,
"email_settings_id": 1,
"ragSettings": {
"searchMethod": "hybrid",
"maxResults": 5,
"relevanceThreshold": 0.1
}
}
```
**Обработка на Backend**:
```javascript
// Преобразование selected_rag_tables в массив
let { selected_rag_tables, ...rest } = req.body;
if (typeof selected_rag_tables === 'string') {
try {
selected_rag_tables = JSON.parse(selected_rag_tables);
} catch {
selected_rag_tables = [Number(selected_rag_tables)];
}
}
if (!Array.isArray(selected_rag_tables)) {
selected_rag_tables = [Number(selected_rag_tables)];
}
selected_rag_tables = selected_rag_tables.map(Number);
```
### 3. Правила AI
#### GET `/settings/ai-assistant-rules`
Получить все наборы правил.
**Требования**: Admin права
**Ответ**:
```json
{
"success": true,
"rules": [
{
"id": 1,
"name": "Строгий режим",
"description": "Только ответы из базы знаний",
"rules": { "checkUserTags": true, "generateIfNoRag": false },
"created_at": "2025-01-15T10:00:00Z",
"updated_at": "2025-01-15T10:00:00Z"
}
]
}
```
#### GET `/settings/ai-assistant-rules/:id`
Получить правило по ID.
**Требования**: Admin права
#### POST `/settings/ai-assistant-rules`
Создать новое правило.
**Требования**: Admin права
**Тело запроса**:
```json
{
"name": "Новое правило",
"description": "Описание правила",
"rules": {
"checkUserTags": true,
"searchRagFirst": true,
"generateIfNoRag": true
}
}
```
#### PUT `/settings/ai-assistant-rules/:id`
Обновить правило.
**Требования**: Admin права
#### DELETE `/settings/ai-assistant-rules/:id`
Удалить правило.
**Требования**: Admin права
### 4. Ollama (локальные модели)
#### GET `/ollama/status`
Проверить статус Ollama.
**Требования**: Авторизация
**Ответ**:
```json
{
"connected": true,
"message": "Ollama is running",
"models": 3,
"availableModels": ["qwen2.5:7b", "llama2:7b", "mistral:7b"]
}
```
#### GET `/ollama/models`
Получить список установленных моделей.
**Требования**: Авторизация
**Ответ**:
```json
{
"models": [
{
"name": "qwen2.5:7b",
"id": "qwen2.5:7b",
"size": 4500000000,
"modified": "2025-01-15T10:00:00Z"
}
]
}
```
#### POST `/ollama/install`
Установить модель.
**Требования**: Авторизация
**Тело запроса**:
```json
{
"model": "llama2:7b"
}
```
**Ответ** (немедленный):
```json
{
"success": true,
"message": "Installation of llama2:7b started",
"processId": 12345
}
```
**Примечание**: Установка происходит в фоне, не блокирует запрос.
#### DELETE `/ollama/models/:modelName`
Удалить модель.
**Требования**: Авторизация
### 5. Интеграции
#### Email
**GET** `/settings/email-settings` — Получить настройки Email
**PUT** `/settings/email-settings` — Обновить настройки Email
**DELETE** `/settings/email-settings` — Удалить настройки Email
**POST** `/settings/email-settings/test-smtp` — Тест SMTP
**POST** `/settings/email-settings/test-imap` — Тест IMAP
**GET** `/settings/email-settings/list` — Список всех Email настроек
#### Telegram
**GET** `/settings/telegram-settings` — Получить настройки Telegram
**PUT** `/settings/telegram-settings` — Обновить настройки Telegram
**DELETE** `/settings/telegram-settings` — Удалить настройки Telegram
**GET** `/settings/telegram-settings/list` — Список всех Telegram ботов
---
## Frontend страницы
### 1. Главная страница интеграций
**Путь**: `/settings/ai`
**Компонент**: `AiSettingsView.vue`
**Блоки интеграций**:
```
┌─────────────────────────────────────────────────────┐
│ Интеграции │
├─────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐│
│ │ OpenAI │ │ Ollama │ │ Telegram ││
│ │ │ │ │ │ ││
│ │ [Подробнее]│ │ [Подробнее]│ │ [Подробнее]││
│ └─────────────┘ └─────────────┘ └─────────────┘│
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐│
│ │ Email │ │База данных │ │ИИ-ассистент ││
│ │ │ │ │ │ ││
│ │ [Подробнее]│ │ [Подробнее]│ │ [Подробнее]││
│ └─────────────┘ └─────────────┘ └─────────────┘│
│ │
└─────────────────────────────────────────────────────┘
```
**Навигация**:
- `/settings/ai/openai` → Настройки OpenAI
- `/settings/ai/ollama` → Настройки Ollama
- `/settings/ai/telegram` → Настройки Telegram
- `/settings/ai/email` → Настройки Email
- `/settings/ai/database` → Настройки БД
- `/settings/ai/assistant` → Настройки AI ассистента
### 2. Настройки AI провайдера
**Путь**: `/settings/ai/:provider`
**Компонент**: `AIProviderSettings.vue`
**Форма настроек**:
```
┌──────────────────────────────────────────────────────────┐
│ OpenAI [×] │
├──────────────────────────────────────────────────────────┤
│ │
│ Введите OpenAI API Key и (опционально) Base URL. │
│ │
│ API Key: │
│ ┌────────────────────────────────────────────────────┐ │
│ │ sk-... │ │
│ └────────────────────────────────────────────────────┘ │
│ [Verify] ✔️ │
│ │
│ Base URL: │
│ ┌────────────────────────────────────────────────────┐ │
│ │ https://api.openai.com/v1 │ │
│ └────────────────────────────────────────────────────┘ │
│ │
│ Модель (LLM): │
│ ┌────────────────────────────────────────────────────┐ │
│ │ gpt-4 ▼ │ │
│ └────────────────────────────────────────────────────┘ │
│ │
│ Embeddings-модель: │
│ ┌────────────────────────────────────────────────────┐ │
│ │ text-embedding-ada-002 ▼ │ │
│ └────────────────────────────────────────────────────┘ │
│ │
│ [Сохранить] [Удалить ключ] [Закрыть] │
│ │
│ ✅ Сохранено! │
└──────────────────────────────────────────────────────────┘
```
**Логика работы**:
1. **Загрузка настроек**: При монтировании компонента загружаются сохраненные настройки через `GET /settings/ai-settings/:provider`.
2. **Verify**: Проверка валидности API ключа через `POST /settings/ai-settings/:provider/verify`.
3. **Загрузка моделей**: После успешной верификации загружаются доступные модели через `GET /settings/ai-settings/:provider/models` или `/ollama/models` (для Ollama).
4. **Сохранение**: Сохранение настроек через `PUT /settings/ai-settings/:provider`.
5. **Удаление**: Удаление настроек через `DELETE /settings/ai-settings/:provider`.
**Особенности Ollama**:
- Не требуется API Key
- Только Base URL
- Модели загружаются через `/ollama/models`
### 3. Настройки AI ассистента
**Путь**: `/settings/ai/assistant`
**Компонент**: `AiAssistantSettings.vue`
**Основная форма настроек**:
```
┌──────────────────────────────────────────────────────────┐
│ ИИ-ассистент: интеграция и настройки [×] │
├──────────────────────────────────────────────────────────┤
│ │
│ Системный промт │
│ ┌────────────────────────────────────────────────────┐ │
│ │ Вы — полезный ассистент. Отвечайте на русском. │ │
│ └────────────────────────────────────────────────────┘ │
│ │
│ 📋 Плейсхолдеры пользовательских таблиц │
│ ┌────────────────────────────────────────────────────┐ │
│ │ Плейсхолдер | Столбец | Таблица │ │
│ ├────────────────────────────────────────────────────┤ │
│ │ { email } | Email | Контакты [Ред.] │ │
│ │ { phone } | Телефон | Контакты [Ред.] │ │
│ └────────────────────────────────────────────────────┘ │
│ │
│ LLM-модель │
│ ┌────────────────────────────────────────────────────┐ │
│ │ qwen2.5:7b (ollama) ▼ │ │
│ └────────────────────────────────────────────────────┘ │
│ │
│ Embedding-модель │
│ ┌────────────────────────────────────────────────────┐ │
│ │ mxbai-embed-large:latest (ollama) ▼ │ │
│ └────────────────────────────────────────────────────┘ │
│ │
│ Выбранные RAG-таблицы │
│ ┌────────────────────────────────────────────────────┐ │
│ │ FAQ (ID: 1) ▼ │ │
│ └────────────────────────────────────────────────────┘ │
│ │
Набор правил │
│ ┌────────────────────────────────────────────────────┐ │
│ │ Гибридный режим ▼ │ │
│ └────────────────────────────────────────────────────┘ │
│ [Создать] [Редактировать] [Удалить] │
│ │
│ Описание: RAG + генерация при необходимости │
│ ┌────────────────────────────────────────────────────┐ │
│ │ { │ │
│ │ "checkUserTags": true, │ │
│ │ "searchRagFirst": true, │ │
│ │ "generateIfNoRag": true │ │
│ │ } │ │
│ └────────────────────────────────────────────────────┘ │
│ │
│ Telegram-бот │
│ ┌────────────────────────────────────────────────────┐ │
│ │ @mybot ▼ │ │
│ └────────────────────────────────────────────────────┘ │
│ │
│ Email для связи │
│ ┌────────────────────────────────────────────────────┐ │
│ │ support@example.com ▼ │ │
│ └────────────────────────────────────────────────────┘ │
│ │
│ 🔍 Настройки RAG поиска │
│ (см. ниже) │
│ │
│ [Сохранить] [Отмена] │
└──────────────────────────────────────────────────────────┘
```
---
## Настройки RAG поиска
**Блок в форме AI ассистента**:
```
┌──────────────────────────────────────────────────────────┐
│ 🔍 Настройки RAG поиска │
├──────────────────────────────────────────────────────────┤
│ │
│ Метод поиска │
│ ┌────────────────────────────────────────────────────┐ │
│ │ Гибридный поиск ▼ │ │
│ └────────────────────────────────────────────────────┘ │
│ │
│ Максимальное количество результатов поиска │
│ ┌─────┐ │
│ │ 5 │ │
│ └─────┘ │
│ │
│ Порог релевантности (0.1) │
│ ├───────────●──────────────────────────────────────┤ │
│ 0.01 1.0 │
│ │
│ 🔑 Извлечение ключевых слов │
│ ☑ Включить извлечение ключевых слов │
│ │
│ Минимальная длина слова: 3 │
│ Максимальное количество ключевых слов: 10 │
│ ☑ Удалять стоп-слова │
│ │
│ ⚖️ Веса поиска (для гибридного) │
│ Семантический поиск: 70% │
│ ├───────────────●────────────────────────────────┤ │
│ │
│ Поиск по ключевым словам: 30% │
│ ├───────●────────────────────────────────────────┤ │
│ │
│ ⚙️ Дополнительные настройки │
│ ☑ Нечеткий поиск │
│ ☑ Стемминг слов │
│ ☐ Поиск синонимов │
│ │
└──────────────────────────────────────────────────────────┘
```
**Параметры RAG настроек**:
| Параметр | Тип | Значение по умолчанию | Описание |
|----------|-----|-----------------------|----------|
| `searchMethod` | `string` | `"hybrid"` | Метод поиска: `semantic`, `keyword`, `hybrid` |
| `maxResults` | `number` | `5` | Максимальное количество результатов (1-20) |
| `relevanceThreshold` | `number` | `0.1` | Порог релевантности (0.01-1.0) |
| `keywordExtraction.enabled` | `boolean` | `true` | Включить извлечение ключевых слов |
| `keywordExtraction.minWordLength` | `number` | `3` | Минимальная длина слова (2-10) |
| `keywordExtraction.maxKeywords` | `number` | `10` | Максимальное количество ключевых слов (5-20) |
| `keywordExtraction.removeStopWords` | `boolean` | `true` | Удалять стоп-слова |
| `searchWeights.semantic` | `number` | `70` | Вес семантического поиска (%) |
| `searchWeights.keyword` | `number` | `30` | Вес поиска по ключевым словам (%) |
| `advanced.enableFuzzySearch` | `boolean` | `true` | Нечеткий поиск |
| `advanced.enableStemming` | `boolean` | `true` | Стемминг слов |
| `advanced.enableSynonyms` | `boolean` | `false` | Поиск синонимов |
**Сохранение на Backend**:
```javascript
const settingsToSave = { ...settings.value };
settingsToSave.ragSettings = ragSettings.value;
await axios.put('/settings/ai-assistant', settingsToSave);
```
---
## Правила AI (Rules)
### Редактор правил
**Компонент**: `RuleEditor.vue`
**Модальное окно**:
```
┌──────────────────────────────────────────────────────────┐
│ Создать набор правил │
├──────────────────────────────────────────────────────────┤
│ │
│ Название │
│ ┌────────────────────────────────────────────────────┐ │
│ │ Строгий режим │ │
│ └────────────────────────────────────────────────────┘ │
│ │
│ Описание │
│ ┌────────────────────────────────────────────────────┐ │
│ │ Только ответы из базы знаний, без генерации │ │
│ └────────────────────────────────────────────────────┘ │
│ │
│ Правила (JSON) │
│ ┌────────────────────────────────────────────────────┐ │
│ │ { │ │
│ │ "checkUserTags": true, │ │
│ │ "searchRagFirst": true, │ │
│ │ "generateIfNoRag": false │ │
│ │ } │ │
│ └────────────────────────────────────────────────────┘ │
│ │
│ [Сохранить] [Отмена] │
└──────────────────────────────────────────────────────────┘
```
**Логика работы**:
1. **Создание**: `POST /settings/ai-assistant-rules` с `{ name, description, rules }`
2. **Редактирование**: `PUT /settings/ai-assistant-rules/:id` с `{ name, description, rules }`
3. **Валидация**: Проверка JSON перед сохранением
```javascript
async function save() {
let rules;
try {
rules = JSON.parse(rulesJson.value);
} catch (e) {
error.value = 'Ошибка в формате JSON!';
return;
}
if (props.rule && props.rule.id) {
await axios.put(`/settings/ai-assistant-rules/${props.rule.id}`, { name, description, rules });
} else {
await axios.post('/settings/ai-assistant-rules', { name, description, rules });
}
emit('close', true);
}
```
### Примеры правил
#### 1. Строгий режим (только RAG)
```json
{
"checkUserTags": true,
"searchRagFirst": true,
"generateIfNoRag": false,
"maxTokens": 300
}
```
**Применение**: Когда нужны только точные ответы из базы знаний.
#### 2. Гибридный режим (RAG + генерация)
```json
{
"checkUserTags": true,
"searchRagFirst": true,
"generateIfNoRag": true,
"temperature": 0.7,
"maxTokens": 500
}
```
**Применение**: Баланс между точностью и гибкостью.
#### 3. Креативный режим
```json
{
"checkUserTags": false,
"searchRagFirst": false,
"generateIfNoRag": true,
"temperature": 0.9,
"maxTokens": 1000,
"customInstructions": "Будьте креативны и дружелюбны"
}
```
**Применение**: Для общения с пользователями, когда нужна более свободная генерация.
---
## Мониторинг системы
**Компонент**: `SystemMonitoring.vue`
**Интерфейс мониторинга**:
```
┌──────────────────────────────────────────────────────────┐
│ 🔍 Мониторинг системы │
│ [🔄 Обновить статус] Последнее обновление: 12:34:56 │
├──────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ ● Backend │ │ ● Postgres │ │ ● Ollama │ │
│ │ │ │ │ │ │ │
│ │ Статус: │ │ Статус: │ │ Статус: │ │
│ │ Работает │ │ Работает │ │ Работает │ │
│ │ │ │ │ │ Модели: 3 │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ │
│ ┌──────────────┐ │
│ │ ● Vector │ │
│ │ Search │ │
│ │ │ │
│ │ Статус: │ │
│ │ Работает │ │
│ └──────────────┘ │
│ │
│ 🧠 Тест RAG-функциональности │
│ ┌────────────────────────────────────────────────────┐ │
│ │ Выберите RAG-таблицу: │ │
│ │ FAQ (ID: 1) ▼ [🔄] │ │
│ └────────────────────────────────────────────────────┘ │
│ │
│ ┌────────────────────────────────────────────────────┐ │
│ │ Как работает ИИ-ассистент? │ │
│ └────────────────────────────────────────────────────┘ │
│ [Тестировать RAG] │
│ │
│ 🔍 Ищем ответ в базе знаний... │
│ ├──────────────────────────●───────────────────────┤ │
│ 75% │
│ │
│ ✅ Успешно! │
│ Таблица: FAQ │
│ Вопрос: "Как работает ИИ-ассистент?" │
│ Ответ: "ИИ-ассистент использует..." │
│ Score: -120 │
│ │
└──────────────────────────────────────────────────────────┘
```
### Статусы сервисов
**Backend**: `GET /monitoring`
```json
{
"services": {
"backend": {
"status": "ok"
},
"postgres": {
"status": "ok"
},
"ollama": {
"status": "ok",
"models": 3
},
"vectorSearch": {
"status": "ok"
}
}
}
```
**Цвета статусов**:
- 🟢 `ok` / `healthy` — Зеленый
- 🟡 `warning` — Желтый
- 🔴 `error` — Красный
-`unknown` — Серый
### Тест RAG
**Логика теста**:
1. **Выбор таблицы**: Загружаются все таблицы с `is_rag_source_id === 1`
2. **Ввод вопроса**: Пользователь вводит тестовый вопрос
3. **Запрос**: `POST /rag/answer` с `{ tableId, question, product: null }`
4. **Прогресс-бар**: Симуляция прогресса для UX
5. **Результат**: Отображение ответа и score
```javascript
const testRAG = async () => {
ragTesting.value = true;
ragResult.value = null;
ragProgress.value = 0;
ragStatus.value = '🔍 Ищем ответ в базе знаний...';
const progressInterval = setInterval(() => {
if (ragProgress.value < 90) {
ragProgress.value += Math.random() * 15;
}
}, 1000);
try {
ragStatus.value = '🤖 Генерируем ответ с помощью ИИ...';
const response = await axios.post('/rag/answer', {
tableId: selectedRagTable.value,
question: ragQuestion.value,
product: null
});
clearInterval(progressInterval);
ragProgress.value = 100;
ragStatus.value = '✅ Готово!';
ragResult.value = {
success: true,
answer: response.data.answer,
score: response.data.score
};
} catch (error) {
clearInterval(progressInterval);
ragProgress.value = 0;
ragResult.value = {
success: false,
error: error.response?.data?.error || error.message
};
}
ragTesting.value = false;
};
```
---
## Заключение
Система настройки AI ассистента в DLE — это **комплексная платформа** для управления:
**AI провайдерами** (OpenAI, Anthropic, Google, Ollama)
**Настройками ассистента** (промты, модели, RAG-таблицы)
**Правилами поведения** (JSON конфигурация)
**Интеграциями** (Email, Telegram)
**RAG конфигурацией** (гибридный поиск, ключевые слова)
**Мониторингом** (статусы сервисов, тестирование)
Все настройки **зашифрованы** (AES-256), имеют **детальные права доступа** (только админы), и предоставляют **гибкую конфигурацию** для различных сценариев использования.
---
**© 2024-2025 Тарабанов Александр Викторович. Все права защищены.**
**Версия документа**: 1.0.0
**Дата создания**: October 25, 2025
**Статус**: Временный (для внутреннего использования)