---
title: Как работает поиск контента
description: Откуда берутся кандидаты в статьи — три класса источников, воронка независимых гейтов-отсеивателей и честное состояние каскада «дешёвое раньше дорогого».
locale: ru
version: 0.2.0
canonical: https://enterium-developer-docs.pages.dev/developers/ru/how-it-works/source-discovery/
---

> Documentation index: https://enterium-developer-docs.pages.dev/developers/llms.txt — every page of this portal has a Markdown twin at <route>.md; the frozen API contract is at https://enterium-developer-docs.pages.dev/developers/api/openapi.json.

**Проблема:** всё, что ниже по течению — генерация, качество, деньги, —
ограничено тем, что найдёт Collect. Скорми ему шум — и лучший в мире
пишущий пайплайн выдаст отполированный шум. Поэтому поиск оптимизирует
*плотность квалификации*, а не сырой объём харвеста.

## Слой 1 — три класса источников, намеренно неравных

```mermaid
flowchart LR
    subgraph SRC [Source classes]
      F[Curated feeds<br/>tiered, trusted]
      Q[Search harvest<br/>web + news surfaces,<br/>curator-authored queries]
      L[Legacy news API<br/>kept as fallback]
    end
    F --> H[Harvest pool]
    Q --> H
    L --> H
```

- **Кураторские фиды** — ранжированный, отобранный вручную список на
  контракт: высокая точность, низкая полнота; доверенный костяк.
- **Поисковый харвест** — рабочая лошадь: поисковый API опрашивается и по
  evergreen-, и по новостной поверхности, управляясь **авторскими
  запросами куратора** из онтологии контракта. Это не слепой скрапинг:
  набор запросов — сам по себе редакционный инструмент.
- **Legacy news API** — старший, менее точный харвестер, оставленный
  рядом с новым как фолбэк.

*Собственные* страницы сайта контракта кандидатами намеренно **не**
становятся — они кормят построение онтологии (о чём ниша), но никогда не
очередь статей.

## Слой 2 — воронка независимых гейтов

Единого поля «причина отсева» нет; отбраковка распределена по гейтам,
каждый из которых владеет ровно одной заботой:

```mermaid
flowchart TB
    H[Harvest pool] --> D1[URL dedup<br/>vs everything already seen]
    D1 --> D2[Per-domain cap<br/>no single source floods the funnel]
    D2 --> S[Cheap LLM screener<br/>pass / fail]
    S --> DA[Deep LLM analysis<br/>rank 0–100]
    DA --> TD[Topic dedup<br/>cosine vs committed topics —<br/>DEFER, reversible]
    TD --> EX[Export gate<br/>daily generation budget ·<br/>impact-ranked top-N]
    EX --> P[Seeded as pending article]
```

Два гейта заслуживают внимания:

- **Тематический дедуп откладывает, а не удаляет.** Кандидат, слишком
  похожий на уже закоммиченные темы (или на соседа в том же прогоне),
  помечается отложенным — единственный *обратимый* вердикт воронки:
  тематическое пространство освобождается по мере старения контента.
- **Экспорт-гейт держит жёсткий суточный бюджет генерации.** У каждого
  контракта — бюджет статей/сутки: флотовый дефолт 5, per-contract
  override (0 — легальный полный стоп). Остаток считается по дневному
  окну в БД, поэтому перезапущенный прогон не может потратить лимит
  дважды. Внутри бюджета кандидаты ранжируются по **ожидаемому
  импакту**: `(rank_deep / 100) × yield_ratio(темы)`, где `yield_ratio`
  — измеренная отдача темы (показы/статью) относительно медианы
  контракта (clamp 0.25–4.0), из
  [петли обратной связи по темам](../topic-feedback-loop/). Тема без
  данных получает нейтральный вес — без SEO-сигнала ранжирование
  деградирует к чистому порядку по рангу, но кап держится всегда (оси
  отказов независимы). Пол эксплорации резервирует часть бюджета под
  новые темы; кандидаты, до которых бюджет не дошёл, остаются в пуле и
  конкурируют следующей ночью. Ниже пола по рангу кандидат просто
  никогда не становится статьёй; отсутствие и есть запись об отказе.

Исторические асимметрии закрыты: полоса авто-прохода больше не обходит
кап, а легаси **приоритетный путь** (операторский овверайд мимо пола по
рангу) бюджет-отбором игнорируется — его флаг больше никто в платформе
не пишет, поле ждёт удаления.

## Слой 3 — каскад сегодня

Экономическая идея — *дешёвое раньше дорогого*: убивать кандидатов до
того, как они начнут стоить настоящих LLM-денег. Сегодняшний прод-каскад
достигает этого **дешёвым LLM-скринером** перед глубоким анализатором —
каждый выживший кандидат стоит минимум один маленький LLM-вызов.
**Векторный префильтр** (эмбеддинг кандидатов и recall-ранжирование по
косинусу до того, как их увидит любой LLM) существует как измеренное
следующее поколение: на живом прогоне он срезал нагрузку скрининга в
~5.7× на том прогоне (харвест 714 → recall-пул 646 → 38 прошло скрининг).
Он owner-gated и пока не прод-дефолт — пиннинг версий каталога ровно то,
что позволяет двум поколениям сосуществовать.

## Слой 4 — поиск кормит и корпус

Collect работает вдвойне: квалифицированные страницы-источники
размалываются в **исследовательские факты** через тот же приёмный
пайплайн, которым пользуется генерация (дедуп по контент-хэшу → гейты
происхождения и релевантности → арбитраж конфликтов). Так поиск — это
приёмник [RAG-маховика](../rag-flywheel/), а не только очередь статей.

## Компромиссы

Кураторские запросы и фиды означают, что полнота зависит от качества
курирования — устаревший набор запросов тихо морит воронку голодом,
поэтому новизна харвеста мониторится как сигнал. А фильтрация конкурентов
здесь намеренно *не живёт*: brand defense работает ниже по течению
(генерация и публикация), где есть контекст судить о намерении — URL сам
по себе не доказательство продвижения.

## Пощупать за две минуты

Воронка контракта видна в записях его прогонов: harvested → screened →
ranked → deferred → seeded, шаг за шагом, для каждого ночного прогона.
