Технологии

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

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

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

### Замер recall@k, 17.08.2026

Эталон Боронина: 33 работы с известным ответом, справочник БАО 4642 позиции.

Доля работ, у которых верный ответ попал в первые k кандидатов.

инструмент@1@3@5@10@20@100время
нечёткое совпадение1015202324262 с
BM25415161822297 с
TF-IDF410111719284 с
символьные 3-граммы441314213215 с
RRF все четыре4161821223328 с
RRF без TF-IDF41819212333
🛑 TF-IDF УДАЛЁН 17.08.2026. Проиграл соседям на каждой глубине recall@k, уникальных находок ноль, и в RRF он ВРЕДИЛ: без него @3 вырос с 16 до 18.
Рабочий набор — RRF из трёх: нечёткое + BM25 + 3-граммы. Даёт @100 = 33, то есть доводит до ЛЛМ ВСЕ верные ответы; дальше качество зависит только от модели.
ℹ️ Единого лидера нет: до @10 сильнее нечёткое совпадение (и оно же самое быстрое), на @100 — 3-граммы. Нечёткое не находит 7 работ из 33 ни на какой глубине, 3-граммы находят почти все.
⚠️ BM25 даёт 0.0 на крошечном корпусе — свойство IDF, не ошибка. На тысячах позиций не проявляется.
✅ Мгновенно и бесплатно. В гибриде даёт лексический сигнал там, где вектор путает монтаж с демонтажом.

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

Замер 14.08.2026 на эталоне Боронина: 33 сметные работы Х5, у которых в справочнике БАО (4642 позиции) есть верная норма. Поиск по наименованию. Остальные 17 работ эталона помечены «нет нормы» и в recall не входят — попадать там нечему.

🔑 Нечёткое совпадение — лучший инструмент на первом месте (30,3%), вдвое точнее BM25. Символьные 3-граммы — лучший поставщик кандидатов вглубь: 93,9% на топ-50. Верный ответ они почти всегда находят, только ставят не первым — ровно то, что нужно первым шагом каскада перед ЛЛМ.

recall@k@1@5@10@20@50@100
BM2512,1%48,5%54,5%66,7%78,8%87,9%
Нечёткое совпадение30,3%60,6%69,7%72,7%78,8%78,8%
TF-IDF12,1%33,3%51,5%57,6%75,8%84,8%
Символьные 3-граммы12,1%39,4%42,4%63,6%93,9%97,0%
🛑 Пороги на этих данных НЕ КАЛИБРУЮТСЯ — облака оценок перекрываются. Замер по 17 работам «нет нормы» (верного ответа в справочнике не существует, любой уверенный ответ — ложное срабатывание) дал совпадающие медианы:
ИнструментВерные ответыЛучший чужой на «нет нормы»
BM253,9–93,0, медиана 22,411,4–37,9, медиана 22,2
Нечёткое совпадение46,6–100, медиана 63,348,5–100, медиана 66,7
TF-IDF5,5–91,3, медиана 23,810,5–53,0, медиана 25,2
Символьные 3-граммы17,5–94,5, медиана 36,727,6–66,5, медиана 37,7

У нечёткого совпадения медиана на отказных строках ДАЖЕ ВЫШЕ, чем у верных ответов. Любой порог отсекает больше правильного, чем ложного: у BM25 баланс «верных минус ложных» падает с +12 при пороге 0 до +5 при 40.

Вывод: лексика не умеет отличать «нашёл» от «не нашёл» на сметных данных. Её место — поставщик кандидатов вглубь, а решение matched/no_match должен принимать следующий слой каскада: фильтр по свойству или ЛЛМ. Пороги оставлены прежними — подгонять их под шум значило бы выдать случайность за калибровку.

Варианты

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

T2 Сопоставление по свойствам Сверяет выбранное свойство без мягкого отката; нужно обогащение.
Решение по свойству
собственный код
Хаб
Бесплатно
Точное совпадение

Точное совпадение — решающий инструмент Т2. Он сравнивает одно выбранное свойство после normalize_text, оставляет только равные значения с оценкой 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).
ℹ️ Здесь кривая по k важнее всего: Т3 — поставщик кандидатов для Т4 и Т5, и глубина списка выбирается именно тут.

Замер 14.08.2026 на эталоне Боронина: 33 сметные работы Х5 против справочника БАО (4642 позиции), поиск по наименованию. Та же выборка, что у Т1, — числа сравнимы напрямую.

🛑 Векторы НЕ превзошли лексику на сметных данных. Яндекс силён на первом месте (27,3% против 12,1% у BM25), но вглубь почти не растёт: на топ-50 у него 51,5% против 93,9% у символьных 3-грамм. Для роли «отдать кандидатов дальше» лексика здесь выгоднее и бесплатна.
⚠️ Прочерк в @20 — не мерилось в этом прогоне, а не «ноль». Сбер не замерен: локально нет сертификата НУЦ Минцифры, вызов падает до запроса. Локальная модель требует torch, которого на рабочей машине нет.
МодельГде@1@5@10@20@50@100
Яндекс text-search-doc + -queryAPI27,3%39,4%39,4%51,5%66,7%
Сбер Embeddings-2API
OpenAI text-embedding-3-smallAPI15,2%39,4%54,5%75,8%75,8%
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. Не складывать.
⚠️ 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