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

В системах с расширенным поиском (RAG) нерелевантная информация или ее отсутствие могут негативно повлиять на способность модели генерировать точные и значимые результаты. Один из лучших способов убедиться, что предоставляется языковой модели наиболее релевантные документы с богатым контекстом.

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

Понимание переранжировки#

Фон#

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

image5.png

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

Именно здесь приходит на помощь переранжировка. Она берет широкую сеть документов (давая высокую полноту), а затем уточняет их, повторно упорядочивая лучшие кандидаты на основе их оценок релевантности — повышая точность без потери широкого понимания. Обычно после повторного упорядочивания сохраняются только первые K кандидатов, чтобы сосредоточиться на самых актуальных результатах.

Работа#

Представьте такую картину: человек заходит в огромную библиотеку и просит книгу о «изменении климата». Библиотекарь вытаскивает дюжину книг — некоторые из них научные статьи, другие личные эссе, одна даже роман. Конечно, они все актуальны, но первой вручили именно роман. Совсем не то, чего бы хотелось.

Теперь представьте умного, интуитивно понятного библиотекаря, который прекрасно понимает потребности. Этот человек точно знает, какие книги окажут наибольшее влияние, самые свежие и идеально соответствуют запросу. Вот что делает переранжировка для результатов поиска — она не просто извлекает любые подходящие документы; она разумно перестраивает их таким образом, чтобы лучшие оказались вверху списка. Это похоже на наличие библиотекаря, который заранее знает, что именно нужно.

image6.png

Иллюстрация того, как модель переранжирует приоритетные результаты

Чтобы стать этим умным, интуитивным библиотекарем, алгоритм должен научиться понимать как запросы, так и извлеченные документы. Он должен эффективно оценивать отношения между ними, чтобы предоставить именно то, что ищется.

Способ работы моделей переранжировщиков варьируется в зависимости от типа, что будет обсуждаться позже, но в целом они рассчитывают оценку релевантности для каждой пары документ-запрос. В отличие от встраиваемых моделей, которые сжимают всю информацию в один вектор сразу, переранжировщики сохраняют все важные детали нетронутыми, используя полный выход трансформера для расчета коэффициента сходства. Результат? Повышение точности. Но есть компромисс — переранжировка может быть медленной. Обработка миллионов документов может занять часы, поэтому переранжеры сосредоточены на улучшении результатов, а не на полном сканировании всей коллекции документов.

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

  1. Модели кросс-кодеров: эти модели повышают эффективность переранжировки за счет использования системы классификации для оценки пар данных — таких как предложения или документы. Они выдают коэффициент сходства от 0 до 1, показывая, насколько близко документ соответствует запросу. Подвох заключается в том, что кросс-кодеры требуют наличия как запроса, так и документа, поэтому они не могут обрабатывать отдельные документы или запросы самостоятельно.

  2. Много-векторные переранжеры (например, ColBERT): эти модели выбирают более эффективный путь. Они отдельно кодируют запрос и документы, сравнивая их позднее, что снижает вычислительную нагрузку. Это означает, что представления документов можно предварительно вычислить, ускоряя время извлечения.

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

Каждый из этих переранжировщиков имеет особый подход к обеспечению быстрых и соответствующих потребностям результатов поиска.

Важность#

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

  • Повышение точности поиска: Переранжировка направлена на повышение четкости и актуальности результатов поиска. После первоначального ранжирования переранжировщики пересортировывают результаты на основе глубокого анализа, чтобы гарантировать, что представлена именно самая важная информация. Исследования показывают, что переранжировщики способны обеспечить серьезный прирост — улучшение верхних результатов примерно для 72% запросов на поиск. Это огромный скачок в точности.

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

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

Реализация векторного поиска с переранжировкой#

В данном разделе представлено, как реализовать векторный поиск с переранжировкой с помощью платформы Cohere.

Обзор#

Типичная система поиска работает в две основные стадии: загрузка и получение результата. Представьте себе процесс загрузки как подготовку и загрузку данных в систему, а получение результата — запросы вытягивают наиболее релевантные документы.

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

image1.png

