Би-энкодер (англ. bi-encoder, также dual-encoder) — архитектура нейронной сети в обработке естественного языка (NLP), предназначенная для преобразования текстовых входов в плотные векторные представления (эмбеддинги) фиксированной размерности. В отличие от кросс-энкодеров, би-энкодер обрабатывает каждый входной текст независимо, что позволяет предварительно вычислять и сохранять эмбеддинги для массового поиска и сравнения.
Би-энкодер состоит из двух (или более) кодирующих сетей — чаще всего трансформерных (например, BERT, RoBERTa), но могут использоваться и более лёгкие архитектуры. На вход подаётся отдельный текст, на выходе получается вектор фиксированной длины (например, 384 или 768 измерений). Эти векторы являются контекстуальными эмбеддингами — они учитывают окружение слов внутри текста, но не учитывают взаимодействие с другим текстом.
Сходство между двумя текстами вычисляется путём сравнения их эмбеддингов с помощью простой метрики, чаще всего косинусного расстояния. Благодаря этому, для поиска по большому корпусу достаточно один раз вычислить эмбеддинги всех документов, сохранить их в векторной базе данных (например, FAISS, Pinecone) и при каждом запросе вычислять эмбеддинг только запроса, после чего выполнять быстрое приближённое сравнение (ANN — approximate nearest neighbors).
Ключевое свойство би-энкодеров — отсутствие перекрёстного внимания между запросом и документом. Каждый текст кодируется изолированно, что обеспечивает линейную сложность по числу документов на этапе поиска.
Сравнение с кросс-энкодером
Характеристика
Би-энкодер
Кросс-энкодер
Обработка
Раздельная, независимая
Совместная, с перекрёстным вниманием
Выход
Вектор (эмбеддинг)
Оценка релевантности (0–1)
Скорость
Высокая (предварительное кодирование)
Низкая (каждая пара заново)
Точность
Средняя, теряет тонкие взаимодействия
Высокая, учитывает все перекрёстные связи
Масштабируемость
Высокая (подходит для миллионов документов)
Низкая (только для ранжирования малых выборок)
Таким образом, би-энкодер жертвует точностью ради производительности, что делает его идеальным для первого этапа поиска (retrieval), тогда как кросс-энкодер используется для финальной пересортировки небольшого числа кандидатов.
Применение в семантике и SEO
Массовый семантический поиск
Би-энкодеры являются основой большинства современных поисковых движков и RAG-систем на этапе первичного отбора. В SEO это позволяет:
Кластеризовать поисковые запросы — группировать запросы, чьи эмбеддинги близки, для определения единого семантического ядра страницы.
Находить семантически близкие страницы на своём сайте или у конкурентов, даже если они не содержат общих ключевых слов.
Автоматически рекомендовать похожие товары или статьи на основе векторной близости описаний.
В отличие от классического TF-IDF, би-энкодер учитывает синонимы, контекст и многозначность слов. Например, запросы «как починить кран» и «ремонт смесителя» будут близки по эмбеддингам, хотя не имеют общих слов.
Сбор и расширение семантического ядра
В SEO-практике би-энкодеры помогают:
Генерация гипонимов и смежных тем — по эмбеддингу запроса можно находить другие запросы из того же смыслового поля, используя векторные базы, построенные на основе поисковых логов или текстов контента.
Фильтрация шумовых запросов — запросы, чьи векторы выпадают из основного кластера, могут быть исключены как нерелевантные для конкретной страницы.
Анализ интента — используя обученные би-энкодеры на размеченных данных (коммерческий, информационный, навигационный запросы), можно автоматически классифицировать намерение пользователя.
Оптимизация контента с учётом векторной близости
Зная эмбеддинги целевых запросов, SEO-специалист может оценить, насколько текст страницы «семантически близок» к этим запросам. Для этого вычисляется косинусное расстояние между эмбеддингом запроса и эмбеддингом текста страницы. Чем выше близость, тем выше вероятность, что страница будет релевантна. Это позволяет:
дорабатывать текст, добавляя недостающие смысловые блоки, которые повысят близость;
сравнивать свой контент с контентом конкурентов, которые ранжируются выше по тем же запросам.
Преимущества и ограничения
Преимущества
Высокая скорость — поиск среди миллионов документов занимает миллисекунды благодаря предвычисленным эмбеддингам и ANN-индексам.
Масштабируемость — легко масштабируется на большие корпуса, так как добавление нового документа требует только однократного вычисления его эмбеддинга.
Универсальность — один и тот же эмбеддинг документа можно использовать для ответа на любой запрос без пересчёта.
Простота интеграции — хорошо сочетается с классическими текстовыми базами данных и поисковыми движками.
Ограничения
Потеря тонких смыслов — при раздельном кодировании модель не может уловить взаимодействия между конкретными словами запроса и документа (например, отрицание, сравнение, условные конструкции).
Зависимость от качества обучения — би-энкодер требует специальной процедуры обучения (контрастное обучение, triplet loss) для достижения хорошей разделимости векторов.
Фиксированная размерность — ёмкость вектора ограничена, что может приводить к потере информации в очень длинных текстах.
Методы обучения би-энкодеров
Для того чтобы би-энкодер давал осмысленные эмбеддинги для поиска и SEO-задач, его обучают с использованием:
Контрастных пар — (запрос, релевантный документ) и (запрос, нерелевантный документ), где модель учится делать так, чтобы косинусное расстояние для релевантной пары было минимальным, а для нерелевантной — максимальным.
Triplet loss — используется тройка (якорь, позитив, негатив), где модель минимизирует расстояние до позитива и максимизирует до негатива.
DistilBERT / SBERT — популярные готовые модели от Hugging Face, которые уже обучены на больших корпусах (MS MARCO, Natural Questions) и могут быть дообучены на конкретной нише (например, e-commerce, медицина, гемблинг).
Гибридное использование с кросс-энкодером
На практике наиболее эффективной является двухэтапная архитектура:
Би-энкодер отбирает топ-100–1000 потенциально релевантных документов из всего корпуса.
Кросс-энкодер ранжирует эти кандидаты по точности, учитывая все перекрёстные взаимодействия.
Этот подход сочетает масштабируемость би-энкодеров с высоким качеством кросс-энкодеров и стал де-факто стандартом в системах поиска и RAG.
Реализации
Наиболее распространённые библиотеки для работы с би-энкодерами:
Sentence-Transformers (sbert.net) — предоставляет множество предобученных моделей, включая all-MiniLM-L6-v2, all-mpnet-base-v2, а также инструменты для обучения и индексации.
FAISS (Facebook AI Similarity Search) — библиотека для быстрого приближённого поиска векторов, часто используется вместе с би-энкодером.
Hugging Face Transformers — позволяет использовать любые трансформерные модели в качестве кодировщиков, добавив слой пулинга.
Пример использования с Sentence-Transformers:
from sentence_transformers import SentenceTransformer
import faiss
import numpy as np
model = SentenceTransformer("all-MiniLM-L6-v2")
docs = ["текст документа 1", "текст документа 2", ...]
doc_embeddings = model.encode(docs)
index = faiss.IndexFlatIP(doc_embeddings.shape[1])
index.add(doc_embeddings)
query = "поисковый запрос"
query_emb = model.encode([query])
distances, indices = index.search(query_emb, k=10) # топ-10 ближайших