Технологии

Справочник технологий подбора.

Код и технология Роль / стек Где и цена
T1 Лексический поиск Совпадение слов, артикулов и чисел; синонимов не понимает.
Отбор кандидатов
rank_bm25, rapidfuzz
Хаб
Бесплатно
Лексический поиск

t1.bm25 частотный вес слов · t1.fuzzy опечатки и словоформы · t1.tfidf редкие слова · t1.ngram артикулы и обрывки.

⚠️ BM25 даёт 0.0 на крошечном корпусе — свойство IDF, не ошибка. На тысячах позиций не проявляется.
⚠️ Пороги отсекают часть верных кандидатов — калибровать заново.
✅ Мгновенно и бесплатно. В гибриде даёт лексический сигнал там, где вектор путает монтаж с демонтажом.

recall@k — доля запросов, где верный ответ попал в топ-k: показывает, сколько кандидатов отдавать дальше по цепочке.

⚠️ Прочерк — «не замерено». Ждём прогона на BAO (5345) и смете Х5 (50 работ, 33 с кодом).
recall@k@1@5@10@20@50@100
BM25
Нечёткое совпадение
TF-IDF
Символьные 3-граммы
Варианты

BM25, Нечёткое совпадение, TF-IDF, Символьные 3-граммы

T2 Структурная фильтрация по ключам Убирает заведомо неподходящее по свойствам; нужно обогащение.
Сужение пространства
собственный код, pymorphy3
Хаб
Бесплатно
Фильтрация по свойствам

Не ранжирует, а СУЖАЕТ: убирает заведомо неподходящее до дорогих технологий. Мягкий режим при пустой выборке откатывается к полному справочнику, жёсткий возвращает пустой список.

⚠️ Пустая ячейка не отсекает кандидата: пустое значит «неизвестно», а не «не подходит».
ℹ️ Значения сравниваются нормализованными («ГКЛ» = «гкл»). Колонка, которой нет во втором массиве, в подборе не участвует.
⚠️ Мерить нечего: свойства появляются только после обогащения, на сырых наименованиях фильтр пропускает справочник целиком.
ℹ️ Здесь важна не кривая по k, а «во сколько раз сузили» и «не выкинули ли верный ответ».
recall@k@1@5@10@20@50@100
Фильтр по свойствам
Варианты

Фильтр по свойствам

T3 Векторный поиск (API и локально) Близость векторов смысла: ловит разные формулировки одного и того же.
Отбор кандидатов
Embeddings API, sentence-transformers
Хаб
Разовая оплата либо бесплатно локально
Векторный поиск

Цена за 1000 позиций: OpenAI 0,03 ₽ · Яндекс 0,04 ₽ · Сбер 0,28 ₽ · локально 0 ₽ (нужен torch, ~1,1 ГБ). Сбер быстрее всех — 100 строк за запрос, у Яндекса пакетного режима нет.

🛑 Векторы плохо различают монтаж и демонтаж — для эмбеддинга тема одна. Словарь антонимов не добавляем: случай закрывает гибрид.
⚠️ У Яндекса модели ПАРНЫЕ: text-search-doc кодирует справочник, text-search-query — искомую строку. Это не выбор, а обязательная пара: при обмене ролями оценки выше, а РАЗДЕЛЯЮТ хуже. У остальных провайдеров одна модель на оба массива.
ℹ️ В таблице — модели, что вызываются сейчас. У Сбера есть ещё Embeddings, EmbeddingsGigaR, GigaEmbeddings-3B-2025-09 (цена одна), у OpenAI 3-large. Проверено по API 10.08.2026.
⚠️ В одиночку для боевого подбора не годится — только в гибриде или каскаде.
🛑 У Сбера эмбеддинги требуют оплаченного пакета (402). OpenAI из России отвечает 403, нужен прокси; с хаба работает напрямую.
ℹ️ Векторы кэшируются под именем модели — третий, свой кэш, не провайдера и не решений. Косинус переводится в 0…100 линейно, шкала абсолютная.
Локальная модель

multilingual-e5-large — такой же инструмент Т3, как провайдеры: роль одна, отличается где считается вектор.