Два основных этапа поисковой системы: загрузка и процесс получения результата

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

  • Документы: Именно отсюда начинается весь процесс. Система принимает сырые данные или документы, которые необходимо подготовить для поиска — исходное входящее сообщение.

  • Вложения: Далее эти документы преобразуются в разреженные или плотные эмбеддинги, которые представляют собой векторные представления. Эти векторы захватывают глубокий, скрытый смысл текста, позволяя системе выполнять умные, эффективные поиски и сравнения на основе семантического значения.

  • Векторная база данных: Как только документы преобразованы во вложения, они хранятся в векторной базе данных — движке, обеспечивающем быстрый и точный поиск похожих элементов. Здесь представлены возможности векторной базы данных Vector DB.

Этап получения результата#

  • Запрос пользователя: Теперь осуществляется переход к фазе получения результата. Пользователь вводит запрос, и наступает момент сопоставления этого запроса с сохраненными документами.

  • Вложения: Так же, как и с документами, запрос пользователя преобразуется в разреженное или плотное вложение. Это позволяет системе сравнивать смысловое содержание запроса со смысловым содержанием хранимых документов.

  • Векторный поиск: Система ищет наиболее релевантные документы путем сравнения вложения запроса с теми, что находятся в векторной базе данных, и выводит ближайшие соответствия.

  • Переранжировка: Когда первоначальные результаты получены, запускается процесс переранжировки, чтобы убедиться, что наилучшие результаты отображаются сверху. Будет использоваться модель Cohere rerank-english-v3.0, которая превосходна в изменении порядка английских текстов, придавая приоритет релевантности. Она способна обработать до 4096 токенов, обеспечивая ей достаточно контекста для работы. И если планируется работа с многоязычными данными, не беспокойтесь — у Cohere также есть модели переранжировки для других языков.

Реализация#

Настало время перейти непосредственно к реализации.

Установка#

Необходимо наличие нескольких важных инструментов:

  • Клиент Python для Vector DB;

  • Cohere.

Все необходимое можно установить с помощью менеджера пакетов Python:

pip install qdrant-client cohere

Подключение необходимых компонентов:

from qdrant_client import QdrantClient
from qdrant_client.models import Distance, VectorParams, PointStruct
import cohere

Vector DB - мощный поисковик векторного подобия, предоставляющий готовую к использованию службу с простым в применении API для хранения, поиска и управления данными.

Для корректной работы с Vector DB обязательно необходимо:

  1. Успешно установить Vector DB;

  2. Создать кластер;

  3. Получить ключ API: после создания кластера будет сгенерирован ключ API. Этот ключ позволит взаимодействовать с кластером через клиент Python.

Добавьте ключи API. Это позволит клиенту Python подключиться к Vector DB и Cohere.

client = QdrantClient(
    url="<ADD-URL>",
    api_key="<API-KEY>",
)

print(client.get_collections())

Далее настройте Cohere для переранжировки. Войдите в аккаунт Cohere, создайте ключ API и добавьте его следующим образом:

co = cohere.Client("<API-KEY>")

Загрузка#

Создание коллекции#

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

client.create_collection(
    collection_name="basic-search-rerank",
    vectors_config=VectorParams(size=1024, distance=Distance.DOT),
)

Здесь размер вектора установлен равным 1024, чтобы соответствовать плотным вложениям, и используется скалярное произведение в качестве меры расстояния — идеальное решение для захвата сходства между векторами, особенно когда они нормализованы.

Документы для вложения#

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

query = "What is the purpose of feature scaling in machine learning?"

