Многовекторный поиск (ColBERT)
Индексируйте несколько векторов для каждого документа (по одному на токен или фрагмент), чтобы сопоставление было более точным.
«Многовекторный поиск (ColBERT)» — бесплатный урок AI Agents на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения AI Agents, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс AI Agents содержит 4 уроков всего.
Части этого урока еще не переведены и отображаются на английском.
Одного вектора недостаточно
Стандартный RAG преобразует каждый фрагмент в один вектор. Этот вектор усредняет всю информацию во фрагменте, из-за чего теряются тонкие смысловые сигналы.
При многовекторном поиске для каждого документа хранятся MULTIPLE векторов, что позволяет точнее сопоставлять результаты.
Идея ColBERT
ColBERT (Khattab и Zaharia, 2020) создаёт эмбеддинг для каждого TOKEN документа и каждого токена запроса, а затем вычисляет максимальное сходство:
score(q, d) = sum over q_token in q: max over d_token in d: cos(q_token, d_token)Почему ColBERT превосходит одновекторный подход
- Учитывает несколько аспектов документа, чего не может один вектор
- Лучше работает с длинными документами
- Обеспечивает более высокую полноту поиска по редким терминам
Стоимость ColBERT
Хранение одного вектора для каждого токена вместо одного для каждого фрагмента означает:
- Если во фрагменте 500 токенов, хранилище увеличивается в 500 раз
- При каждом поиске сравнивается гораздо больше пар
Квантизация и прореживание уменьшают этот объём в 10–50 раз, но стоимость всё равно остаётся высокой.
ColBERTv2
ColBERTv2 добавляет остаточное сжатие: токены объединяются в центроиды, а каждый токен хранится как (идентификатор центроида, небольшой остаток). Объём хранилища уменьшается в 50 раз.
Запуск ColBERT
Библиотека RAGatouille упрощает этот процесс:
# pip install ragatouille
from ragatouille import RAGPretrainedModel
rag = RAGPretrainedModel.from_pretrained('colbert-ir/colbertv2.0')
rag.index(collection=documents, index_name='my_corpus')
results = rag.search(query='What is the refund policy?', k=5)Многовекторный поиск на практике
Помимо ColBERT, существуют и другие многовекторные подходы:
- Родительский и дочерний элементы — создавайте эмбеддинги небольших фрагментов, а извлекайте крупные родительские элементы
- Сводка и фрагменты — создавайте эмбеддинги и сводки документа, и отдельных фрагментов
- Гипотетические вопросы — создавайте эмбеддинги пар вопросов и ответов, синтезированных для каждого документа
Hypothetical Questions Pattern
def index_with_hypos(doc):
# Generate 5 plausible questions this doc could answer
questions = llm.invoke(f'Write 5 questions answered by this doc:\n{doc}').content.split('\n')
for q in questions:
vector_db.add(embed(q), payload={'doc': doc, 'question': q})
# Now queries that match a stored hypothetical question retrieve the doc.Parent-Child with LangChain
from langchain.retrievers import ParentDocumentRetriever
from langchain.storage import InMemoryStore
store = InMemoryStore()
retriever = ParentDocumentRetriever(
vectorstore=child_vectorstore,
docstore=store,
child_splitter=child_splitter, # small
parent_splitter=parent_splitter # large
)
retriever.add_documents(documents)
# Indexes small chunks, returns large parents.Когда использовать ColBERT
- Поиск с высокими требованиями к точности, например юридический или медицинский
- Длинные документы
- Когда допустимы затраты на хранение
Когда от него следует отказаться
- Небольшие наборы документов
- Пути, чувствительные к задержке
- Проекты с жёсткими ограничениями стоимости
Гибридный поиск с BM25
Для максимальной полноты поиска объедините многовекторный поиск с классическим поиском по ключевым словам BM25. Используйте слияние по обратным рангам, чтобы объединить результаты.
Компромисс при использовании ColBERT
В чём заключается главный компромисс многовекторного поиска в стиле ColBERT?
Повторение
Один вектор на фрагмент приводит к потере информации. ColBERT хранит векторы для каждого токена, повышая точность. RAGatouille упрощает использование этого подхода. Применяйте его, когда важна полнота поиска и затраты допустимы.
Часто задаваемые вопросы
Урок «Многовекторный поиск (ColBERT)» бесплатный?
Да — полный текст урока «Многовекторный поиск (ColBERT)» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс AI Agents, подпишись на CoddyKit PRO. Курс AI Agents содержит 4 уроков всего.
Чему я научусь в уроке «Многовекторный поиск (ColBERT)»?
Индексируйте несколько векторов для каждого документа (по одному на токен или фрагмент), чтобы сопоставление было более точным. Ты практикуешь AI Agents с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать AI Agents?
Предыдущий опыт не требуется. AI Agents на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Многовекторный поиск (ColBERT)»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке AI Agents?
Да. Каждый урок AI Agents включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Переранжирование с помощью кросс-энкодеров
- HyDE: гипотетические эмбеддинги документов
- Многовекторный поиск (ColBERT)
- Оценка RAG (RAGAS, Recall@K)