Оптимизация 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();