BESTINDEX

Доверяем фактам, не маркетингу

Манифест и методология · v2

Сводка источников, которую можно проверить.

BestIndex собирает позиции независимых издателей и подтверждающие цитаты, а затем сводит их по открытым правилам. Итоговый индекс помогает сравнивать модели, но не является лабораторной истиной или вероятностью качества.

01

Не пишем сами

BestIndex не публикует собственных обзоров. Мы — мета-сервис, который агрегирует чужие тесты и измерения.

02

Не берём денег

Не размещаем брендовые материалы и партнёрки на странице оценки. Никакой замаскированной рекламы.

03

Открытая формула

Веса источников, правила сводного индекса и журнал изменений открыты. Вклад можно проследить до обзора и цитаты.

Сводный индекс источников

// один независимый издатель даёт один субъективный голос
base_index = floor(10 × Σ (source_weight × review_role × source_rating)
                              / Σ (source_weight × review_role))
source_index = max(0, base_indexdefect_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 отдельно показывает долю негативных и смешанных итогов; оно не измеряет межиздательское расхождение и не является вероятностью.

9–18
Параметров (claims)
на категорию: камера, батарея, шум, навигация и т.п.
0–1
Вес источника
редакционная настройка внутри уже допущенного класса издателя
≥3
Минимум издателей
для публикации нужны три независимых субъективных голоса
AI + редактор
Происхождение входов
AI извлекает, редактор проверяет контрольную выборку

Роли обзоров

Роль обзора влияет на субъективный вклад. Полноценный тест значит больше, чем краткое упоминание. Производители, маркетплейсы и агрегаторы могут давать характеристики, цены и официальные факты, но не участвуют в субъективном индексе.

×1.0

Primary

Полноценный обзор с тестами, измерениями, развёрнутыми оценками. Работают с моделью неделями.

×0.7

Secondary

Подборки, обзоры по презентации, сжатые заметки от знакомых редакторов.

×0.4

Supplemental

Новости, упоминания в контексте сравнений, форумные ветки. Учитываем, но скромно.

Источники, которым мы доверяем

Мы отдельно храним класс издателя и формат материала. Только источники, которым разрешён субъективный сигнал, влияют на сводный индекс; остальные остаются полезны для фактов, цен и предупреждений.

Все источники

Загружаем список проверенных источников…

Авториски

Вместе со сводным индексом система показывает риски и качество данных. Это подсказки для чтения, а не вероятности.

Мало данных Меньше 3 независимых rated-издателей
Устаревшие обзоры Все обзоры старше 2 лет
Повторяющаяся критика минимум 2 тезиса получили итоговый статус disagree
Слабая надёжность Тезис «Надёжность» в disagree/mixed
Один тип источников Все обзоры одного типа источника

Главная: «Модель недели» и «Недавние проверки»

Hero-карточка и блок свежих пересчётов на главной — не редакторский выбор и не рандом, а две детерминированные выборки из каталога с открытыми правилами.

Модель недели

Hero-карточка на главной — не «самая популярная» и не «с самым высоким score». Это лучшая среди тех, кого реально качественно разобрали. Логика идёт в три шага: барьер допуска → ранжирование по showcase score → детерминированная ротация по ISO-неделе внутри топ-10.

Шаг 1. Барьер допуска — карточка обязана соответствовать всем условиям одновременно:

  • status = published — карточка опубликована
  • score ≥ 75 — технический порог сводного индекса не ниже 75
  • confidence ≥ 65 — технический индекс качества данных не ниже 65; это не вероятность
  • source_reviews ≥ 3 — минимум три реальных рецензии (считаем по таблице source_reviews, а не по JSONB source_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, 10.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)

Если карточки существуют, но ни одна не прошла оба строгих фильтра, мы покажем до пяти лучших как предварительный результат с предупреждением. Пустая выдача остаётся только для действительно пустой категории или жёстких фильтров без совпадений.

≥60
Минимум качества данных
Это технический порог покрытия, а не вероятность правильности
≥70%
От лучшей в выборке
Чтобы 5-й результат не оказался слабее лидера в полтора раза
0–5
Сколько вернём
Только реально подходящие — никаких заглушек ради круглого числа
JSON
Веса в админке
weights_json у каждой опции вопроса — редакция настраивает без релиза

Как ответ влияет на формулу

  1. Hard-фильтры (категория обязательно, бренд/минимальный score и характеристики — опционально из filter_json опции): убирают модели, которые точно не подходят. Бюджет допускает запас до 15%; модель с подтверждённой ценой заметно выше лимита не попадает в обычные совпадения, а неизвестная цена честно остаётся состоянием «нет данных».
  2. Веса тезисов (weights_json.claims): каждая ваша опция говорит «эти 1–3 тезиса для меня важны». Положительный итог (model_claim.status = agree) даёт полный fit, смешанный — частичный, негативный (disagree) — нулевой.
  3. Текстовые подсказки (fit_for_keywords / not_fit_for_keywords): безопасно сопоставляем начало слова в редакторских полях fit_for / not_fit_for, учитывая отрицания и известные ложные совпадения. Это tie-breaker максимум ±5 на модель, а не замена подтверждённым тезисам.
  4. Сортировка и отсечка: сортируем по 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 вопросов — подберём модели с высоким консенсусом источников.

Подобрать модель