Конец OCR? Этот новый инструментарий ищет изображения, как человек

Конец OCR? Этот новый инструментарий ищет изображения, как человек

7 августа 2025 г.

Мы рады объявить, чтоКокоиндекс теперь поддерживает нативную интеграцию с Кольпали- включаетМноговодитель индексации изображений на уровне патчаИспользование передовых мультимодальных моделей.

С всего лишь нескольких строк кода вы можете встроить и индекс изображений с архитектурой позднего взаимодействия Кольпали, полностью интегрированной в систему композиции Cocoindex.

Почему кольпали для индексации?

Кольпали (контекстуальное позднее взаимодействие над пятнами)является мощной моделью для мультимодального поиска.

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

  • Мелкозернистый визуальный поиск:
    • Каждое изображение разделено на сетку (обычно 32x32, генерируя 1024 патча на страницу), и каждый патч встроен с контекстуальным осознанием как визуальных, так и текстовых сигналов.
    • Во время поиска пользовательские запросы также разбиваются на встроенные токеновые встроения, что позволяет соответствовать конкретным текстовым токенам с наиболее релевантными патчами изображения. Это поддерживает сопоставление в гораздо более тонкой пространственной и семантической гранулярности, чем одноклеточные модели.
  • Сохранение пространственной и семантической структуры:
    • Традиционные методы переполняют изображения документов в глобальные векторы, теряя жизненно важную макет и контекст на основе региона. Пластырь Кольпали сохраняют пространственные отношения и могут локализовать совпадения запросов (например, поиск диаграммы в руководстве или таблице в форме), что делает результаты поиска более точными и интерпретируемыми.
  • Высокий отзыв по богатым объектам сцен:
    • Сцены с несколькими объектами, плотным текстом, графикой или смешанным контентом, потому что модель не «забывает» небольшие, но важные области. Каждый патч рассматривается индивидуально, снижая вероятность отсутствия соответствующей информации даже на визуально загроможденных страницах.
  • Расширенные стратегии поиска (позднее взаимодействие и maxsim):
    • Кольпали использует парадигму позднего взаимодействия (LI), вдохновленной Колбертом, где токены запросов сравниваются со всеми патч -встроениями из документа. Операция Maxsim сохраняет только максимальный показатель сходства для каждого токена запроса, а затем суммирует их для окончательного показателя релевантности. Это обеспечивает точный, интерпретируемый и эффективный поиск, обрабатывая как масштабные поиски, так и нюансированные запросы.
    • Использование LI также снижает вычислительную нагрузку во время запроса, избегая передвижного плотного перекрестного атя или кодирования соединения, делая поиск как быстрым, так и точным.
  • Обход традиционных трубопроводов OCR:
    • Поскольку изображения обрабатываются изначально, нет необходимости в подверженных ошибкам извлечения текста или этапов сегментации, повышения скорости и сквозной эффективности. Этот подход также может захватывать визуальные элементы, которые пропускают OCR, такие как диаграммы, рисунки или логотипы.
  • Масштабируемость и эффективность хранения:
    • Схемы сжатия, такие как квантование и обрезка (иерархическое сжатие патчей, HPC-Colpali), могут дополнительно сокращать потребности в хранении и ускорить вычисления сходства, позволяя системам на основе Кольпала масштабировать до миллиардов документов или поиска на грани без потери точности.

Объявите поток индексации изображения с помощью кокоиндекса / Qdrant

Индексирование изображений с кольпали

Этот поток иллюстрирует, как мы будем обрабатывать и индекс изображений с использованием Colpali:

  1. Приглашение файлов изображений из локальной файловой системы
  2. ИспользоватьКольпалиЧтобы встроить каждое изображение в мульти-векторы на уровне патча
  3. Необязательно извлечь подписи изображения с помощью LLM
  4. Экспортируйте встроенные (и дополнительные подписи) в коллекцию Qdrant

1. Переход изображений

Мы начинаем с определения потока для чтения.jpgВ.jpeg, и.pngфайлы из локального каталога с использованиемLocalFileПолем


@cocoindex.flow_def(name="ImageObjectEmbeddingColpali")
def image_object_embedding_flow(flow_builder, data_scope):
    data_scope["images"] = flow_builder.add_source(
        cocoindex.sources.LocalFile(
            path="img",
            included_patterns=["*.jpg", "*.jpeg", "*.png"],
            binary=True
        ),
        refresh_interval=datetime.timedelta(minutes=1),
    )

