Files
Deal/src/ml-service/Deal.Ml/Model/ModelConstants.cs
T
Rustam Khalimov 9e07568ddd Инициализировать репозиторий «Дейл»
Первый коммит: модульный монолит ядра (.NET 10) и gRPC-сервисы
ai/ml/telegram, фронтенд Vue 3/Vite/Tailwind, документация (ТЗ,
инструкция пользователя, техдокументация, код-стайл), бэклог,
скрипты развёртывания и архив прототипа LeadRadar.
2026-09-11 02:50:17 +03:00

155 lines
6.1 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
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.
namespace Deal.Ml.Model;
/// <summary>
/// Пороги и константы наивно-байесовской модели по терминам (Ruling 4; 1:1
/// mlservice/model.py L2031, L4255, L178181). Именованные константы вместо магических
/// чисел (код-стайл этапа); значения НЕ входят в .proto-контракт (README src/contracts L164166).
/// </summary>
public static class ModelConstants
{
/// <summary>
/// Суммарно примеров по всем классам, чтобы модель «включилась» (MIN_TOTAL).
/// </summary>
public const double MinTotalExamples = 20.0;
/// <summary>
/// Минимум примеров у класса-победителя (не-спам; MIN_WINNER).
/// </summary>
public const double MinWinnerExamples = 6.0;
/// <summary>
/// Минимум примеров у класса-победителя «spam» (MIN_WINNER_SPAM).
/// </summary>
public const double MinWinnerSpamExamples = 4.0;
/// <summary>
/// Минимум различных терминов, встреченных у победителя (MIN_HITS).
/// </summary>
public const int MinHits = 2;
/// <summary>
/// Минимум примеров класса типа t:*, чтобы ML выдавал тип (MIN_TYPE_WINNER).
/// </summary>
public const double MinTypeWinnerExamples = 4.0;
/// <summary>
/// Метка класса «спам» (специальная роль — порог 4 и «корзина» карточки).
/// </summary>
public const string SpamLabel = "spam";
/// <summary>
/// Префикс внутренних классов типа заявки (t:hire/t:order отсекаются из колонок).
/// </summary>
public const string TypeLabelPrefix = "t:";
/// <summary>
/// Внутренний класс типа заявки «найм» (в UI — hire).
/// </summary>
public const string TypeClassHire = "t:hire";
/// <summary>
/// Внутренний класс типа заявки «разовая сделка» (в UI — order).
/// </summary>
public const string TypeClassOrder = "t:order";
/// <summary>
/// Множитель prior при ранжировании классов: score + 3·prior (predict L226256).
/// </summary>
public const double PriorWeight = 3.0;
/// <summary>
/// ln-отрыв от второго класса на старте (MARGIN; адаптив 0.35/0.5/0.7 — см. ниже).
/// </summary>
public const double InitialMargin = 0.9;
/// <summary>
/// Суммарно примеров, после которых порог отрыва — 0.7.
/// </summary>
public const double TotalExamplesForMargin0_7 = 60.0;
/// <summary>
/// Суммарно примеров, после которых порог отрыва — 0.5.
/// </summary>
public const double TotalExamplesForMargin0_5 = 150.0;
/// <summary>
/// Суммарно примеров, после которых порог отрыва — 0.35.
/// </summary>
public const double TotalExamplesForMargin0_35 = 400.0;
/// <summary>
/// Адаптивный отрыв после 60 примеров.
/// </summary>
public const double MarginAfter60Examples = 0.7;
/// <summary>
/// Адаптивный отрыв после 150 примеров.
/// </summary>
public const double MarginAfter150Examples = 0.5;
/// <summary>
/// Адаптивный отрыв после 400 примеров.
/// </summary>
public const double MarginAfter400Examples = 0.35;
/// <summary>
/// Окно самооценки, которое отдаётся в /status (EVAL_WINDOW).
/// </summary>
public const int EvalWindowSize = 50;
/// <summary>
/// Сколько последних решений самооценки хранится в БД модели (EVAL_KEEP).
/// </summary>
public const int EvalKeepCount = 200;
/// <summary>
/// Сколько лучших весов классов отдаётся в predict (scores ≤ 5).
/// </summary>
public const int MaxScoresInReply = 5;
/// <summary>
/// Сколько узнанных терминов отдаётся в predict (terms ≤ 8).
/// </summary>
public const int MaxMatchedTerms = 8;
/// <summary>
/// Точность округления весов в scores (python round(…, 3)).
/// </summary>
public const int ScoresPrecision = 3;
/// <summary>
/// Точность округления весов классов в status (python round(…, 2)).
/// </summary>
public const int ClassesPrecision = 2;
/// <summary>
/// Точность округления отступа margin (python round(…, 2)).
/// </summary>
public const int MarginPrecision = 2;
/// <summary>
/// Точность округления доли верных в eval (python round(…, 3)).
/// </summary>
public const int AccuracyPrecision = 3;
/// <summary>
/// Минимальная длина токена, попадающего в модель (L83–86).
/// </summary>
public const int MinTokenLength = 3;
/// <summary>
/// Длина токена, при которой добавляется «хвостовой» префикс-термин.
/// </summary>
public const int MinTokenLengthForPrefix = 6;
/// <summary>
/// Длина префикса хвостового токена (w[:4]).
/// </summary>
public const int PrefixLength = 4;
/// <summary>
/// Префикс хвостового токена («~pyth» для «python») — не участвует в terms-подсказках.
/// </summary>
public const string TokenPrefixMarker = "~";
}