🛑 Порога, разделяющего своё и чужое, у неё НЕТ — диапазоны оценок пересекаются целиком. Только поставщик кандидатов. Порог по нескольким строкам — подгонка, расширение набора его ломает.
✅ Вектор считается ОДИН раз и кэшируется — этим отличается от Т5, которая пересчитывает каждую пару.
⚠️ Локально доступна только GigaEmbeddings-3B (MIT), но НЕ ИЗМЕРЕНА: просит 6,4 ГБ против 3,8 на хабе и старую версию transformers. У Яндекса весов нет, у Сбера остальные закрыты (401).
ℹ️ По ruMTEB e5 даёт 65,5 — слабейшая из русских моделей (GigaEmbeddings 69,1, Qwen3-8B 70,6).
⚠️ Прежние числа убраны. Они и не были recall@k: мерилось решение matched/no_match при текущих порогах, то есть @1 с отсечкой.
ℹ️ Здесь кривая по k важнее всего: Т3 — поставщик кандидатов для Т4 и Т5, и глубина списка выбирается именно тут.
МодельГде@1@5@10@20@50@100
Яндекс text-search-doc + -queryAPI
Сбер Embeddings-2API
OpenAI text-embedding-3-smallAPI
multilingual-e5-largeлокально
Варианты

Яндекс text-search-doc + -query (API), Сбер Embeddings-2 (API), OpenAI text-embedding-3-small (API), multilingual-e5-large (локально)

T4 Генеративный поиск LLM (API и локально) Модель выбирает из кандидатов с обоснованием и умеет отказаться.
Принятие решения
Chat API, Ollama
Хаб
Оплата на строку, у Сбера бесплатно
ЛЛМ выбирает из кандидатов

Цена, ₽/1М: DeepSeek Flash 11,20 вход / 0,22 кэш / 22,40 выход · Pro 34,80 / 0,29 / 69,60 · четыре модели Сбера бесплатны (365 млн токенов в год).

🔑 Справочник обязан лежать в СИСТЕМНОЙ части промпта. Провайдеры кэшируют неизменный ПРЕФИКС: справочник в user-сообщении = кэш не срабатывает никогда и прогон дорожает в десятки раз. Порядок позиций должен быть стабильным — перестановка ломает префикс.

🔑 Смотреть на тариф КЭША, а не входа. Кэшированные токены набирают миллионы, их тариф и есть главный расход. По этой причине отключена gpt-5.6-terra: по входу умеренная, по кэшу в 178 раз дороже DeepSeek.

🔑 «Нашла больше» не делает модель лучше. Пропуск виден сразу — строка без пары. Ложное сопоставление уходит в расчёт молча и выглядит как работа.

⚠️ У Сбера prompt_tokens НЕ включает кэшированные токены, у DeepSeek они разложены на hit/miss. Не складывать.
⚠️ LLMDecisionCache — ДРУГОЙ кэш, наш. Перед замером чистить, иначе прогон выглядит успешным, а запросы к провайдеру не уходят.
⚠️ max_tokens не меньше 256. При 32 ответ приходит ПУСТЫМ — лимит уходит на рассуждения. Выглядит как сбой сети.
⚠️ Предел контекста YandexGPT — 32 768 токенов: больше ~900 позиций в прямом режиме не работает.
🛑 standalone_catalog_limit = 1000 — НАША настройка, а не предел модели. Годами стояла на 50 и выдавалась за свойство ЛЛМ. Больше тысячи не проверялось.
ℹ️ Пустой ответ на пачке без подходящего кандидата — штатный отказ, не сбой. Кэш: DeepSeek автоматически, GigaChat по X-Session-ID, OpenAI слабее (−50…−75 %), Яндекс не документирован.
ℹ️ Т4 не выдаёт список, а выбирает одного кандидата или отказывается — recall@k неприменим. Прежние числа убраны, меряем заново на BAO и смете Х5.
🛑 Страница уже переписывалась дважды из-за ошибок ЗАМЕРА, а не моделей. Сперва прогон шёл по кэшу решений, потом ярлык вызова был зашит в коде и выборка ловила чужие вызовы. Отсюда: чистить кэш, задавать source явно, сверять число вызовов с ожидаемым.
МодельПопаданийОтказовЛожных
DeepSeek Flash
DeepSeek Pro
GigaChat-2
GigaChat-2 Pro
GigaChat-2 Max
GigaChat-3 Ultra
GPT-5.6 luna
YandexGPT Lite
YandexGPT Pro
Qwen3-235B через API Яндекса (не подключена)
Qwen3 локально через Ollama (не подключена)
Варианты

