Методология
Сводка источников, которую можно проверить.
BestIndex собирает позиции независимых издателей и подтверждающие цитаты, а затем сводит их по открытым правилам. Итоговый индекс помогает сравнивать модели, но не является лабораторной истиной или вероятностью качества.
Не пишем сами
BestIndex не публикует собственных обзоров. Мы — мета-сервис, который агрегирует чужие тесты и измерения.
Не берём денег
Не размещаем брендовые материалы и партнёрки на странице оценки. Никакой замаскированной рекламы.
Открытая формула
Веса источников, правила сводного индекса и журнал изменений открыты. Вклад можно проследить до обзора и цитаты.
Сводный индекс источников
// один независимый издатель даёт один субъективный голос
base_index = floor(10 × Σ (source_weight × review_role × source_rating)
/ Σ (source_weight × review_role))
source_index = max(0, base_index − defect_penalty)
data_quality = 0.30 × publisher_coverage
+ 0.25 × trusted_share
+ 0.25 × claim_coverage
+ 0.20 × freshness
// подтверждённые дефекты дополнительно уменьшают data_quality на 5 пунктов
criticism_signal = (disagree_claims + 0.5 × mixed_claims)
/ all_claims × 100
// текущее поле controversy — критика/неоднозначность,
// а не межиздательское расхождение; единодушное «плохо» повышает сигнал Финальная арифметика детерминирована, но часть входных позиций и цитат извлекает AI. Редактор проверяет контрольные цитаты; поэтому индекс — проверяемая сводка источников, а не «оценка без AI». Текущее поле controversy отдельно показывает долю негативных и смешанных итогов; оно не измеряет межиздательское расхождение и не является вероятностью.
Роли обзоров
Роль обзора влияет на субъективный вклад. Полноценный тест значит больше, чем краткое упоминание. Производители, маркетплейсы и агрегаторы могут давать характеристики, цены и официальные факты, но не участвуют в субъективном индексе.
Primary
Полноценный обзор с тестами, измерениями, развёрнутыми оценками. Работают с моделью неделями.
Secondary
Подборки, обзоры по презентации, сжатые заметки от знакомых редакторов.
Supplemental
Новости, упоминания в контексте сравнений, форумные ветки. Учитываем, но скромно.
Источники, которым мы доверяем
Мы отдельно храним класс издателя и формат материала. Только источники, которым разрешён субъективный сигнал, влияют на сводный индекс; остальные остаются полезны для фактов, цен и предупреждений.
Загружаем список проверенных источников…
Авториски
Вместе со сводным индексом система показывает риски и качество данных. Это подсказки для чтения, а не вероятности.
Главная: «Модель недели» и «Недавние проверки»
Hero-карточка и блок свежих пересчётов на главной — не редакторский выбор и не рандом, а две детерминированные выборки из каталога с открытыми правилами.
Модель недели
Hero-карточка на главной — не «самая популярная» и не «с самым высоким score». Это лучшая среди тех, кого реально качественно разобрали. Логика идёт в три шага: барьер допуска → ранжирование по showcase score → детерминированная ротация по ISO-неделе внутри топ-10.
Шаг 1. Барьер допуска — карточка обязана соответствовать всем условиям одновременно:
status = published— карточка опубликованаscore ≥ 75— технический порог сводного индекса не ниже 75confidence ≥ 65— технический индекс качества данных не ниже 65; это не вероятностьsource_reviews ≥ 3— минимум три реальных рецензии (считаем по таблицеsource_reviews, а не по JSONBsource_consensus, который часто пуст до прогонаRecomputeService)
Шаг 2. Showcase score — непрерывный ранг среди допущенных:
showcase = 0.25 × score/100
+ 0.20 × confidence/100
+ 0.15 × breadth
+ 0.15 × consensus
+ 0.15 × freshness
+ 0.10 × depth
× risk_penalty
× editorial_boost
// компоненты:
breadth = min(1, ln(N+1) / ln(8)) // N = source_reviews. 3→0.67, 5→0.86, 7+→1.0
consensus = max(0, (agree − disagree − 0.5·mixed) / total_claims)
freshness = max(0, 1 − days_since_update / 365)
depth = avg(evidence_quality, info_density, competence) / 100
risk_penalty = max(0.75, 1 − 0.03 × risk_count)
editorial_boost = 1.05 if is_curated OR reviewed_by_editor else 1.00Что значит каждый компонент:
score / confidence— почти половина веса формулы. Это сводный индекс источников и эвристический индекс качества данных, а не проценты истинности.breadth— широта покрытия источниками. Логарифм с насыщением, чтобы 12 источников не били 7 в три раза.consensus— насколько источники согласны между собой. Если все спорят — компонент 0; если все за — 1. Дисcсент штрафуется сильнее, чем mixed.freshness— свежесть самого разбора: линейный спад от 1.0 (сегодня) до 0.0 (год и старше). Это отдельный сигнал от freshness внутри confidence — там про возраст обзоров, тут про возраст нашей агрегации.depth— глубина разбора по редакционным метрикам: качество доказательств, плотность информации, компетенция автора.risk_penalty— мягкий штраф за каждый зафиксированный риск (любой степени), не ниже×0.75.editorial_boost— небольшая надбавка за курирование или ручную проверку редактором. Не обязательное условие, просто приоритет.
Шаг 3. Ротация. Берём топ-10 по showcase и выбираем модель по номеру ISO-недели. Все посетители в течение одной недели видят одну модель, а в понедельник слот переключается на следующую из топа. Так чередуются именно «отличники», а не весь хвост каталога.
Эндпоинт: GET /api/cards/featured?period=week. Если ни одна карточка не прошла барьер допуска (true cold-start каталога), включается мягкий fallback по recommended-рангу без quality-фильтров — плюс предупреждение в логах, чтобы мы видели, что каталог пока ниже порога качества и не должен оставаться таким надолго.
Недавние проверки
Блок под hero показывает карточки, отсортированные по последнему событию scoring в журнале model_history: recomputed или score_changed, статус published. Это «что мы реально пересчитали недавно».
Эндпоинт: GET /api/cards/recently-scored. Под капотом — JOIN с model_history, GROUP BY карточке, MAX по дате события. Каждая модель появляется один раз с полем last_scored_at.
Косметические правки (переименование, загрузка картинки, изменение статуса) этот блок не двигают — только реальные прогоны через RecomputeService. Кнопка «История» в правом углу блока ведёт в каталог с более широкой сортировкой по updated_at, куда попадает любое изменение строки.
Подбор: как мы выбираем модели под ваши ответы
Подбор не строит новый рейтинг качества. Он использует уже посчитанные сводный индекс и индекс качества данных карточек, а ваши ответы только сдвигают вес тех тезисов, которые важны именно вам.
// Насколько модель подходит выбранным критериям.
claim_fit = agree: 1.00, mixed: 0.55, disagree: 0.00, unknown: 0.20
profile_fit = Σ(weight × claim_fit) / Σ(weight)
// Независимое качество карточки страхует от слабых рекомендаций.
quality = (card.score / 100) × (card.confidence / 100)
raw_score = 100 × (0.90 × profile_fit + 0.10 × quality)
// Редакторский tie-breaker: максимум один +5 и один −5 на модель.
base_with_headroom = 5 + 0.90 × raw_score
keyword_delta = (+5 if any safe fit hit else 0)
+ (−5 if any risk hit else 0)
match_score = clamp(base_with_headroom + keyword_delta, 0, 100)
// Строгий показ и честный fallback.
show(card) = card.confidence ≥ 60
AND match_score ≥ 70% от лидера в той же шкале
top-N = first 5 from sorted(show, by match_score desc)Если карточки существуют, но ни одна не прошла оба строгих фильтра, мы покажем до пяти лучших как предварительный результат с предупреждением. Пустая выдача остаётся только для действительно пустой категории или жёстких фильтров без совпадений.
Как ответ влияет на формулу
- Hard-фильтры (категория обязательно, бренд/минимальный score и характеристики — опционально из
filter_jsonопции): убирают модели, которые точно не подходят. Бюджет допускает запас до 15%; модель с подтверждённой ценой заметно выше лимита не попадает в обычные совпадения, а неизвестная цена честно остаётся состоянием «нет данных». - Веса тезисов (
weights_json.claims): каждая ваша опция говорит «эти 1–3 тезиса для меня важны». Положительный итог (model_claim.status = agree) даёт полный fit, смешанный — частичный, негативный (disagree) — нулевой. - Текстовые подсказки (
fit_for_keywords/not_fit_for_keywords): безопасно сопоставляем начало слова в редакторских поляхfit_for/not_fit_for, учитывая отрицания и известные ложные совпадения. Это tie-breaker максимум ±5 на модель, а не замена подтверждённым тезисам. - Сортировка и отсечка: сортируем по
match_score, применяем порог качества данных и относительный порог — оставляем результаты с достаточным покрытием входов.
Что меняется, если на вопрос можно выбрать несколько ответов
Некоторые вопросы намеренно multi-select: смартфон может быть нужен и «для фото», и «для игр»; в камере одинаково важны и «ночь», и «видео». В таких вопросах формула ведёт себя предсказуемо:
- Веса тезисов суммируются. Если две ваши опции бустят один и тот же тезис — его вес удваивается. Семантика: «вы дважды подтвердили, что это важно».
- Текстовые ключевые слова дедуплицируются. Одна и та же фраза в
fit_for_keywordsдвух опций даёт +5 за модель, а не +10. - Жёсткий фильтр бренда расширяется. Выбор двух брендов → разрешены оба.
- Жёсткие пороги (минимальный score, максимальная цена) берут самый строгий вариант. Это редкий случай — большинство «жёстких» опций сейчас в single-вопросах.
Из этого следует простое правило: не нужно отмечать «всё подряд». 5 галочек в одном вопросе либо ничего не изменят (если опции бустят разные тезисы), либо приведут к одному и тому же ранжированию, что и 1–2 точных ответа. Лучше выбирать 1–3 пункта, которые действительно важны.
Что показывает счётчик «Кандидаты» во время квиза
Каждый раз, когда вы меняете ответ, мы повторяем расчёт и показываем число моделей, оставшихся в пуле сравнения. «Кандидат» не означает, что модель прошла каждое условие: ответы меняют её процент и место, а одна слабая сторона не исключает устройство автоматически.
- До первого ответа счётчик показывает модели категории, прошедшие минимальную уверенность данных (
≥ 60). - После ответов остаются модели не ниже
70%результата лидера. В маленьком однородном каталоге число может не измениться, хотя порядок и проценты уже изменились. - Если для условия нет данных — например, у карточек ещё не подтверждена цена, — система помечает его как неизвестное и прямо сообщает, почему оно не сузило список.
Что мы предлагаем, если ничего не подошло
Когда match возвращает 0, квиз вызывает второй эндпоинт — /api/picker/relax. Он берёт ваши ответы и для каждого вопроса по очереди пробует убрать только этот ответ, перезапускает match и смотрит, насколько вырастет число подходящих моделей.
- Возвращается top-5 вариантов «снять X → +N моделей», отсортированных по приросту.
- Кнопка «Снять» сразу удаляет соответствующий ответ и возвращает вас к этому шагу — можно ответить иначе.
- Никакой магии: это тот же match-алгоритм, прогнанный ещё несколько раз. Цены те же отсечки, те же веса.
Что подбор учитывает, а что — пока нет
Прозрачность важнее красивой обещалки. Движок подбора поддерживает жёсткие фильтры по типизированным характеристикам, и значения уже загружены в пилотный каталог. Покрытие неоднородно: если у конкретной модели нет значения нужной характеристики, она не считается «нулевой» и не отбрасывается молча — по этому критерию показывается неопределённость, а итоговое ранжирование продолжается по доступным данным.
- Учитываем: ваши ответы повышают вес тех тезисов, по которым обзорщики в целом согласны (модель «хорошо моет», «тихая», «долго живёт от заряда»). Эти оценки берутся из агрегации
model_claims. - Используем при наличии данных: точные физические характеристики моделей — ёмкость батареи в мАч, объём пылесборника, диагональ экрана, тип установки, IP-рейтинг, наличие сушки. Для отдельных моделей или редких полей значение может отсутствовать; это отображается как «нет данных», а не как ноль.
- Что это значит для вас: если для выбранного ответа настроено измеримое условие и у модели есть соответствующее значение, оно отсекает неподходящие варианты. Если значения нет, модель не получает искусственный ноль: критерий помечается как неизвестный, а результат объясняет, какие данные нужно перепроверить в карточке.
- Что ещё улучшаем: расширяем покрытие характеристик у опубликованных моделей и редакторски проверяем спорные значения. Сам принцип уже работает как «hard-фильтр + soft-ранжирование внутри отфильтрованного» без отдельного ИИ-оценщика.
Save & resume
Кнопка «Сохранить и выйти» сохраняет ответы и добавляет подбор в раздел «Сохранённые подборы». Без авторизации он хранится в этом браузере, а после входа привязывается к учётной записи и становится доступен на других устройствах. Незавершённый подбор можно продолжить с сохранённого шага, а готовый — открыть вместе с результатами или отправить по короткой ссылке.
Не знаете, что выбрать?
Ответьте на 5 вопросов — подберём модели с высоким консенсусом источников.