# Настройка 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  
**Статус**: Временный (для внутреннего использования)