documents = [
    "In machine learning, feature scaling is the process of normalizing the range of independent variables or features. The goal is to ensure that all features contribute equally to the model, especially in algorithms like SVM or k-nearest neighbors where distance calculations matter.",
   
    "Feature scaling is commonly used in data preprocessing to ensure that features are on the same scale. This is particularly important for gradient descent-based algorithms where features with larger scales could disproportionately impact the cost function.",
   
    "In data science, feature extraction is the process of transforming raw data into a set of engineered features that can be used in predictive models. Feature scaling is related but focuses on adjusting the values of these features.",
   
    "Unsupervised learning algorithms, such as clustering methods, may benefit from feature scaling as it ensures that features with larger numerical ranges don't dominate the learning process.",
   
    "One common data preprocessing technique in data science is feature selection. Unlike feature scaling, feature selection aims to reduce the number of input variables used in a model to avoid overfitting.",
   
    "Principal component analysis (PCA) is a dimensionality reduction technique used in data science to reduce the number of variables. PCA works best when data is scaled, as it relies on variance which can be skewed by features on different scales.",
   
    "Min-max scaling is a common feature scaling technique that usually transforms features to a fixed range [0, 1]. This method is useful when the distribution of data is not Gaussian.",
   
    "Standardization, or z-score normalization, is another technique that transforms features into a mean of 0 and a standard deviation of 1. This method is effective for data that follows a normal distribution.",
   
    "Feature scaling is critical when using algorithms that rely on distances, such as k-means clustering, as unscaled features can lead to misleading results.",
   
    "Scaling can improve the convergence speed of gradient descent algorithms by preventing issues with different feature scales affecting the cost function landscape.",
   
    "In deep learning, feature scaling helps in stabilizing the learning process, allowing for better performance and faster convergence during training.",
   
    "Robust scaling is another method that uses the median and the interquartile range to scale features, making it less sensitive to outliers.",
   
    "When working with time series data, feature scaling can help in standardizing the input data, improving model performance across different periods.",
   
    "Normalization is often used in image processing to scale pixel values to a range that enhances model performance in computer vision tasks.",
   
    "Feature scaling is significant when features have different units of measurement, such as height in centimeters and weight in kilograms.",
   
    "In recommendation systems, scaling features such as user ratings can improve the model ability to find similar users or items.",
   
    "Dimensionality reduction techniques, like t-SNE and UMAP, often require feature scaling to visualize high-dimensional data in lower dimensions effectively.",
   
    "Outlier detection techniques can also benefit from feature scaling, as they can be influenced by unscaled features that have extreme values.",
   
    "Data preprocessing steps, including feature scaling, can significantly impact the performance of machine learning models, making it a crucial part of the modeling pipeline.",
   
    "In ensemble methods, like random forests, feature scaling is not strictly necessary, but it can still enhance interpretability and comparison of feature importance.",
   
    "Feature scaling should be applied consistently across training and test datasets to avoid data leakage and ensure reliable model evaluation.",
   
    "In natural language processing (NLP), scaling can be useful when working with numerical features derived from text data, such as word counts or term frequencies.",
   
    "Log transformation is a technique that can be applied to skewed data to stabilize variance and make the data more suitable for scaling.",
   
    "Data augmentation techniques in machine learning may also include scaling to ensure consistency across training datasets, especially in computer vision tasks."
]

Создайте вложения для этих документов с помощью модели embed-english-v3.0 от Cohere, которая генерирует 1024-мерные векторы:

model="embed-english-v3.0"

doc_embeddings = co.embed(texts=documents,
                          model=model,
                          input_type="search_document",
                          embedding_types=['float'])

Этот код использует API Cohere для генерации вложений для списка документов. Он применяет модель embed-english-v3.0, устанавливает тип ввода на search_document и запрашивает вложения в формате с плавающей запятой. Итоговый результат — набор плотных вложений, каждое из которых представляет глубокую семантическую суть документов. Эти вложения будут храниться в переменной doc_embeddings, готовые к действию.

Вставка данных#

Нужно преобразовать эти плотные вложения в формат, совместимый с Vector DB, и тут на сцену выходят точки. Точки — это строительные блоки Vector DB — они состоят из вектора (вложение) и необязательной полезной нагрузки (такой, как текст документа).

Превращение вложений в точки:

points = []
for idx, (embedding, doc) in enumerate(zip(doc_embeddings.embeddings.float_, documents)):
    point = PointStruct(
        id=idx,
        vector=embedding,
        payload={"document": doc}
    )
    points.append(point)

Постройте список точек из вложений:

  • Начните с пустого списка.

  • Затем одновременно пройдите через оба doc_embeddings и documents, используя функцию enumerate(), чтобы захватить индекс (idx) по пути.

  • Для каждой пары (вложение и соответствующий ему документ) создайте структуру PointStruct. Каждая точка получает:

    • id (из idx).

    • vector (вложение).

    • payload (текст самого документа).

  • Каждая точка автоматически добавляется в список.

После завершения текущего процесса следует отправить эти точки в коллекцию Vector DB с помощью функции upsert():

operation_info = client.upsert(
    collection_name="basic-search-rerank",
    points=points
)

Поиск#

Извлечение#

Первые несколько шагов здесь повторяют то, что выполнялось при загрузке — аналогично, снова нужно преобразовать запрос во вложение:

query_embeddings = co.embed(texts=[query],
  model=model,
  input_type="search_query",
  embedding_types=['float'])

