Оптимизация Weaviate для поиска по встраиванию изображений без сохранения изображений

В настоящее время я работаю над проектом, в котором использую Weaviate в качестве векторной базы данных для хранения и поиска изображений на основе их вложений. Сами изображения хранятся в корзине S3. Моя цель — использовать возможности Weaviate исключительно для хранения и поиска вложенных изображений, сохраняя при этом сами файлы изображений в корзине S3.

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

Может ли кто-нибудь подсказать мне, как настроить Weaviate для хранения только вложений и использовать его исключительно в качестве поисковой системы для изображений без сохранения самих файлов изображений? Ваши идеи и предложения будут очень признательны!

Заранее спасибо за вашу помощь!


На данный момент я использую следующую схему:

      const schemaConfig = {
    "class": "Product",
    "description": "Product images",
    "moduleConfig": {
        "img2vec-neural": {
            "imageFields": [
                "image"
            ]
        }
    },
    "properties": [
        {
            "dataType": [
                "blob"
            ],
            "description": "Product image",
            "name": "image"
        },
        {
            "dataType": [
                "text"
            ],
            "description": "label name (description) of the given image.",
            "name": "labelName"
        }
    ],
    "vectorIndexType": "hnsw",
    "vectorizer": "img2vec-neural"
}

Файл создания Docker:

      ---
version: '3.4'
services:
  weaviate:
    command:
    - --host
    - 0.0.0.0
    - --port
    - '8080'
    - --scheme
    - http
    image: semitechnologies/weaviate:1.20.5
    ports:
    - 8080:8080
    restart: on-failure:0
    environment:
      IMAGE_INFERENCE_API: 'http://i2v-neural:8080'
      QUERY_DEFAULTS_LIMIT: 25
      AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true'
      PERSISTENCE_DATA_PATH: '/var/lib/weaviate'
      DEFAULT_VECTORIZER_MODULE: 'img2vec-neural'
      ENABLE_MODULES: 'img2vec-neural'
      CLUSTER_HOSTNAME: 'node1'
  i2v-neural:
    image: semitechnologies/img2vec-pytorch:resnet50
    environment:
      ENABLE_CUDA: '0'
...

Один из способов решения этой проблемы — использование пользовательского векторного API . В этом случае я подумал об использовании средства внедрения Weaviate img2vec, но не смог понять, как использовать его отдельно.

Или я мог бы самостоятельно разместить средство для внедрения изображений, но предпочел бы использовать готовое решение.

1 ответ

TL;DR: проблема решена путем открытия API . Оно имеет/vectorsконечная точка, которая получает запрос POST с телом{id: TEMP_FILENAME, image: BASE64_IMG}. Он возвращает объект сvectorатрибут. После этого последовало руководство по пользовательскому векторному API .


Удалитьimg2vec-neuralмодуль из среды weaviate и откройте порт 8080i2v-neural(здесь это 8081).

      weaviate:
    ...
    environment:
      QUERY_DEFAULTS_LIMIT: 25
      AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true'
      PERSISTENCE_DATA_PATH: '/var/lib/weaviate'
      CLUSTER_HOSTNAME: 'node1'
  i2v-neural:
    image: semitechnologies/img2vec-pytorch:resnet50
    ports:
    - 8081:8080
    ...

Вот пользовательская функция JavaScript для создания вектора изображения (изображения):

      export const vectorizeImage = async (b64Img) => {

    const req = await fetch('http://localhost:8081/vectors', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json',
        },
        body: JSON.stringify({
            id: "image.jpg",
            image: b64Img,
        }),
    });

    const res = await req.json();

    if (res.error) {
        console.error(res.error);
        return;
    }

    return res.vector;
}

Создайте схему. Обратите внимание, что здесь вы не указываетеvectorizer.

      const schemaConfig = {
    class: "Product",
    vectorIndexType: "hnsw",
}

await client
    .schema
    .classCreator()
    .withClass(schemaConfig)
    .do();

Вот как создать элемент в БД с некоторыми свойствами.

      const { id, item_no, image_url, unit_price } = product;
const b64 = await getImageUrlBase64(image_url);
const vector = await vectorizeImage(b64);

await client.data.creator()
    .withClassName('Product')
    .withProperties({
        item_no: item_no,
        image_url: image_url,
    })
    .withVector(vector)
    .do();
Другие вопросы по тегам