В этом руководстве мы создаём комплексный конвейер для поиска визуальных документов с помощью ColPali. Мы уделяем особое внимание надёжности настройки, устраняя распространённые конфликты зависимостей и обеспечивая стабильность среды.
Мы преобразуем страницы PDF в изображения, внедряем их с помощью мультивекторных представлений ColPali и используем оценку позднего взаимодействия для извлечения наиболее релевантных страниц по запросу на естественном языке. Обрабатывая каждую страницу визуально, а не как обычный текст, мы сохраняем макет, таблицы и рисунки, которые часто теряются при традиционном поиске по тексту.
Подготовка среды выполнения
Мы подготавливаем чистую и стабильную среду выполнения, удаляя конфликтующие пакеты и обновляя pip. Мы явно устанавливаем совместимые версии Pillow и torchaudio, чтобы избежать ошибок импорта во время выполнения. Затем мы устанавливаем ColPali и его необходимые зависимости, чтобы остальная часть руководства работала без перебоев.
«`python
import subprocess, sys, os, json, hashlib
def pip(cmd):
subprocess.check_call([sys.executable, «-m», «pip»] + cmd)
pip([«uninstall», «-y», «pillow», «PIL», «torchaudio», «colpali-engine»])
pip([«install», «-q», «—upgrade», «pip»])
pip([«install», «-q», «pillow<12", "torchaudio==2.8.0"])
pip([«install», «-q», «colpali-engine», «pypdfium2», «matplotlib», «tqdm», «requests»])
«`
Импорт библиотек и загрузка модели
Мы импортируем все необходимые библиотеки и определяем, доступен ли GPU для ускорения. Мы загружаем модель ColPali и процессор с соответствующей точностью и реализацией внимания на основе времени выполнения. Мы обеспечиваем готовность модели к выводу, переключая её в режим оценки.
«`python
import torch
import requests
import pypdfium2 as pdfium
from PIL import Image
from tqdm import tqdm
import matplotlib.pyplot as plt
from transformers.utils.importutils import isflashattn2_available
from colpali_engine.models import ColPali, ColPaliProcessor
device = «cuda» if torch.cuda.is_available() else «cpu»
dtype = torch.float16 if device == «cuda» else torch.float32
MODEL_NAME = «vidore/colpali-v1.3»
model = ColPali.from_pretrained(
MODEL_NAME,
torch_dtype=dtype,
device_map=device,
attnimplementation=»flashattention2″ if device == «cuda» and isflashattn2_available() else None,
).eval()
processor = ColPaliProcessor.frompretrained(MODELNAME)
«`
Загрузка образца PDF и рендеринг страниц
Мы скачиваем образец PDF и рендерим его страницы в виде изображений с высоким разрешением RGB. Мы ограничиваем количество страниц, чтобы сделать руководство лёгким и быстрым в Colab. Мы сохраняем визуализированные страницы в памяти для прямого визуального встраивания.
«`python
PDF_URL = «https://arxiv.org/pdf/2407.01449.pdf»
pdfbytes = requests.get(PDFURL).content
pdf = pdfium.PdfDocument(pdf_bytes)
pages = []
MAX_PAGES = 15
for i in range(min(len(pdf), MAX_PAGES)):
page = pdf[i]
img = page.render(scale=2).to_pil().convert(«RGB»)
pages.append(img)
«`
Генерация мультивекторных вложений
Мы генерируем мультивекторные вложения для каждой визуализированной страницы с помощью кодировщика изображений ColPali. Мы обрабатываем страницы небольшими партиями, чтобы оставаться в пределах ограничений памяти GPU. Затем мы объединяем все вложения страниц в один тензор, который поддерживает эффективную оценку позднего взаимодействия.
«`python
page_embeddings = []
batch_size = 2 if device == «cuda» else 1
for i in tqdm(range(0, len(pages), batch_size)):
batchimgs = pages[i:i+batchsize]
batch = processor.processimages(batchimgs)
batch = {k: v.to(model.device) for k, v in batch.items()}
with torch.no_grad():
emb = model(batch)
page_embeddings.extend(list(emb.cpu()))
pageembeddings = torch.stack(pageembeddings)
«`
Извлечение релевантных страниц
Мы определяем логику извлечения, которая оценивает запросы по вложениям страниц с помощью позднего взаимодействия. Мы визуализируем страницы с наивысшим рейтингом, чтобы качественно проверить качество извлечения. Мы также предоставляем небольшой помощник для поиска, который возвращает структурированные результаты, упрощая расширение или интеграцию конвейера.
«`python
def retrieve(query, top_k=3):
q = processor.process_queries([query])
q = {k: v.to(model.device) for k, v in q.items()}
with torch.no_grad():
q_emb = model(q).cpu()
scores = processor.scoremultivector(qemb, pageembeddings)[0]
vals, idxs = torch.topk(scores, top_k)
return [(int(i), float(v)) for i, v in zip(idxs, vals)]
def show(img, title):
plt.figure(figsize=(6,6))
plt.imshow(img)
plt.axis(«off»)
plt.title(title)
plt.show()
query = «Что такое ColPali и какую проблему он решает?»
results = retrieve(query, top_k=3)
for rank, (idx, score) in enumerate(results, 1):
show(pages[idx], f»Ранг {rank} — Страница {idx+1}»)
def search(query, k=5):
return [{«page»: i+1, «score»: s} for i, s in retrieve(query, k)]
print(json.dumps(search(«late interaction retrieval»), indent=2))
«`
В заключение мы получаем компактную, но мощную систему визуального поиска, которая демонстрирует, как ColPali позволяет эффективно выполнять поиск документов с учётом макета на практике. Мы внедрили страницы один раз, повторно используем эти вложения и извлекаем результаты с интерпретируемыми оценками релевантности. Этот рабочий процесс даёт нам прочную основу для масштабирования до более крупных коллекций документов, добавления индексации для ускорения или создания генерации на основе извлечённых страниц, сохраняя при этом основной конвейер простым, воспроизводимым и удобным для Colab.
1. Какие технические проблемы решает использование ColPali для поиска визуальных документов и как это влияет на SEO?
Ответ: ColPali позволяет устранять распространённые конфликты зависимостей и обеспечивать стабильность среды при поиске визуальных документов. Это помогает создавать более надёжные и эффективные системы поиска, что может улучшить видимость контента в поисковых системах.
2. Какие шаги необходимо предпринять для подготовки среды выполнения перед использованием ColPali?
Ответ: Для подготовки среды выполнения необходимо удалить конфликтующие пакеты, обновить pip, явно установить совместимые версии Pillow и torchaudio, а затем установить ColPali и его необходимые зависимости.
3. Как происходит генерация мультивекторных вложений для визуализированных страниц в данном конвейере?
Ответ: Мультивекторные вложения генерируются для каждой визуализированной страницы с помощью кодировщика изображений ColPali. Страницы обрабатываются небольшими партиями, чтобы оставаться в пределах ограничений памяти GPU. Затем все вложения страниц объединяются в один тензор для эффективной оценки позднего взаимодействия.
4. Какие преимущества даёт использование позднего взаимодействия для извлечения релевантных страниц?
Ответ: Использование позднего взаимодействия позволяет оценить запросы по вложениям страниц и извлечь наиболее релевантные страницы. Это обеспечивает более точный и эффективный поиск, что может улучшить качество контента и его видимость в поисковых системах.
5. Какие дополнительные возможности предоставляет система визуального поиска, основанная на ColPali?
Ответ: Система визуального поиска, основанная на ColPali, позволяет масштабировать поиск до более крупных коллекций документов, добавлять индексацию для ускорения поиска и создавать генерацию на основе извлечённых страниц. Это обеспечивает гибкость и расширяемость системы, что может быть полезно для различных приложений и проектов.