Переранжировка результатов гибридного поиска с помощью векторной базы данных Vector DB#
Гибридный поиск объединяет плотное и разреженное извлечение для получения точных и полных результатов. Добавив переранжировку с использованием ColBERT можно еще больше уточнить результаты поиска для максимальной релевантности.
В текущем руководстве представлено, как реализовать гибридный поиск с переранжировкой в Platform V Vector DB (далее - Vector DB), используя плотные, разреженные и поздние интерактивные вложения для создания эффективной системы поиска высокой точности.
Обзор#

Этап загрузки#
Процесс похож на тот, который был использован ранее, но с несколькими мощными дополнениями:
Документы: набор документов, которые необходимо проиндексировать для поиска.
Плотные вложения: создайте плотные вложения для каждого документа, как при обычном поиске. Эти вложения захватывают более глубокие семантические значения за текстом.
Разреженные вложения: наряду с плотными вложениями создайте разреженные вложения с использованием традиционных методов, основанных на ключевых словах. В частности используйте BM25, вероятностную модель поиска информации. BM25 ранжирует документы по тому, насколько их термины соответствуют заданному запросу, принимая во внимание частоту появления терминов, длину документа и распространенность термина среди всех документов. Это идеально подходит для поисковых запросов, насыщенных ключевыми словами.
Поздние интерактивные вложения: добавьте ColBERT, который использует двухэтапный подход. Сначала он генерирует контекстуализованные вложения как для запросов, так и для документов с использованием BERT, а затем выполняет позднее взаимодействие — сопоставляя эти вложения эффективно с помощью скалярного произведения для тонкой настройки релевантности. Этот шаг позволяет достичь глубокого понимания контекста, гарантируя получение наиболее точных результатов.
Векторная база данных: все вложения — плотные, разреженные и позднего взаимодействия — хранятся в векторной базе данных, такой как Vector DB. Это позволяет эффективно искать, извлекать и переранжировать документы на основе нескольких уровней релевантности.

