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

Vector DB поддерживает многовекторы и модели позднего взаимодействия нативно.
Полезность векторов уровня токенов#
С помощью векторов уровня токенов модели вроде ColBERT могут сопоставлять конкретные токены запроса с наиболее релевантными частями документа, обеспечивая высокоточное извлечение посредством позднего взаимодействия.
При позднем взаимодействии каждый документ преобразуется в несколько векторов уровня токенов вместо одного вектора. Запрос также подвергается токенизации и вкладывается в различные векторы. Затем запрос и векторы документов сопоставляются с использованием функции подобия: MaxSim.
В традиционном извлечении запрос и документ преобразуются в одиночные вложения, после чего вычисляется сходство. Это раннее взаимодействие, поскольку информация сжимается до начала поиска.
Назначение пересчета#
Пересчет включает два этапа:
Извлечение релевантных документов с помощью быстрой модели.
Переранжировка их с помощью более точной, но более медленной модели, такой как ColBERT.
Проблема индексирования каждого вектора#
В многовекторных представлениях (которые используются моделями позднего взаимодействия, такие как ColBERT) один логический документ порождает сотни векторов уровня токенов. Индексация каждого из этих векторов индивидуально с помощью HNSW в Vector DB может привести к следующим проблемам:
Высокий расход оперативной памяти;
Медленное время вставки из-за сложности поддержания графа HNSW.
Так как многовекторы обычно используются на этапе переранжирования (после первого прохода извлечения с использованием плотных векторов), зачастую нет необходимости индексировать эти векторы уровня токенов с помощью HNSW.
Вместо этого они могут храниться как поля многовектора (без индексации HNSW) и использоваться во время запросов для переранжирования, что снижает нагрузку на ресурсы и повышает производительность.
В Vector DB есть полный контроль над тем, как происходит индексация. Можно отключить индексацию, установив параметр HNSW m равным 0:
from qdrant_client import QdrantClient, models
client = QdrantClient("http://localhost:6333")
collection_name = "dense_multivector_demo"
client.create_collection(
collection_name=collection_name,
vectors_config={
"dense": models.VectorParams(
size=384,
distance=models.Distance.COSINE
# Leave HNSW indexing ON for dense
),
"colbert": models.VectorParams(
size=128,
distance=models.Distance.COSINE,
multivector_config=models.MultiVectorConfig(
comparator=models.MultiVectorComparator.MAX_SIM
),
hnsw_config=models.HnswConfigDiff(m=0) # Disable HNSW for reranking
)
}
)
Отключив HNSW для многовекторов:
Экономятся вычислительные ресурсы.
Снижается потребление памяти.
Ускоряется загрузка векторов.
Генерация многовекторов с помощью FastEmbed#
Установите FastEmbed и Vector DB:
pip install qdrant-client[fastembed]>=1.14.2
Пошаговое руководство: настройка ColBERT + Vector DB#
Убедитесь, что Vector DB запущен, и создайте клиента:
from qdrant_client import QdrantClient, models
# 1. Connect to Qdrant server
client = QdrantClient("http://localhost:6333")
Шаг 1. Кодирование документов#
Закодируйте документы:
from fastembed import TextEmbedding, LateInteractionTextEmbedding
# Example documents and query
documents = [
"Artificial intelligence is used in hospitals for cancer diagnosis and treatment.",
"Self-driving cars use AI to detect obstacles and make driving decisions.",
"AI is transforming customer service through chatbots and automation.",
# ...
]
query_text = "How does AI help in medicine?"
dense_documents = [
models.Document(text=doc, model="BAAI/bge-small-en")
for doc in documents
]
dense_query = models.Document(text=query_text, model="BAAI/bge-small-en")
colbert_documents = [
models.Document(text=doc, model="colbert-ir/colbertv2.0")
for doc in documents
]
colbert_query = models.Document(text=query_text, model="colbert-ir/colbertv2.0")
Шаг 2. Создание коллекции#
Создайте коллекцию Vector DB с обоими типами векторов. Обратите внимание, что необходимо включить индексацию для вектора dense, но отключить для вектора colbert, который будет использован для переранжирования.
collection_name = "dense_multivector_demo"
client.create_collection(
collection_name=collection_name,
vectors_config={
"dense": models.VectorParams(
size=384,
distance=models.Distance.COSINE
# Leave HNSW indexing ON for dense
),
"colbert": models.VectorParams(
size=128,
distance=models.Distance.COSINE,
multivector_config=models.MultiVectorConfig(
comparator=models.MultiVectorComparator.MAX_SIM
),
hnsw_config=models.HnswConfigDiff(m=0) # Disable HNSW for reranking
)
}
)
Шаг 3. Загрузка документов (плотный вектор + многовектор)#
Загрузите векторы:
points = [
models.PointStruct(
id=i,
vector={
"dense": dense_documents[i],
"colbert": colbert_documents[i]
},
payload={"text": documents[i]}
) for i in range(len(documents))
]
client.upsert(collection_name="dense_multivector_demo", points=points)
Шаг 4. Запрос с извлечением и переранжированием за один вызов#
Выполните поиск:
results = client.query_points(
collection_name="dense_multivector_demo",
prefetch=models.Prefetch(
query=dense_query,
using="dense",
),
query=colbert_query,
using="colbert",
limit=3,
with_payload=True
)
Плотный вектор быстро извлекает лучших кандидатов.
Мультивектор Colbert повторно ранжирует их с помощью точного сопоставления на уровне токенов
MaxSim.Возвращается три лучших результата.
Заключение#
Поиск с использованием многовекторов является одной из самых мощных возможностей векторной базы данных при правильном использовании. Благодаря этой функциональности в Vector DB можно:
Хранить вложения на уровне токенов нативным образом.
Отключать индексацию для снижения нагрузки.
Выполнять быстрое извлечение и точное переранжирование за один вызов API.
Эффективно масштабировать позднее взаимодействие.
Комбинируя FastEmbed и Vector DB можно получить готовый к производству конвейер для переранжирования в стиле ColBERT без потери ресурсов.