idea_world_labDEV JOURNAL
воскресенье, 28 июня 2026 г.

Альтернатива F: BM25 + embedding + reranker + validator

Поток

raw chunkText
  -> BM25 top 80
  -> embedding top 80
  -> объединение кандидатов
  -> reranker напрямую сравнивает raw chunk и каждый JSONL кандидат
  -> возвращает top JSONL
  -> Qwen direct-evidence validator проверяет прямые доказательства

Распределение ролей

BM25:

Находим точную строку/кандидата на API‑токен.

code embedding:

Дополняет варианты, у которых выражения различаются, но смысл близок.

reranker:

Сравниваем кандидаты, полученные с помощью BM25 и embedding, с raw chunk и сортируем их заново.

Qwen direct-evidence validator:

Проверьте, есть ли в JSONL прямое соответствие текущему чанку в виде строки/шаблона.  
JSONL без доказательств следует удалить.

Ожидаемое выравнивание в базовом чанке

Кандидаты, которые должны подняться выше:

first_2d_game / coding_the_player
same page / clamp and AnimatedSprite2D explanation

Кандидаты, которые должны уменьшиться:

first_3d_game / player_movement_code
unrelated api_mapping
unrelated label_prototypes

PoC симуляция

Предположим, что базовый chunk помещается в окончательный поток рекомендаций.

raw chunkText
  -> BM25 top 80
  -> voyage-code-3 embedding top 80
  -> кандидат union
  -> reranker
  -> Qwen direct-evidence validator

1 этап: кандидаты BM25

Кандидаты, которые будет генерировать BM25:

A. first_2d_game / coding_the_player
   reason: Input.is_action_pressed, move_left, move_right, AnimatedSprite2D.play/stop

B. first_2d_game / clamp section
   reason: position.clamp, Vector2.ZERO, screen_size

C. first_3d_game / player_movement_code
   reason: Input.is_action_pressed, move_left, move_right, normalized

2 этап: кандидаты для embedding

Кандидаты, которые будет использовать embedding:

D. first_2d_game / movement explanation
   reason: 2D movement, keyboard input, animation

E. first_2d_game / screen bounds explanation
   reason: keep player inside screen

F. first_3d_game / movement
   reason: player movement semantic similarity

Этап 3: кандидатный union

После union объединяются дубликаты.

A/D -> first_2d_game / coding_the_player
B/E -> first_2d_game / clamp/screen bounds
C/F -> first_3d_game / player_movement

4 этап: reranker перестановка

reranker рассматривает raw chunk и кандидат вместе.

No markdown fragment was provided for translation.

rerank Кандидат Причина
1 first_2d_game / coding_the_player Обработка ввода, velocity, AnimatedSprite2D play/stop напрямую совпадают
2 first_2d_game / clamp/screen bounds position.clamp, Vector2.ZERO, screen_size напрямую соответствует
3 first_3d_game / player_movement Ввод/движение похожи, но это 3D‑контекст, и нет AnimatedSprite2D/screen_size.

Шаг 5: Валидатор прямых доказательств Qwen

В валидаторе Qwen спрашивается следующее.

Посмотрите на SOURCE_CODE и полученный JSONL,  
Есть ли в JSONL строки/вызовы API/основания паттерна, непосредственно соответствующие SOURCE_CODE?  
Сначала дайте оценку «да» или «нет».

No Markdown fragment provided for translation.

first_2d_game / coding_the_player:
  validator = да
  direct evidence = Input.is_action_pressed, AnimatedSprite2D.play, AnimatedSprite2D.stop

first_2d_game / clamp/screen bounds:
  validator = да
  direct evidence = position.clamp, Vector2.ZERO, screen_size

first_3d_game / player_movement:
  validator = нет или низкая релевантность
  reason = ввод движения похож, но это 3D документация, и нет прямых доказательств AnimatedSprite2D/screen_size

Логи, проверяемые в PoC

Поскольку у этого решения много шагов, необходимо просматривать следующее на одном экране.

1. raw chunkText
2. BM25 кандидаты и совпадающие термины
3. Кандидаты embedding и сходство
4. Результат объединения
5. Оценка reranker и изменение ранга
6. Qwen validator да/нет
7. Итоговый accept/reject JSONL

Видимый вывод:

BM25 и embedding собирают широкий набор кандидатов.  
reranker исправляет порядок похожих кандидатов.  
Qwen validator полностью отбрасывает JSONL без прямых доказательств.

Преимущества

  • Вероятность того, что качество будет наилучшим, высока.
  • Можно уменьшить количество ложноположительных результатов BM25.
  • Можно также уменьшить количество ложноположительных результатов embedding.
  • Сохраняются условия необработанных фрагментов.
  • Низкая зависимость от жёсткого кодирования.
  • С помощью валидатора Qwen можно удалить JSONL без прямых доказательств в конце.

Недостатки

  • Требуются затраты.
  • Возникает задержка.
  • Если добавить слишком много кандидатов, процесс замедляется.
  • Переранжировщик также не является проверяющим доказательства, поэтому нужен финальный валидатор.

Оценка

Качество превыше всего – окончательная рекомендация

Окончательная рекомендация оригинальной заметки близка к этой структуре.