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

50 KiB
Raw Blame History

Настройка AI Ассистента в DLE

Временный документ для внутреннего анализа


📋 Содержание

  1. Обзор системы
  2. Архитектура настроек
  3. База данных
  4. Backend API
  5. Frontend страницы
  6. Настройка AI провайдеров
  7. Настройка AI ассистента
  8. Правила AI (Rules)
  9. Интеграции (Email, Telegram)
  10. 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).

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.

Примеры записей:

[
  {
    "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 ассистента.

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)

{
  "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              // Поиск синонимов
  }
}

Пример записи:

{
  "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.

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):

{
  "checkUserTags": true,                  // Проверять теги пользователя
  "searchRagFirst": true,                 // Искать в RAG сначала
  "generateIfNoRag": true,                // Генерировать ответ, если нет RAG
  "requireAdminApproval": false,          // Требовать одобрения админа
  "maxTokens": 500,                       // Максимальное количество токенов
  "temperature": 0.7,                     // Температура генерации
  "customInstructions": "..."             // Дополнительные инструкции
}

Примеры правил:

[
  {
    "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 права

Ответ:

{
  "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)

Тело запроса:

{
  "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 права

Ответ:

{
  "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 права

Тело запроса:

{
  "api_key": "sk-...",
  "base_url": "https://api.openai.com/v1"
}

Ответ:

{
  "success": true
}

2. Настройки AI ассистента

GET /settings/ai-assistant

Получить настройки AI ассистента.

Требования: Admin права

Ответ:

{
  "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 права

Тело запроса:

{
  "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:

// Преобразование 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 права

Ответ:

{
  "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 права

Тело запроса:

{
  "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.

Требования: Авторизация

Ответ:

{
  "connected": true,
  "message": "Ollama is running",
  "models": 3,
  "availableModels": ["qwen2.5:7b", "llama2:7b", "mistral:7b"]
}

GET /ollama/models

Получить список установленных моделей.

Требования: Авторизация

Ответ:

{
  "models": [
    {
      "name": "qwen2.5:7b",
      "id": "qwen2.5:7b",
      "size": 4500000000,
      "modified": "2025-01-15T10:00:00Z"
    }
  ]
}

POST /ollama/install

Установить модель.

Требования: Авторизация

Тело запроса:

{
  "model": "llama2:7b"
}

Ответ (немедленный):

{
  "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:

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 перед сохранением
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)

{
  "checkUserTags": true,
  "searchRagFirst": true,
  "generateIfNoRag": false,
  "maxTokens": 300
}

Применение: Когда нужны только точные ответы из базы знаний.

2. Гибридный режим (RAG + генерация)

{
  "checkUserTags": true,
  "searchRagFirst": true,
  "generateIfNoRag": true,
  "temperature": 0.7,
  "maxTokens": 500
}

Применение: Баланс между точностью и гибкостью.

3. Креативный режим

{
  "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

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