Переранжировка результатов гибридного поиска с помощью векторной базы данных Vector DB#

Гибридный поиск объединяет плотное и разреженное извлечение для получения точных и полных результатов. Добавив переранжировку с использованием ColBERT можно еще больше уточнить результаты поиска для максимальной релевантности.

В текущем руководстве представлено, как реализовать гибридный поиск с переранжировкой в Platform V Vector DB (далее - Vector DB), используя плотные, разреженные и поздние интерактивные вложения для создания эффективной системы поиска высокой точности.

Обзор#

image3.png

Этап загрузки#

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

  1. Документы: набор документов, которые необходимо проиндексировать для поиска.

  2. Плотные вложения: создайте плотные вложения для каждого документа, как при обычном поиске. Эти вложения захватывают более глубокие семантические значения за текстом.

  3. Разреженные вложения: наряду с плотными вложениями создайте разреженные вложения с использованием традиционных методов, основанных на ключевых словах. В частности используйте BM25, вероятностную модель поиска информации. BM25 ранжирует документы по тому, насколько их термины соответствуют заданному запросу, принимая во внимание частоту появления терминов, длину документа и распространенность термина среди всех документов. Это идеально подходит для поисковых запросов, насыщенных ключевыми словами.

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

  5. Векторная база данных: все вложения — плотные, разреженные и позднего взаимодействия — хранятся в векторной базе данных, такой как Vector DB. Это позволяет эффективно искать, извлекать и переранжировать документы на основе нескольких уровней релевантности.

image2.png

Стадия выборки#

Сценарий получение лучших результатов после того, как пользователь отправит запрос:

  1. Запрос пользователя: пользователь вводит запрос, и этот запрос преобразуется в несколько типов вложений. Представления, которые захватывают как глубокий смысл (плотные), так и конкретные ключевые слова (разреженные).

  2. Вложения: запрос преобразуется в различные типы вложений — некоторые из них предназначены для понимания семантики (плотные вложения), другие сосредоточены на совпадении ключевых слов (разреженные вложения).

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

  4. Переранжирование: последний шаг при наличии набора документов. Именно здесь используются поздние интерактивные вложения, предоставляя результаты, которые не только являются актуальными, но и адаптированы к запросу путем приоритизации документов.

Реализация#

Дополнительная настройка#

В текущем примере используется 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

Поднялся вверх

Лучшие практики переранжирования#

Переранжировка может существенно повысить релевантность результатов поиска, особенно в сочетании с методами гибридного поиска. Вот несколько лучших практик, о которых следует помнить:

  • Реализуйте гибридную переранжировку: объедините результаты поиска на основе ключевых слов (разреженные) и векторного поиска (плотные) для более комплексной системы ранжирования.

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

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

Заключение#

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