ML-слой¶
Общая архитектура¶
ML Layer (backend/src/ml/)
│
├── core/ # Базовая инфраструктура
│ ├── client.py # OpenAI-клиент с retry и concurrency control
│ ├── memory.py # In-memory история диалога
│ ├── progress.py # Mixin отслеживания прогресса
│ └── rag/ # RAG-пайплайн для ОКПД2
│ ├── hybrid_search.py # Гибридный поиск (embeddings + BM25)
│ └── bm25.py # BM25-реализация (mmh3, tokenizers)
│
├── processors/ # Процессоры бизнес-операций
│ ├── chapters.py # Генерация и обновление глав
│ ├── characteristics.py # Генерация характеристик
│ └── editing.py # Редактирование ячеек и таблиц
│
├── agents/ # LangGraph-агенты
│ └── tz_agent.py # Агент для работы с документом
│
├── okpd2/ # Классификация по ОКПД2
│ └── service.py # Сервис классификации
│
├── prompts/ # Шаблоны промптов
│ ├── chapters/ # Промпты для генерации глав
│ ├── characteristics/ # Промпты для характеристик
│ ├── editing/ # Промпты для редактирования
│ └── extraction/ # Промпты для извлечения данных
│
└── ml_adapter.py # Высокоуровневый фасад для domain layer
LLM-клиент (core/client.py)¶
Центральный компонент взаимодействия с OpenAI API.
Конфигурация:
| Параметр | Значение по умолчанию | Описание |
|---|---|---|
OPENAI_MODEL |
gpt-4.1 | Основная модель |
OPENAI_MODEL_SMALL |
gpt-4.1-mini | Облегчённая модель |
OPENAI_MODEL_TZ_AGENT |
gpt-5.1 | Модель для чатового окна |
OPENAI_MAX_CONCURRENCY |
12 | Максимум параллельных запросов |
OPENAI_TIMEOUT |
60 сек | Таймаут одного запроса |
| Retry | 5 попыток, factor=2 | Экспоненциальный backoff |
Методы:
| Метод | Назначение |
|---|---|
call_with_schema(prompt, schema) |
Структурированный вывод: ответ парсится в Pydantic-модель |
call_with_function(prompt, tools) |
Вызов функций (function calling) |
call_with_web_search(query) |
Поиск в интернете с трейсингом через LangSmith |
Fallback-стратегия: при недоступности основной модели система последовательно пробует: gpt-4.1-mini → gpt-5.1.
Процессоры¶
ChaptersProcessor (processors/chapters.py)¶
Отвечает за генерацию и обновление глав ТЗ.
| Метод | Описание |
|---|---|
generate_chapter_description() |
Генерация содержимого главы по шаблону и контексту |
generate_additional_chapters() |
Генерация опциональных глав (гарантии, упаковка и т.д.) |
determine_affected_chapters() |
Определение глав, требующих пересчёта после изменений |
regenerate_chapter_by_changes() |
Перегенерация главы с учётом внесённых изменений |
search_all_normative_docs() |
Поиск нормативных документов (ГОСТ) с LLM-верификацией |
Поиск нормативных документов:
- LLM генерирует список релевантных ГОСТ на основе контекста.
- Результаты верифицируются вторым LLM-вызовом (проверка существования, актуальности).
- Верифицированные документы включаются в главу.
CharacteristicsProcessor (processors/characteristics.py)¶
Генерация характеристик для товаров и услуг.
| Метод | Описание |
|---|---|
generate_item_characteristics() |
Основные и дополнительные характеристики товаров |
generate_service_characteristics() |
Характеристики услуг и работ |
Процесс:
- Классификация товара/услуги по ОКПД2 (через Qdrant RAG).
- Генерация основных характеристик (LLM с учётом ОКПД2 и контекста).
- Генерация дополнительных характеристик (при наличии feature flag
RANGE).
EditingProcessor (processors/editing.py)¶
Редактирование характеристик по пользовательским инструкциям.
| Метод | Описание |
|---|---|
edit_cell() |
Редактирование одной характеристики с LLM-комментарием |
edit_table() |
Модификация таблицы характеристик: добавление, удаление, обновление, переименование строк |
Типы действий при редактировании таблицы:
| Действие | Описание |
|---|---|
add |
Добавление новой характеристики |
remove |
Удаление существующей характеристики |
update |
Изменение значения характеристики |
rename |
Переименование характеристики |
RAG-пайплайн ОКПД2 (core/rag/)¶
Гибридный поиск для классификации товаров и услуг по ОКПД2.
Компоненты:
- Векторный поиск — эмбеддинги OpenAI (text-embedding-3-large), хранятся в Qdrant.
- BM25 — лексический поиск по терминам (mmh3 хэширование, tokenizers).
- Fusion — объединение результатов двух методов поиска.
Параметры:
| Параметр | Значение | Описание |
|---|---|---|
| Score threshold | 0.20 | Минимальный порог релевантности |
| Prefetch multiplier | 6x | Множитель предварительной выборки |
| Коллекции | okpd2 / okpd2_prod |
Dev / Production коллекции |
TZAgent (agents/tz_agent.py)¶
AI-агент на базе LangGraph для интерактивной работы с документом.
Архитектура агента:
Пользовательское сообщение
│
▼
┌─────────────────┐
│Intent Classifier│ ← определяет намерение пользователя
└────────┬────────┘
│
▼
┌─────────────────┐
│ Tool Selection │ ← выбирает инструмент
└────────┬────────┘
│
┌────┼────┬────────┬──────────┐
▼ ▼ ▼ ▼ ▼
chapter char basic swap text
_tool _tool _params _tool response
_tool
Доступные инструменты агента:
| Инструмент | Назначение |
|---|---|
chapter_tool |
Добавление/изменение глав документа |
char_tool |
Модификация характеристик |
basic_params_tool |
Изменение базовых параметров (сроки, адреса, количество) |
swap_tool |
Замена товара/услуги с перегенерацией характеристик |
Промпты (prompts/)¶
Шаблонизированные промпты для всех ML-операций. Организованы по категориям:
- chapters/ — системные промпты для генерации, обновления и анализа глав;
- characteristics/ — промпты для генерации характеристик товаров и услуг;
- editing/ — промпты для редактирования ячеек и таблиц;
- extraction/ — промпты для извлечения структурированных данных из текста.
Feature flags в промптах:
| Флаг | Описание |
|---|---|
RANGE |
Включает генерацию диапазонов значений (например, «от 2.0 до 3.2 GHz») |
GOSTS |
Включает поиск и добавление нормативных документов |
Трейсинг и мониторинг ML¶
- LangSmith — трейсинг всех LLM-вызовов через декоратор
@traceable. - Метрики — латентность OpenAI-вызовов, количество ошибок, rate-limit hits.
- Переменные:
LANGSMITH_TRACING=true,LANGSMITH_API_KEY.