Далее необходимо перейти к получению результатов с использованием векторного поиска и применению переранжировки к результатам. Этот двухэтапный процесс чрезвычайно эффективен, потому что получается небольшое подмножество наиболее релевантных документов первым делом, что намного быстрее, чем переранжировка огромного набора данных.

Векторный поиск#

Этот фрагмент выбирает верхние 10 наиболее релевантных точек из коллекции Vector DB, используя вложение запроса.

search_result = client.query_points(
    collection_name="basic-search-rerank", query=query_embeddings.embeddings.float_[0], limit=10
).points

Принцип работы: используется метод query_points для поиска в коллекции basic-search-rerank. Он сравнивает вложение запроса (первое вложение в query_embeddings) со всеми вложениями документов, выбирая 10 ближайших соответствий. Соответствующие точки сохраняются в результате поиска search_result.

Пример результата векторного поиска:

ID

Документ

Оценка

0

«В машинном обучении масштабирование признаков — это процесс нормализации диапазона независимых…»

0.71

10

«В глубоком обучении масштабирование признаков помогает стабилизировать процесс обучения, позволя…»

0.69

1

«Масштабирование признаков часто применяется в предварительной обработке данных, чтобы убедиться, что признаки имеют одинаковые масштабы…»

0.68

23

«Техники аугментации данных в машинном обучении могут также включать масштабирование, чтобы обеспечить…»

0.64

3

«Алгоритмы неконтролируемого обучения, такие как методы кластеризации, могут выиграть от масштабирования признаков…»

0.64

12

«При работе с временными рядами масштабирование признаков может помочь стандартизировать входные данные…»

0.62

19

«В ансамблевых методах, таких как случайные леса, масштабирование признаков необязательно…»

0.61

21

«В обработке естественного языка (NLP) масштабирование полезно при работе с численными признаками…»

0.61

20

«Масштабирование признаков следует применять последовательно ко всем обучающим и тестовым наборам данных…»

0.61

18

«Шаги предварительной обработки данных, включая масштабирование признаков, могут существенно влиять на производительность…»

0.61

Судя по всему, полученные данные очень актуальны для запроса. Теперь, имея эту прочную основу результатов, настало время уточнить их с помощью переранжировки.

Пересортировка результатов поиска#

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

Сначала извлекаются документы из результатов поиска. Затем используем модель переранжирования от компании Cohere для уточнения этих результатов:

document_list = [point.payload['document'] for point in search_result]

rerank_results = co.rerank(
    model="rerank-english-v3.0",
    query=query,
    documents=document_list,
    top_n=5,
)

В первой строке формируется список документов путем извлечения поля document из каждой точки результата поиска. После чего передаем этот список вместе с исходным запросом методу переранжирования от Cohere. Используя модель rerank-english-v3.0, она перераспределяет документы и возвращает топ-5, ранжированных по степени их соответствия запросу.

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

Индекс

Документ

Оценка релевантности

0

В машинном обучении масштабирование признаков — это процесс нормализации диапазона независимых переменных или признаков.

0.99995166

1

Масштабирование признаков часто используется при предварительной обработке данных, чтобы убедиться, что признаки находятся в одном масштабе.

0.99929035

10

В глубоком обучении масштабирование признаков помогает стабилизировать процесс обучения, обеспечивая лучшую производительность и более быструю сходимость.

0.998675

23

Техники аугментации данных в машинном обучении также могут включать масштабирование для обеспечения согласованности между обучающими наборами данных.

0.998043

3

Алгоритмы неконтролируемого обучения, такие как методы кластеризации, могут выиграть от масштабирования признаков.

0.9979967

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

Заключение#

Переранжировка — мощный способ повысить актуальность и точность результатов поиска в системах RAG (Retrieval-Augmented Generation). Комбинируя возможности векторного поиска Vector DB с инструментами вроде модели переранжирования от Cohere или ColBERT, можно улучшить поисковые выдачи, обеспечив вывод самой актуальной информации наверх.

Это руководство продемонстрировало, как переранжировка повышает точность без ущерба для полноты охвата, предоставляя четкие, контекстно-обогащенные результаты. С этими инструментами есть возможность создавать системы поиска, обеспечивающие значимые и эффективные пользовательские впечатления. Начните внедрять переранжировку, чтобы вывести приложения на новый уровень!