Files
ChatBot/docs/configuration.md
Leonid Pershin e5e69470f8
All checks were successful
SonarQube / Build and analyze (push) Successful in 3m22s
add docs
2025-10-21 05:08:40 +03:00

12 KiB
Raw Permalink Blame History

⚙️ Конфигурация

Полное руководство по настройке ChatBot.

📝 Иерархия конфигурации

Настройки загружаются в следующем порядке (последующие переопределяют предыдущие):

  1. appsettings.json - Базовые настройки
  2. appsettings.Development.json - Настройки для разработки
  3. User Secrets - Секреты для разработки
  4. Переменные окружения - Production настройки
  5. .env файл - Локальные переменные

🔐 Переменные окружения

Telegram Bot

# Обязательно
TELEGRAM_BOT_TOKEN=123456789:ABCdefGHIjklMNOpqrsTUVwxyz

Ollama

# URL сервера Ollama
OLLAMA_URL=http://localhost:11434

# Модель по умолчанию
OLLAMA_DEFAULT_MODEL=gemma2:2b

База данных

# Подключение к PostgreSQL
DB_HOST=localhost
DB_PORT=5432
DB_NAME=chatbot
DB_USER=postgres
DB_PASSWORD=your_secure_password

📄 appsettings.json

Полная структура

{
  "Serilog": {
    "MinimumLevel": {
      "Default": "Information",
      "Override": {
        "Microsoft": "Warning",
        "System": "Warning"
      }
    },
    "WriteTo": [
      {
        "Name": "Console",
        "Args": {
          "outputTemplate": "[{Timestamp:HH:mm:ss}] [{Level}] {Message}{NewLine}{Exception}"
        }
      },
      {
        "Name": "File",
        "Args": {
          "path": "logs/telegram-bot-.log",
          "rollingInterval": "Day",
          "retainedFileCountLimit": 7
        }
      }
    ]
  },
  "TelegramBot": {
    "BotToken": ""
  },
  "Ollama": {
    "Url": "",
    "DefaultModel": ""
  },
  "AI": {
    "Temperature": 0.9,
    "SystemPromptPath": "Prompts/system-prompt.txt",
    "MaxRetryAttempts": 3,
    "RetryDelayMs": 1000,
    "RequestTimeoutSeconds": 180,
    "EnableHistoryCompression": true,
    "CompressionThreshold": 20,
    "CompressionTarget": 10,
    "MinMessageLengthForSummarization": 50,
    "MaxSummarizedMessageLength": 200,
    "EnableExponentialBackoff": true,
    "MaxRetryDelayMs": 30000,
    "CompressionTimeoutSeconds": 30,
    "StatusCheckTimeoutSeconds": 10
  },
  "Database": {
    "ConnectionString": "",
    "EnableSensitiveDataLogging": false,
    "CommandTimeout": 30
  }
}

🎯 Секции конфигурации

TelegramBot

Параметр Тип Описание По умолчанию
BotToken string Токен бота от @BotFather -

Валидация:

  • Токен не может быть пустым
  • Минимальная длина: 10 символов

Пример:

{
  "TelegramBot": {
    "BotToken": "123456789:ABCdefGHIjklMNOpqrsTUVwxyz"
  }
}

Ollama

Параметр Тип Описание По умолчанию
Url string URL Ollama сервера http://localhost:11434
DefaultModel string Модель по умолчанию gemma2:2b

Валидация:

  • URL должен быть валидным HTTP/HTTPS адресом
  • Модель не может быть пустой

Пример:

{
  "Ollama": {
    "Url": "http://localhost:11434",
    "DefaultModel": "gemma2:2b"
  }
}

Доступные модели:

  • gemma2:2b - Быстрая, легкая (2GB RAM)
  • llama3.2 - Средняя (4GB RAM)
  • mistral - Продвинутая (8GB RAM)
  • phi3 - Компактная (2.5GB RAM)

AI

Параметр Тип Описание По умолчанию
Temperature double Креативность ответов (0.0-2.0) 0.9
SystemPromptPath string Путь к системному промпту Prompts/system-prompt.txt
MaxRetryAttempts int Макс. попыток повтора 3
RetryDelayMs int Задержка между попытками (мс) 1000
RequestTimeoutSeconds int Таймаут запроса (сек) 180
EnableHistoryCompression bool Включить сжатие истории true
CompressionThreshold int Порог для сжатия (кол-во сообщений) 20
CompressionTarget int Целевое кол-во после сжатия 10
MinMessageLengthForSummarization int Мин. длина для суммаризации 50
MaxSummarizedMessageLength int Макс. длина суммаризации 200
EnableExponentialBackoff bool Экспоненциальный backoff true
MaxRetryDelayMs int Макс. задержка повтора (мс) 30000
CompressionTimeoutSeconds int Таймаут сжатия (сек) 30
StatusCheckTimeoutSeconds int Таймаут проверки статуса (сек) 10

Валидация:

  • Temperature: 0.0 ≤ x ≤ 2.0
  • MaxRetryAttempts: 1 ≤ x ≤ 10
  • RetryDelayMs: 100 ≤ x ≤ 60000
  • RequestTimeoutSeconds: 10 ≤ x ≤ 600

