Технологии
Справочник технологий подбора.
| Код и технология | Роль / стек | Где и цена | ||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
T1 Лексический поиск
Совпадение слов, артикулов и чисел; синонимов не понимает.
|
Отбор кандидатов
rank_bm25, rapidfuzz
|
Хаб
Бесплатно
|
||||||||||||||||||||||||||||||||||||||||||||||||
Лексический поиск
⚠️ BM25 даёт 0.0 на крошечном корпусе — свойство IDF, не ошибка. На тысячах позиций не проявляется. ⚠️ Пороги отсекают часть верных кандидатов — калибровать заново. ✅ Мгновенно и бесплатно. В гибриде даёт лексический сигнал там, где вектор путает монтаж с демонтажом. recall@k — доля запросов, где верный ответ попал в топ-k: показывает, сколько кандидатов отдавать дальше по цепочке. ⚠️ Прочерк — «не замерено». Ждём прогона на BAO (5345) и смете Х5 (50 работ, 33 с кодом).
ВариантыBM25, Нечёткое совпадение, TF-IDF, Символьные 3-граммы |
||||||||||||||||||||||||||||||||||||||||||||||||||
|
T2 Структурная фильтрация по ключам
Убирает заведомо неподходящее по свойствам; нужно обогащение.
|
Сужение пространства
собственный код, pymorphy3
|
Хаб
Бесплатно
|
||||||||||||||||||||||||||||||||||||||||||||||||
Фильтрация по свойствамНе ранжирует, а СУЖАЕТ: убирает заведомо неподходящее до дорогих технологий. Мягкий режим при пустой выборке откатывается к полному справочнику, жёсткий возвращает пустой список. ⚠️ Пустая ячейка не отсекает кандидата: пустое значит «неизвестно», а не «не подходит». ℹ️ Значения сравниваются нормализованными («ГКЛ» = «гкл»). Колонка, которой нет во втором массиве, в подборе не участвует. ⚠️ Мерить нечего: свойства появляются только после обогащения, на сырых наименованиях фильтр пропускает справочник целиком. ℹ️ Здесь важна не кривая по k, а «во сколько раз сузили» и «не выкинули ли верный ответ».
ВариантыФильтр по свойствам |
||||||||||||||||||||||||||||||||||||||||||||||||||
|
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 линейно, шкала абсолютная. Локальная модель
🛑 Порога, разделяющего своё и чужое, у неё НЕТ — диапазоны оценок пересекаются целиком. Только поставщик кандидатов. Порог по нескольким строкам — подгонка, расширение набора его ломает. ✅ Вектор считается ОДИН раз и кэшируется — этим отличается от Т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, и глубина списка выбирается именно тут.
ВариантыЯндекс 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-сообщении = кэш не срабатывает никогда и прогон дорожает в десятки раз. Порядок позиций должен быть стабильным — перестановка ломает префикс. 🔑 Смотреть на тариф КЭША, а не входа. Кэшированные токены набирают миллионы, их тариф и есть главный расход. По этой причине отключена 🔑 «Нашла больше» не делает модель лучше. Пропуск виден сразу — строка без пары. Ложное сопоставление уходит в расчёт молча и выглядит как работа. ⚠️ У Сбера 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 (не подключена) |
||||||||||||||||||||||||||||||||||||||||||||||||||
|
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 (не подключена) |
||||||||||||||||||||||||||||||||||||||||||||||||||
|
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 и были сравнимы.
ВариантыSPLADE, ColBERT-style |
||||||||||||||||||||||||||||||||||||||||||||||||||