Стадия выборки#
Сценарий получение лучших результатов после того, как пользователь отправит запрос:
Запрос пользователя: пользователь вводит запрос, и этот запрос преобразуется в несколько типов вложений. Представления, которые захватывают как глубокий смысл (плотные), так и конкретные ключевые слова (разреженные).
Вложения: запрос преобразуется в различные типы вложений — некоторые из них предназначены для понимания семантики (плотные вложения), другие сосредоточены на совпадении ключевых слов (разреженные вложения).
Гибридный поиск: гибридный поиск использует как плотные, так и разреженные вложения для нахождения самых релевантных документов. Плотные вложения обеспечивают понимание общего смысла запроса, тогда как разреженные вложения гарантируют, что не будут упущены важные ключевые термины.
Переранжирование: последний шаг при наличии набора документов. Именно здесь используются поздние интерактивные вложения, предоставляя результаты, которые не только являются актуальными, но и адаптированы к запросу путем приоритизации документов.
Реализация#
Дополнительная настройка#
В текущем примере используется FastEmbed - легковесную библиотеку Python, предназначенную для генерации вложений, которая поддерживает популярные модели текстов «прямо из коробки». Прежде всего ее нужно установить:
pip install fastembed
Модели, которые будут использоваться из FastEmbed:
from fastembed import TextEmbedding, LateInteractionTextEmbedding, SparseTextEmbedding
Загрузка#
Необходимо превратить документы во вложения, но благодаря FastEmbed процесс становится еще проще, поскольку все необходимые модели удобно доступны в одном месте.
Вложения (эмбеддинги)#
Загрузите нужные модели:
dense_embedding_model = TextEmbedding("sentence-transformers/all-MiniLM-L6-v2")
bm25_embedding_model = SparseTextEmbedding("Qdrant/bm25")
late_interaction_embedding_model = LateInteractionTextEmbedding("colbert-ir/colbertv2.0")
Сконвертируйте документы во вложения:
dense_embeddings = list(dense_embedding_model.embed(doc for doc in documents))
bm25_embeddings = list(bm25_embedding_model.embed(doc for doc in documents))
late_interaction_embeddings = list(late_interaction_embedding_model.embed(doc for doc in documents))
Поскольку используется несколько типов вложений (плотные, разреженные и позднего взаимодействия), потребуется сохранить их в коллекции, поддерживающей многовекторную конфигурацию. Предыдущая коллекция, которую создали ранее в данном сценарии не подойдет. Создайте новую специально разработанную для обработки этих различных типов вложений.
Создание коллекции#
Настройте новую коллекцию в Vector DB для гибридного поиска с правильной конфигурацией для работы со всеми различными типами векторов:
from qdrant_client.models import Distance, VectorParams, models
client.create_collection(
"hybrid-search",
vectors_config={
"all-MiniLM-L6-v2": models.VectorParams(
size=len(dense_embeddings[0]),
distance=models.Distance.COSINE,
),
"colbertv2.0": models.VectorParams(
size=len(late_interaction_embeddings[0][0]),
distance=models.Distance.COSINE,
multivector_config=models.MultiVectorConfig(
comparator=models.MultiVectorComparator.MAX_SIM,
),
hnsw_config=models.HnswConfigDiff(m=0) # Disable HNSW for reranking
),
},
sparse_vectors_config={
"bm25": models.SparseVectorParams(modifier=models.Modifier.IDF
)
}
)
На текущий момент создается коллекция под названием «hybrid-search» с конфигурацией для ее обработки:
Плотные вложения от модели all-MiniLM-L6-v2 с использованием косинусного расстояния для сравнений.
Поздние интерактивные вложения от colbertv2.0 также используют косинусное расстояние, но с многоуровневой конфигурацией для использования компаратора максимального сходства. Обратите внимание, что
m=0в вектореcolbertv2.0, чтобы предотвратить индексацию, поскольку она не требуется для переранжирования.Разреженные вложения от BM25 для поиска на основе ключевых слов. Они используют
dot_productдля расчета подобия.
Данная настройка гарантирует правильное хранение и сравнение всех различных типов векторов для гибридного поиска.
Добавление данных#
Далее нужно вставить документы вместе с их множественными вложениями в коллекцию «hybrid-search»:
from qdrant_client.models import PointStruct
points = []
for idx, (dense_embedding, bm25_embedding, late_interaction_embedding, doc) in enumerate(zip(dense_embeddings, bm25_embeddings, late_interaction_embeddings, documents)):
point = PointStruct(
id=idx,
vector={
"all-MiniLM-L6-v2": dense_embedding,
"bm25": bm25_embedding.as_object(),
"colbertv2.0": late_interaction_embedding,
},
payload={"document": doc}
)
points.append(point)
operation_info = client.upsert(
collection_name="hybrid-search",
points=points
)
Проверьте, как точки могут быть загружены с встроенной интеграцией Fastembed.
Загрузка с вычислением вложений на лету:
from qdrant_client.models import PointStruct
points = []
for idx, doc in enumerate(documents):
point = PointStruct(
id=idx,
vector={
"all-MiniLM-L6-v2": models.Document(text=doc, model="sentence-transformers/all-MiniLM-L6-v2"),
"bm25": models.Document(text=doc, model="Qdrant/bm25"),
"colbertv2.0": models.Document(text=doc, model="colbert-ir/colbertv2.0"),
},
payload={"document": doc}
)
points.append(point)
operation_info = client.upsert(
collection_name="hybrid-search",
points=points
)
Этот код собирает все вместе, создавая список объектов PointStruct, каждый из которых содержит вложения и соответствующие документы.
Для каждого документа добавляется:
Плотные вложения для глубокого семантического значения.
Вложения BM25 для мощного поиска на основе ключевых слов.
Вложения ColBERT для точного контекстного взаимодействия.
После завершения точки загружаются в коллекцию «hybrid-search» с использованием метода upsert, обеспечивая наличие всего необходимого.
Выборка#
Необходимо преобразовать запрос пользователя в требуемые вложения:
dense_vectors = next(dense_embedding_model.query_embed(query))
sparse_vectors = next(bm25_embedding_model.query_embed(query))
late_vectors = next(late_interaction_embedding_model.query_embed(query))
Особенность гибридного поиска заключается в параметре prefetch. Он позволяет запускать сразу несколько подпзапросов, объединяя силу плотных и разреженных вложений. Его необходимо настроить, после чего выполнится гибридный поиск:
prefetch = [
models.Prefetch(
query=dense_vectors,
using="all-MiniLM-L6-v2",
limit=20,
),
models.Prefetch(
query=models.SparseVector(**sparse_vectors.as_object()),
using="bm25",
limit=20,
),
]
Этот код инициирует гибридный поиск, выполняя два подпзапроса:
Один использует плотные вложения из «all-MiniLM-L6-v2», чтобы уловить семантический смысл запроса.
Другой использует разреженные вложения из BM25 для сильного соответствия ключевым словам.
Каждый подпзапрос ограничен 20 результатами. Эти подпзапросы собираются вместе с помощью параметра prefetch, позволяя им выполняться параллельно.
Переранжирование#
Когда есть первоначальные результаты гибридного поиска, пришло время переранжировать их с использованием поздних интерактивных вложений для достижения максимально возможной точности:
results = client.query_points(
"hybrid-search",
prefetch=prefetch,
query=late_vectors,
using="colbertv2.0",
with_payload=True,
limit=10,
)
Проверьте, как запросы могут быть выполнены с встроенной интеграцией Fastembed.
Запрос точек с вычислением вложений на лету:
prefetch = [
models.Prefetch(
query=models.Document(text=query, model="sentence-transformers/all-MiniLM-L6-v2"),
using="all-MiniLM-L6-v2",
limit=20,
),
models.Prefetch(
query=models.Document(text=query, model="Qdrant/bm25"),
using="bm25",
limit=20,
),
]
results = client.query_points(
"hybrid-search",
prefetch=prefetch,
query=models.Document(text=query, model="colbert-ir/colbertv2.0"),
using="colbertv2.0",
with_payload=True,
limit=10,
)
Обратите внимание, как некоторые документы меняют ранг в зависимости от релевантности согласно поздним интерактивным вложениям.
Документ |
Ранг первого запроса |
Ранг второго запроса |
Изменение ранга |
|---|---|---|---|
В машинном обучении масштабирование признаков — процесс нормализации диапазона независимых переменных или признаков. Цель состоит в том, чтобы убедиться, что все признаки одинаково влияют на модель, особенно в алгоритмах вроде SVM или k-ближайших соседей, где важны расчеты расстояний |
1 |
1 |
Без изменений |
Масштабирование признаков обычно используется в предварительной обработке данных для обеспечения одинакового масштаба признаков. Это особенно важно для градиентно-спусковых алгоритмов, где признаки с большими масштабами могли бы непропорционально влиять на функцию стоимости |
2 |
6 |
Опустился вниз |
Алгоритмы неконтролируемого обучения, такие как методы кластеризации, могут выиграть от масштабирования признаков, которое обеспечивает отсутствие доминирования признаков с большим числовым диапазоном над процессом обучения |
3 |
4 |
Опустился вниз |
Этапы предварительной обработки данных, включая масштабирование признаков, могут значительно повлиять на производительность моделей машинного обучения, делая их важной частью конвейера моделирования |
5 |
2 |
Поднялся вверх |
Лучшие практики переранжирования#
Переранжировка может существенно повысить релевантность результатов поиска, особенно в сочетании с методами гибридного поиска. Вот несколько лучших практик, о которых следует помнить:
Реализуйте гибридную переранжировку: объедините результаты поиска на основе ключевых слов (разреженные) и векторного поиска (плотные) для более комплексной системы ранжирования.
Постоянное тестирование и мониторинг: регулярно оценивайте модели переранжирования, чтобы избежать переобучения и своевременно вносить коррективы для поддержания производительности.
Баланс между релевантностью и задержкой: переранжирования может быть вычислительно затратной, поэтому стремитесь найти баланс между релевантностью и скоростью. Поэтому первым шагом является выбор соответствующих документов, а затем использование переранжирования на нем.
Заключение#
Переранжировка — мощный инструмент, повышающий релевантность результатов поиска, особенно в сочетании с методами гибридного поиска. Хотя она может добавить некоторую задержку из-за сложности, применение ее к меньшему предварительно фильтрованному подмножеству результатов обеспечивает как скорость, так и релевантность.