Files
ChatBot/docs/architecture/layers.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

350 lines
9.7 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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.
# 🏛️ Слои приложения
Детальное описание каждого слоя архитектуры ChatBot.
## 1⃣ Presentation Layer (Уровень представления)
### Telegram Bot Integration
Отвечает за взаимодействие с пользователями через Telegram.
#### Основные компоненты
**TelegramBotService**
- Главный сервис, управляющий ботом
- Запускается как `IHostedService`
- Получает updates через Webhook или Long Polling
- Координирует обработку сообщений
**TelegramMessageHandler**
- Обработка входящих сообщений
- Фильтрация по типу чата
- Извлечение информации о пользователе
- Передача в ChatService
**TelegramCommandProcessor**
- Распознавание команд (`/start`, `/help`, и т.д.)
- Routing к соответствующему обработчику
- Валидация прав доступа
**Commands (Команды)**
```
StartCommand - /start
HelpCommand - /help
ClearCommand - /clear
SettingsCommand - /settings
StatusCommand - /status
```
#### Паттерн Command
```csharp
public interface ITelegramCommand
{
string Command { get; }
string Description { get; }
Task<ReplyInfo> ExecuteAsync(TelegramCommandContext context);
}
```
Каждая команда:
- Изолирована
- Легко тестируется
- Независимо расширяема
## 2⃣ Service Layer (Бизнес-логика)
### Core Services
#### ChatService
**Ответственность:**
- Управление сессиями чатов
- Координация между AI и storage
- Обработка сообщений пользователей
**Методы:**
```csharp
GetOrCreateSession() // Получить/создать сессию
ProcessMessageAsync() // Обработать сообщение
ClearHistoryAsync() // Очистить историю
UpdateSessionParameters() // Обновить параметры
```
**Взаимодействия:**
- IAIService → Генерация ответов
- ISessionStorage → Хранение сессий
- IHistoryCompressionService → Оптимизация истории
#### AIService
**Ответственность:**
- Генерация ответов через Ollama
- Управление retry логикой
- Таймауты и error handling
**Методы:**
```csharp
GenerateChatCompletionAsync() // Базовая генерация
GenerateChatCompletionWithCompressionAsync() // С сжатием
```
**Особенности:**
- Экспоненциальный backoff
- Streaming responses
- Timeout handling
- System prompt injection
#### HistoryCompressionService
**Ответственность:**
- Суммаризация длинной истории
- Оптимизация контекста
- Сохранение важной информации
**Алгоритм:**
```
1. Сохранить system prompt
2. Сохранить последние N сообщений
3. Суммаризировать старые сообщения
4. Объединить результаты
```
**Методы:**
```csharp
ShouldCompress() // Проверка необходимости
CompressHistoryAsync() // Выполнить сжатие
SummarizeMessageAsync() // Суммаризировать одно сообщение
```
#### SystemPromptService
**Ответственность:**
- Загрузка системного промпта
- Кеширование промпта
- Обработка ошибок чтения файла
#### ModelService
**Ответственность:**
- Управление AI моделями
- Получение списка доступных моделей
- Переключение между моделями
### Storage Services
#### DatabaseSessionStorage
**Ответственность:**
- Сохранение сессий в PostgreSQL
- CRUD операции через репозиторий
- Синхронизация с базой данных
**Методы:**
```csharp
GetOrCreate() // Получить или создать
Get() // Получить по ID
SaveSessionAsync() // Сохранить сессию
Remove() // Удалить сессию
CleanupOldSessions() // Очистка старых
```
**Особенности:**
- Автоматическая конвертация Entity ↔ Model
- Lazy loading сессий
- Кеширование в памяти
#### InMemorySessionStorage
**Ответственность:**
- Хранение сессий в памяти
- Быстрый доступ для тестов
- Не требует БД
**Использование:**
- Unit тесты
- Development режим
- Прототипирование
## 3⃣ Data Access Layer (Доступ к данным)
### DbContext
**ChatBotDbContext**
- Entity Framework Core контекст
- Конфигурация таблиц
- Отношения между сущностями
```csharp
DbSet<ChatSessionEntity> ChatSessions
DbSet<ChatMessageEntity> ChatMessages
```
**Конфигурация:**
- Индексы для оптимизации
- Foreign Keys и Cascade Delete
- Constraints и Validation
### Repositories
#### ChatSessionRepository
**Ответственность:**
- Абстракция доступа к данным
- CRUD операции с сессиями
- Query оптимизация
**Методы:**
```csharp
GetByChatIdAsync() // По chat ID
CreateAsync() // Создать
UpdateAsync() // Обновить
DeleteAsync() // Удалить
GetAllAsync() // Все сессии
```
**Преимущества паттерна Repository:**
- Изоляция от EF Core
- Легкое тестирование
- Возможность смены ORM
### Entities (Сущности БД)
#### ChatSessionEntity
```csharp
Id // PK
SessionId // Unique identifier
ChatId // Telegram chat ID
ChatType // private/group/supergroup
ChatTitle // Название чата
Model // AI модель
CreatedAt // Дата создания
LastUpdatedAt // Последнее обновление
Messages // Коллекция сообщений
```
#### ChatMessageEntity
```csharp
Id // PK
SessionId // FK → ChatSessionEntity
Content // Текст сообщения
Role // user/assistant/system
MessageOrder // Порядок в диалоге
CreatedAt // Дата создания
```
## 4⃣ Infrastructure Layer (Инфраструктура)
### External Services
#### PostgreSQL
**Функции:**
- Persistent storage сессий
- Транзакционность
- ACID гарантии
**Оптимизации:**
- Индексы на ChatId, SessionId
- Connection pooling
- Query optimization
#### Ollama
**Функции:**
- Локальные LLM модели
- Streaming responses
- Multiple models support
**Адаптер:**
```csharp
OllamaClientAdapter : IOllamaClient
```
Абстрагирует от конкретной реализации OllamaSharp.
#### Telegram Bot API
**Функции:**
- Получение updates
- Отправка сообщений
- Управление ботом
**Wrapper:**
```csharp
TelegramBotClientWrapper : ITelegramBotClientWrapper
```
## 🔄 Взаимодействие слоев
### Правила взаимодействия
```
Presentation → Service → Data → Infrastructure
↓ ↓ ↓
Interfaces Interfaces Repository
```
**Принципы:**
- Слои зависят только от интерфейсов
- Вышестоящие слои не знают о нижестоящих
- Dependency Injection связывает реализации
### Пример: Обработка сообщения
```
1. TelegramBotService (Presentation)
↓ вызывает
2. TelegramMessageHandler (Presentation)
↓ вызывает
3. ChatService (Service)
↓ использует
4. ISessionStorage (Service Interface)
↓ реализован как
5. DatabaseSessionStorage (Service)
↓ использует
6. IChatSessionRepository (Data Interface)
↓ реализован как
7. ChatSessionRepository (Data)
↓ использует
8. ChatBotDbContext (Data)
↓ обращается к
9. PostgreSQL (Infrastructure)
```
## 🎯 Разделение ответственности
### Presentation Layer
- ✅ Обработка входящих запросов
- ✅ Валидация команд
- ✅ Форматирование ответов
- ❌ Бизнес-логика
- ❌ Доступ к данным
### Service Layer
- ✅ Бизнес-логика
- ✅ Координация сервисов
- ✅ Валидация бизнес-правил
- ❌ UI логика
- ❌ SQL запросы
### Data Layer
- ✅ CRUD операции
- ✅ Query построение
- ✅ Маппинг Entity ↔ Model
- ❌ Бизнес-логика
- ❌ UI логика
### Infrastructure Layer
- ✅ Внешние интеграции
- ✅ Конфигурация подключений
- ❌ Бизнес-логика
## 📚 См. также
- [Архитектура - Обзор](./overview.md)
- [Модели данных](./data-models.md)
- [Структура проекта](../development/project-structure.md)