add docs
All checks were successful
SonarQube / Build and analyze (push) Successful in 3m22s

This commit is contained in:
Leonid Pershin
2025-10-21 05:08:40 +03:00
parent bc1b3c4015
commit e5e69470f8
12 changed files with 3550 additions and 6 deletions

449
docs/configuration.md Normal file
View File

@@ -0,0 +1,449 @@
# ⚙️ Конфигурация
Полное руководство по настройке ChatBot.
## 📝 Иерархия конфигурации
Настройки загружаются в следующем порядке (последующие переопределяют предыдущие):
1. `appsettings.json` - Базовые настройки
2. `appsettings.Development.json` - Настройки для разработки
3. User Secrets - Секреты для разработки
4. Переменные окружения - Production настройки
5. `.env` файл - Локальные переменные
## 🔐 Переменные окружения
### Telegram Bot
```env
# Обязательно
TELEGRAM_BOT_TOKEN=123456789:ABCdefGHIjklMNOpqrsTUVwxyz
```
### Ollama
```env
# URL сервера Ollama
OLLAMA_URL=http://localhost:11434
# Модель по умолчанию
OLLAMA_DEFAULT_MODEL=gemma2:2b
```
### База данных
```env
# Подключение к PostgreSQL
DB_HOST=localhost
DB_PORT=5432
DB_NAME=chatbot
DB_USER=postgres
DB_PASSWORD=your_secure_password
```
## 📄 appsettings.json
### Полная структура
```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 символов
**Пример:**
```json
{
"TelegramBot": {
"BotToken": "123456789:ABCdefGHIjklMNOpqrsTUVwxyz"
}
}
```
### Ollama
| Параметр | Тип | Описание | По умолчанию |
|----------|-----|----------|--------------|
| `Url` | string | URL Ollama сервера | http://localhost:11434 |
| `DefaultModel` | string | Модель по умолчанию | gemma2:2b |
**Валидация:**
- URL должен быть валидным HTTP/HTTPS адресом
- Модель не может быть пустой
**Пример:**
```json
{
"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
**Пример:**
```json
{
"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
**Пример:**
```json
{
"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` - Критические ошибки
**Пример:**
```json
{
"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`:
```csharp
// Заменить
builder.Services.AddScoped<ISessionStorage, DatabaseSessionStorage>();
// На
builder.Services.AddScoped<ISessionStorage, InMemorySessionStorage>();
```
### Отключение сжатия истории
В `appsettings.json`:
```json
{
"AI": {
"EnableHistoryCompression": false
}
}
```
### Изменение уровня логирования
```json
{
"Serilog": {
"MinimumLevel": {
"Default": "Debug" // или Verbose
}
}
}
```
## 📊 Примеры конфигураций
### Development (разработка)
```json
{
"AI": {
"Temperature": 0.7,
"EnableHistoryCompression": false,
"MaxRetryAttempts": 2
},
"Database": {
"EnableSensitiveDataLogging": true
},
"Serilog": {
"MinimumLevel": {
"Default": "Debug"
}
}
}
```
### Production (production)
```json
{
"AI": {
"Temperature": 0.9,
"EnableHistoryCompression": true,
"MaxRetryAttempts": 3
},
"Database": {
"EnableSensitiveDataLogging": false
},
"Serilog": {
"MinimumLevel": {
"Default": "Information"
}
}
}
```
### High Performance (производительность)
```json
{
"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
🗜️ Сжатие истории: Включено
```
## 📚 См. также
- [Установка](./installation.md)
- [Быстрый старт](./quickstart.md)
- [Development](./development/project-structure.md)