DeepSeek Flash, DeepSeek Pro, GigaChat-2, GigaChat-2 Pro, GigaChat-2 Max, GigaChat-3 Ultra, GPT-5.6 luna, YandexGPT Lite, YandexGPT Pro, Qwen3-235B через API Яндекса (не подключена), Qwen3 локально через Ollama (не подключена)

T5 Cross-encoder переранжирование Перечитывает пару целиком и переставляет кандидатов; на русском слаба.
Уточнение порядка
sentence-transformers CrossEncoder
Хаб (нужен torch)
Бесплатно после установки
Качество решений

Т5 ничего не ищет — она переставляет то, что ей дали. Поэтому её меряют не recall@k, а тем, улучшился ли порядок после переранжирования.

🛑 В прежнем виде технология НЕ УЛУЧШАЛА результат. Верные ответы получали оценки ниже порога: mmarco-mMiniLM обучена на английском корпусе MS MARCO, русская строительная терминология ей чужая. Перед боевым использованием проверить bge-reranker-v2-m3 (2,3 ГБ, заявлена сильнее на многоязычных) и перекалибровать порог.
🛑 Упирается в процессор и НЕ кэшируется. Пара «запрос × кандидат» считается заново каждый раз: 1000 строк при top-50 — это 50 000 прогонов. Этим принципиально отличается от эмбеддингов, где вектор считается один раз.

Бесплатна после установки, но живёт только на хабе: нужен torch, локально не ставится.

🛑 Реранкера нет ни у Яндекса, ни у Сбера — замену в облаке не найти.
⚠️ Прежние числа убраны — меряем заново.
МодельПопаданийОценки верныхПорог
mmarco-mMiniLM
bge-reranker-v2-m3 (не подключена)
Варианты

mmarco-mMiniLM, bge-reranker-v2-m3 (не подключена)

T6 Обучаемый классификатор Учится на подтверждённых сопоставлениях; растёт от объёма работы.
Принятие решения
scikit-learn
Хаб
Бесплатно плюс датасет
Качество решений

Для запуска нужен размеченный набор пар «строка сметы → шифр». Сейчас эталон — 50 пар, для обучения мало, нужны сотни.

ℹ️ Единственная технология, которая улучшается от объёма уже сделанной работы: чем больше подтверждённых сопоставлений накопит сервис, тем она точнее.
ℹ️ У Яндекса есть три классификатора (YandexGPT 5 Pro / 5 Lite / 4 Lite). Для подбора по справочнику не годятся — нужен заранее заданный список категорий. Но для обогащения свойств («вид работ», «раздел сметы») подходят прямо.
⚠️ Не реализована — мерить нечего. Сетка стоит здесь, чтобы числа легли рядом с Т4 и были сравнимы.
МодельПопаданийОтказовЛожных
логистическая регрессия
градиентный бустинг
Варианты

логистическая регрессия, градиентный бустинг

T7 Sparse retrieval / SPLADE Скорость индекса как у Т1, смысловые связи как у Т3.
Отбор кандидатов
SPLADE, ColBERT-style
Воркер с GPU
Нужна GPU для индексации
Качество отбора · recall@k

Обученная модель сама решает, какие слова и синонимы добавить в индекс и с каким весом. Скорость инвертированного индекса как у Т1, но со смысловыми связями как у Т3 — теоретически снимает необходимость в гибриде.

Требует GPU для индексации и живёт на воркере, а не на хабе. Модели: SPLADE, ColBERT-style.

⚠️ У Hetzner GPU только помесячно (GEX44 от 184 €/мес) — для разовой индексации три четверти денег уходят на простой. Разумнее RunPod с посекундной оплатой.
⚠️ Не реализована — мерить нечего. Сетка стоит здесь, чтобы числа легли рядом с Т1 и Т3 и были сравнимы.
recall@k@1@5@10@20@50@100
SPLADE
ColBERT-style
Варианты

SPLADE, ColBERT-style