Аadd_sourceфункция устанавливает таблицу с такими полями, какfilenameиcontentПолем Изображения автоматически перескачены каждую минуту.


2. Обработайте каждое изображение и соберите встраивание

2.1 встроить изображение в Кольпали

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


colpali_embed = cocoindex.functions.ColPaliEmbedImage(model="vidore/colpali-v1.2")

Внутри потока:


    img_embeddings = data_scope.add_collector()
    with data_scope["images"].row() as img:
        img["embedding"] = img["content"].transform(colpali_embed)

Это преобразование превращает необработанные байты изображения в список векторов - по одному на патч - который впоследствии может использоваться дляПоздний поиск взаимодействияПолем


3. Соберите и экспортируйте вторжения

Как только мы обработаем каждое изображение, мы собираем его метаданные и встраиваем и отправляем его в Qdran


        collect_fields = {
            "id": cocoindex.GeneratedField.UUID,
            "filename": img["filename"],
            "embedding": img["embedding"],
        }

        if ollama_model_name is not None:
            collect_fields["caption"] = img["caption"]

        img_embeddings.collect(**collect_fields)

Затем мы экспортируем в Qdrant, используяQdrantцель:


    img_embeddings.export(
        "img_embeddings",
        cocoindex.targets.Qdrant(collection_name="ImageSearchColpali"),
        primary_key_fields=["id"],
    )

Это создает векторную коллекцию в Qdrant, которая поддерживаетМноговорные поля-Требуется для поиска позднего взаимодействия в стиле Кольпаль.


4. Включить индексацию в реальном времени

Чтобы автоматически поддерживать индекс изображения актуально, мы завершаем поток вFlowLiveUpdater:


@asynccontextmanager
async def lifespan(app: FastAPI):
    load_dotenv()
    cocoindex.init()
    image_object_embedding_flow.setup(report_to_stdout=True)
    app.state.live_updater = cocoindex.FlowLiveUpdater(image_object_embedding_flow)
    app.state.live_updater.start()
    yield

Это сохраняет ваш векторный индекс свежим по мере появления новых изображений.


🧬 Что на самом деле хранится?

В отличие от типичных конвейеров поиска изображений, которые хранят один глобальный вектор на изображение, магазины Colpali:


Vector[Vector[Float32, N]]

Где:

  • Внешнее измерение - этоколичество патчей
  • Внутреннее измерение - этоСкрытый размер модели

Это делает индексМноговетанный готови совместим со стратегиями запроса позднего взаимодействия-например, Maxsim или выучившегося слияния.


🔌 Индексация в реальном времени с живым обновлением

Вы также можете прикрепить кокосоиндексFlowLiveUpdaterк вашему приложению Fastapi или любого приложения Python, чтобы ваш индекс Colpali синхронизировался в режиме реального времени:


from fastapi import FastAPI
from contextlib import asynccontextmanager

@asynccontextmanager
async def lifespan(app: FastAPI):
    load_dotenv()
    cocoindex.init()
    image_object_embedding_flow.setup(report_to_stdout=True)
    app.state.live_updater = cocoindex.FlowLiveUpdater(image_object_embedding_flow)
    app.state.live_updater.start()
    yield

🌳 Понимание и приложение

Обратитесь к этому примеру по строительству запросов и приложений:https://cocoindex.io/blogs/live-image-search#3-query-the-index

Убедитесь, что мы используем Кольпали, чтобы внедрить запрос

@app.get("/search")
def search(
    q: str = Query(..., description="Search query"),
    limit: int = Query(5, description="Number of results"),
) -> Any:
    # Get the multi-vector embedding for the query
    query_embedding = text_to_colpali_embedding.eval(q)

Построенный с учетом гибкости

Работаете ли вы над:

  • Визуальная тряпка
  • Мультимодальные системы поиска
  • Мелкозернистые инструменты визуального поиска
  • Или хочу привнести понимание изображения в рабочие процессы агента искусственного интеллекта

Cocoindex + Colpali дает вам модульную, современную основу для строительства.

Мы постоянно добавляем больше примеров и улучшаем наше время выполнения. Если вы нашли это полезным, пожалуйста, ⭐ StarКокоиндекс на GitHubи поделиться этим с другими.

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


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE