banner
HuggingLLM

HuggingLLM

Make it & Share it!
x

Weaviate + Google Vertex AIによるマルチモーダル埋め込みの実現

多モーダル埋め込みの概要#

多モーダル埋め込み(Multimodal Embeddings)とは、異なるデータモード(テキスト、画像、音声、動画など)を埋め込み表現することを指します。この技術により、Weaviate はさまざまなモードの入力(テキストや画像など)を統一されたベクトル表現に変換し、高効率な類似性検索や他の機械学習タスクに利用できます。Weaviate と Google Vertex AI の統合により、この機能はさらに使いやすく、強力になりました。Weaviate と Google AI の多モーダル埋め込みの統合により、ユーザーは異なるタイプの多モーダルデータを処理および検索できるようになり、大規模データベースでテキスト、画像、動画などの異なるデータモードを扱うシーンに非常に役立ちます。統合された Google Vertex AI モデルは、強力な性能を持ち、さまざまな複雑な意味論的および多モーダル検索をサポートし、データ管理とクエリのインテリジェンスレベルを向上させます。

image

Docker を使用して Weaviate インスタンスをデプロイ#

services:
  weaviate:
    command:
    - --host
    - 0.0.0.0
    - --port
    - '8080'
    - --scheme
    - http
    image: cr.weaviate.io/semitechnologies/weaviate:1.26.4
    ports:
    - 8080:8080
    - 50051:50051
    volumes:
    - ./weaviate_data:/var/lib/weaviate
    - /root/.config/gcloud/application_default_credentials.json:/etc/weaviate/gcp-credentials.json
    restart: on-failure:0
    environment:
      QUERY_DEFAULTS_LIMIT: 25
      AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true'
      PERSISTENCE_DATA_PATH: '/var/lib/weaviate'
      DEFAULT_VECTORIZER_MODULE: 'multi2vec-palm'
      ENABLE_MODULES: 'multi2vec-palm,ref2vec-centroid'
      CLUSTER_HOSTNAME: 'node1'
      GOOGLE_APPLICATION_CREDENTIALS: '/etc/weaviate/gcp-credentials.json'
      USE_GOOGLE_AUTH: 'true'

Vertex AI 統合を正しく使用するには、合法的な API 資格情報を提供する必要があります。具体的な設定方法については、API credentialsを参照してください。

コードを書く#

Weaviate に接続して接続を確認#

import weaviate

client = weaviate.connect_to_local()

client.is_ready()

コレクションを作成#

from weaviate.classes.config import Configure

if client.collections.exists("AnimeGirls"):
    client.collections.delete("AnimeGirls")

client.collections.create(
    name="AnimeGirls",
    vectorizer_config=Configure.Vectorizer.multi2vec_palm(
        image_fields=["image"],
        text_fields=["text"],
        video_fields=["video"],
        project_id="neurosearch-436306",
        location="europe-west1",
        model_id="multimodalembedding@001",
        dimensions=1408,
    ),
)

ツール関数を作成#

import base64
def to_base64(file_path: str) -> str:
    with open(file_path, "rb") as file:
        return base64.b64encode(file.read()).decode("utf-8")

データをインポート#

import os
from weaviate.util import generate_uuid5
anime_girls = client.collections.get("AnimeGirls")

sources = os.listdir("./images/")

with anime_girls.batch.dynamic() as batch:
    for name in sources:
        print(f"Adding {name}")

        path = "./images/" + name

        batch.add_object(
            {
                "name": name,
                "image": to_base64(path),
                "path": path,
                "mediaType": "image",
            },
            uuid=generate_uuid5(name),
        )

すべてのデータが正常にインポートされたか確認#

if len(anime_girls.batch.failed_objects) > 0:
    print(f"Failed to import {len(anime_girls.batch.failed_objects)} objects")
    for failed_object in anime_girls.batch.failed_objects:
        print(f"e.g. Failed to import object with error: {failed_object.message}")
else:
    print("All objects imported successfully")

テキストによる検索#

import json
response = anime_girls.query.near_text(
    query="Seeing a girl through glasses",
    return_properties=["name", "path", "mediaType"],
    limit=2,
)

for obj in response.objects:
    print(json.dumps(obj.properties, indent=2))
from IPython.display import Image, display

def display_image(item: dict):
    path = item["path"]
    display(Image(path, width=300))

display_image(response.objects[0].properties)

image

画像による検索#

response = anime_girls.query.near_image(
    near_image=to_base64("./images/121955436_p0_master1200.jpg"),
    return_properties=["name", "path", "mediaType"],
    limit=2,
)

# for obj in response.objects:
#     print(json.dumps(obj.properties, indent=2))

display_image(response.objects[0].properties)

image

ハイブリッド検索#

response = anime_girls.query.hybrid(
    query="Seeing a girl through glasses",
    return_properties=["name", "path", "mediaType"],
    limit=2,
)

# for obj in response.objects:
#     print(json.dumps(obj.properties, indent=2))

display_image(response.objects[0].properties)

すべてのベクトルを返す#

import numpy as np
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt

# embeddingはあなたの1408次元データだと仮定
embedding = np.array([item.vector['default'] for item in anime_girls.iterator(include_vector=True)])

# PCAを使用して1408次元データを2次元に削減
pca = PCA(n_components=2)
reduced_embedding = pca.fit_transform(embedding)

# 次元削減されたデータをプロット
plt.figure(figsize=(10, 7))
plt.scatter(reduced_embedding[:, 0], reduced_embedding[:, 1], alpha=0.5)
plt.title('PCA of AnimeGirls Embeddings')
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.show()

image

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。