Пример:

{
  "AI": {
    "Temperature": 0.9,
    "MaxRetryAttempts": 3,
    "EnableHistoryCompression": true,
    "CompressionThreshold": 20
  }
}

Temperature (Температура)

Определяет "креативность" ответов AI:

  • 0.0-0.3: Детерминированные, предсказуемые ответы
  • 0.4-0.7: Сбалансированные ответы
  • 0.8-1.2: Креативные, разнообразные ответы (рекомендуется)
  • 1.3-2.0: Очень креативные, иногда непредсказуемые

History Compression

Автоматическое сжатие истории диалога для оптимизации:

История: 20+ сообщений
        ↓ (сжатие)
Результат: 10 сообщений (суммаризация старых)

Алгоритм:

  1. Сохранить системный промпт
  2. Сохранить последние N сообщений
  3. Старые сообщения суммаризировать

Database

Параметр Тип Описание По умолчанию
ConnectionString string Строка подключения PostgreSQL -
EnableSensitiveDataLogging bool Логировать SQL запросы false
CommandTimeout int Таймаут команд (сек) 30

Валидация:

  • Connection string не может быть пустой
  • CommandTimeout: 5 ≤ x ≤ 300

Пример:

{
  "Database": {
    "ConnectionString": "Host=localhost;Port=5432;Database=chatbot;Username=chatbot;Password=password",
    "EnableSensitiveDataLogging": false,
    "CommandTimeout": 30
  }
}

Connection String формат:

Host={host};Port={port};Database={name};Username={user};Password={password}

Serilog (Логирование)

Параметр Тип Описание
MinimumLevel.Default string Минимальный уровень логов
WriteTo array Sink'и для записи

Уровни логирования:

  • Verbose - Все детали (разработка)
  • Debug - Отладочная информация
  • Information - Общая информация (по умолчанию)
  • Warning - Предупреждения
  • Error - Ошибки
  • Fatal - Критические ошибки

Пример:

{
  "Serilog": {
    "MinimumLevel": {
      "Default": "Information",
      "Override": {
        "Microsoft.EntityFrameworkCore": "Warning"
      }
    },
    "WriteTo": [
      {
        "Name": "Console"
      },
      {
        "Name": "File",
        "Args": {
          "path": "logs/app-.log",
          "rollingInterval": "Day"
        }
      }
    ]
  }
}

🔧 Настройка системного промпта

Файл: ChatBot/Prompts/system-prompt.txt

Этот файл определяет личность и стиль общения бота.

Структура промпта

[Персонаж]
- Имя, возраст, локация
- Интересы, хобби
- Стиль общения

[Правила ответов]
- Естественность
- Обработка {empty}
- Реакция на провокации

[Примеры]
- Корректные ответы
- Примеры {empty}

Специальные маркеры

{empty} - Бот игнорирует сообщение

Используется когда:

  • Сообщение адресовано другому человеку
  • Контекст не требует ответа
  • Провокационные вопросы о боте

Кастомизация промпта

  1. Откройте Prompts/system-prompt.txt
  2. Отредактируйте под свои нужды
  3. Сохраните файл
  4. Перезапустите бота

🔄 Переключение режимов

In-Memory Storage (для тестов)

В Program.cs:

// Заменить
builder.Services.AddScoped<ISessionStorage, DatabaseSessionStorage>();

// На
builder.Services.AddScoped<ISessionStorage, InMemorySessionStorage>();

Отключение сжатия истории

В appsettings.json:

{
  "AI": {
    "EnableHistoryCompression": false
  }
}

Изменение уровня логирования

{
  "Serilog": {
    "MinimumLevel": {
      "Default": "Debug"  // или Verbose
    }
  }
}

📊 Примеры конфигураций

Development (разработка)

{
  "AI": {
    "Temperature": 0.7,
    "EnableHistoryCompression": false,
    "MaxRetryAttempts": 2
  },
  "Database": {
    "EnableSensitiveDataLogging": true
  },
  "Serilog": {
    "MinimumLevel": {
      "Default": "Debug"
    }
  }
}

Production (production)

{
  "AI": {
    "Temperature": 0.9,
    "EnableHistoryCompression": true,
    "MaxRetryAttempts": 3
  },
  "Database": {
    "EnableSensitiveDataLogging": false
  },
  "Serilog": {
    "MinimumLevel": {
      "Default": "Information"
    }
  }
}

High Performance (производительность)

{
  "AI": {
    "Temperature": 0.8,
    "RequestTimeoutSeconds": 120,
    "EnableHistoryCompression": true,
    "CompressionThreshold": 15,
    "CompressionTarget": 8
  }
}

🔍 Проверка конфигурации

Валидация при старте

Приложение автоматически валидирует конфигурацию при запуске.

Ошибки валидации:

Options validation failed for 'TelegramBotSettings' with errors:
- BotToken cannot be empty

Просмотр текущей конфигурации

Используйте команду бота:

/settings

Ответ:

⚙️ Текущие настройки:
🤖 Модель: gemma2:2b
🌡️ Temperature: 0.9
📝 Сообщений в истории: 5/30
🗜️ Сжатие истории: Включено

📚 См. также