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

9.7 KiB
Raw Permalink Blame History

🏛️ Слои приложения

Детальное описание каждого слоя архитектуры 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

public interface ITelegramCommand
{
    string Command { get; }
    string Description { get; }
    Task<ReplyInfo> ExecuteAsync(TelegramCommandContext context);
}

Каждая команда:

  • Изолирована
  • Легко тестируется
  • Независимо расширяема

2 Service Layer (Бизнес-логика)

Core Services

ChatService

Ответственность:

  • Управление сессиями чатов
  • Координация между AI и storage
  • Обработка сообщений пользователей

Методы:

GetOrCreateSession()      // Получить/создать сессию
ProcessMessageAsync()     // Обработать сообщение
ClearHistoryAsync()       // Очистить историю
UpdateSessionParameters() // Обновить параметры

Взаимодействия:

  • IAIService → Генерация ответов
  • ISessionStorage → Хранение сессий
  • IHistoryCompressionService → Оптимизация истории

AIService

Ответственность:

  • Генерация ответов через Ollama
  • Управление retry логикой
  • Таймауты и error handling

Методы:

GenerateChatCompletionAsync()              // Базовая генерация
GenerateChatCompletionWithCompressionAsync() // С сжатием

Особенности:

  • Экспоненциальный backoff
  • Streaming responses
  • Timeout handling
  • System prompt injection

HistoryCompressionService

Ответственность:

  • Суммаризация длинной истории
  • Оптимизация контекста
  • Сохранение важной информации

Алгоритм:

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

Методы:

ShouldCompress()         // Проверка необходимости
CompressHistoryAsync()   // Выполнить сжатие
SummarizeMessageAsync()  // Суммаризировать одно сообщение

SystemPromptService

Ответственность:

  • Загрузка системного промпта
  • Кеширование промпта
  • Обработка ошибок чтения файла

ModelService

Ответственность:

  • Управление AI моделями
  • Получение списка доступных моделей
  • Переключение между моделями

Storage Services

DatabaseSessionStorage

Ответственность:

  • Сохранение сессий в PostgreSQL
  • CRUD операции через репозиторий
  • Синхронизация с базой данных

Методы:

GetOrCreate()           // Получить или создать
Get()                   // Получить по ID
SaveSessionAsync()      // Сохранить сессию
Remove()                // Удалить сессию
CleanupOldSessions()    // Очистка старых

Особенности:

  • Автоматическая конвертация Entity ↔ Model
  • Lazy loading сессий
  • Кеширование в памяти

InMemorySessionStorage

Ответственность:

  • Хранение сессий в памяти
  • Быстрый доступ для тестов
  • Не требует БД

Использование:

  • Unit тесты
  • Development режим
  • Прототипирование

3 Data Access Layer (Доступ к данным)

DbContext

ChatBotDbContext

  • Entity Framework Core контекст
  • Конфигурация таблиц
  • Отношения между сущностями
DbSet<ChatSessionEntity> ChatSessions
DbSet<ChatMessageEntity> ChatMessages

Конфигурация:

  • Индексы для оптимизации
  • Foreign Keys и Cascade Delete
  • Constraints и Validation

Repositories

ChatSessionRepository

Ответственность:

  • Абстракция доступа к данным
  • CRUD операции с сессиями
  • Query оптимизация

Методы:

GetByChatIdAsync()      // По chat ID
CreateAsync()           // Создать
UpdateAsync()           // Обновить
DeleteAsync()           // Удалить
GetAllAsync()           // Все сессии

Преимущества паттерна Repository:

  • Изоляция от EF Core
  • Легкое тестирование
  • Возможность смены ORM

Entities (Сущности БД)

ChatSessionEntity

Id              // PK
SessionId       // Unique identifier
ChatId          // Telegram chat ID
ChatType        // private/group/supergroup
ChatTitle       // Название чата
Model           // AI модель
CreatedAt       // Дата создания
LastUpdatedAt   // Последнее обновление
Messages        // Коллекция сообщений

ChatMessageEntity

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

Адаптер:

OllamaClientAdapter : IOllamaClient

Абстрагирует от конкретной реализации OllamaSharp.

Telegram Bot API

Функции:

  • Получение updates
  • Отправка сообщений
  • Управление ботом

Wrapper:

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

  • Внешние интеграции
  • Конфигурация подключений
  • Бизнес-логика

📚 См. также