Weaviate

このセクションでは、ドキュメントの埋め込みを保存し、類似性検索を実行するための Weaviate VectorStore のセットアップについて説明します。

Weaviate とは何ですか?

Weaviate (英語) は、オープンソースのベクトルデータベースです。これにより、お気に入りの ML モデルからデータオブジェクトとベクトル埋め込みを保存し、数十億のデータオブジェクトにシームレスに拡張できます。ドキュメントの埋め込み、コンテンツ、メタデータを保存し、メタデータのフィルタリングなど、それらの埋め込みを検索するためのツールを提供します。

前提条件

  1. EmbeddingModel インスタンスを使用してドキュメントの埋め込みを計算します。いくつかのオプションが利用可能です:

    • Transformers Embedding - ローカル環境での埋め込みを計算します。ONNX Transformers の埋め込み手順に従ってください。

    • OpenAI Embedding - OpenAI 埋め込みエンドポイントを使用します。OpenAI サインアップ (英語) でアカウントを作成し、API キー (英語) で API キートークンを生成する必要があります。

    • Azure OpenAI Embedding または PostgresML Embedding Model も使用できます。

  2. Weaviate cluster。Docker コンテナーでクラスターをローカルにセットアップすることも、Weaviate クラウドサービス (英語) を作成することもできます。後者の場合、Weaviate アカウントを作成し、クラスターを設定し、ダッシュボードの詳細 (英語) からアクセス API キーを取得する必要があります。

まだプロビジョニングされていない場合、WeaviateVectorStore は起動時に必要な SpringAiWeaviate オブジェクトスキーマを作成します。

自動構成

次に、WeaviateVectorStore Boot スターターの依存関係をプロジェクトに追加します。

<dependency>
	<groupId>org.springframework.ai</groupId>
	<artifactId>spring-ai-weaviate-store-spring-boot-starter</artifactId>
</dependency>

または、Gradle build.gradle ビルドファイルに保存します。

dependencies {
    implementation 'org.springframework.ai:spring-ai-weaviate-store-spring-boot-starter'
}

ベクトルストアの実装では必要なスキーマを初期化できますが、適切なコンストラクターで initializeSchema ブール値を指定するか、application.properties ファイルで …​initialize-schema=true を設定することによってオプトインする必要があります。

これは重大な変更です。Spring AI の以前のバージョンでは、このスキーマの初期化はデフォルトで行われていました。

ベクトルストアでは、ドキュメントの埋め込みを計算するために EmbeddingModel インスタンスも必要です。利用可能な EmbeddingModel の実装のいずれかを選択できます。

たとえば、OpenAI EmbeddingModel を使用するには、次の依存関係をプロジェクトに追加します。

<dependency>
	<groupId>org.springframework.ai</groupId>
	<artifactId>spring-ai-openai-spring-boot-starter</artifactId>
</dependency>

または、Gradle build.gradle ビルドファイルに保存します。

dependencies {
    implementation 'org.springframework.ai:spring-ai-openai-spring-boot-starter'
}
Spring AI BOM をビルドファイルに追加するには、"依存関係管理" セクションを参照してください。マイルストーンやスナップショットリポジトリをビルドファイルに追加するには、リポジトリセクションを参照してください。

Weaviate に接続して WeaviateVectorStore を使用するには、インスタンスのアクセス詳細を提供する必要があります。単純な構成は、Spring Boot の application.properties を介して提供できます。

spring.ai.vectorstore.weaviate.host=<host of your Weaviate instance>
spring.ai.vectorstore.weaviate.api-key=<your api key>
spring.ai.vectorstore.weaviate.scheme=http

# API key if needed, e.g. OpenAI
spring.ai.openai.api.key=<api-key>
デフォルト値と構成オプションについては、構成パラメーターのリストを確認してください。

これで、Weaviate ベクトルストアをアプリケーションに自動接続して使用できるようになりました。

@Autowired VectorStore vectorStore;

// ...

List <Document> documents = List.of(
    new Document("Spring AI rocks!! Spring AI rocks!! Spring AI rocks!! Spring AI rocks!! Spring AI rocks!!", Map.of("meta1", "meta1")),
    new Document("The World is Big and Salvation Lurks Around the Corner"),
    new Document("You walk forward facing the past and you turn back toward the future.", Map.of("meta2", "meta2")));

// Add the documents
vectorStore.add(documents);

// Retrieve documents similar to a query
List<Document> results = vectorStore.similaritySearch(SearchRequest.query("Spring").withTopK(5));

構成プロパティ

Spring Boot 構成で次のプロパティを使用して、weaviate ベクトルストアをカスタマイズできます。

プロパティ 説明 デフォルト値

spring.ai.vectorstore.weaviate.host

Weaviate サーバーのホスト。

localhost:8080

spring.ai.vectorstore.weaviate.scheme

接続スキーマ。

http

spring.ai.vectorstore.weaviate.api-key

Weaviate サーバーでの認証に使用する API キー。

-

spring.ai.vectorstore.weaviate.object-class

"SpringAiWeaviate"

spring.ai.vectorstore.weaviate.consistency-level

一貫性と速度の間の望ましいトレードオフ

ConsistentLevel.ONE

spring.ai.vectorstore.weaviate.filter-field

spring.ai.vectorstore.weaviate.filter-field.< フィールド名>=< フィールド型>

-

spring.ai.vectorstore.weaviate.headers

-

spring.ai.vectorstore.weaviate.initialize-schema

必要なスキーマを初期化するかどうか

false

メタデータのフィルタリング

WeaviateVectorStore では、汎用の移植可能なメタデータフィルターを利用することもできます。

例: 次のいずれかのテキスト式言語を使用できます。

vectorStore.similaritySearch(
   SearchRequest
      .query("The World")
      .withTopK(TOP_K)
      .withSimilarityThreshold(SIMILARITY_THRESHOLD)
      .withFilterExpression("country in ['UK', 'NL'] && year >= 2020"));

または、プログラムで DSL という式を使用します。

FilterExpressionBuilder b = new FilterExpressionBuilder();

vectorStore.similaritySearch(
   SearchRequest
      .query("The World")
      .withTopK(TOP_K)
      .withSimilarityThreshold(SIMILARITY_THRESHOLD)
      .withFilterExpression(b.and(
         b.in("country", "UK", "NL"),
         b.gte("year", 2020)).build()));

移植可能なフィルター式は、独自の Weaviate where filters (英語) に自動的に変換されます。例: 次のポータブルフィルター式:

country in ['UK', 'NL'] && year >= 2020

は、Weaviate GraphQL に変換されます。ここで、フィルター式は次 (英語) のとおりです。

operator:And
   operands:
      [{
         operator:Or
         operands:
            [{
               path:["meta_country"]
               operator:Equal
               valueText:"UK"
            },
            {
               path:["meta_country"]
               operator:Equal
               valueText:"NL"
            }]
      },
      {
         path:["meta_year"]
         operator:GreaterThanEqual
         valueNumber:2020
      }]

手動構成

Spring Boot 自動構成を使用する代わりに、WeaviateVectorStore を手動で構成できます。このためには、spring-ai-weaviate-store 依存関係をプロジェクトに追加する必要があります。

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-weaviate-store</artifactId>
</dependency>

または、Gradle build.gradle ビルドファイルに保存します。

dependencies {
    implementation 'org.springframework.ai:spring-ai-weaviate-store'
}

アプリケーションで Weaviate を構成するには、WeaviateClient を作成します。

@Bean
public WeaviateClient weaviateClient() {
   try {
      return WeaviateAuthClient.apiKey(
            new Config(<YOUR SCHEME>, <YOUR HOST>, <YOUR HEADERS>),
            <YOUR API KEY>);
   }
   catch (AuthException e) {
      throw new IllegalArgumentException("WeaviateClient could not be created.", e);
   }
}

Spring Boot OpenAI スターターをプロジェクトに追加して、OpenAI の埋め込みと統合します。これにより、埋め込みクライアントの実装が提供されます。

@Bean
public WeaviateVectorStore vectorStore(EmbeddingModel embeddingModel, WeaviateClient weaviateClient) {

   WeaviateVectorStoreConfig.Builder configBuilder = WeaviateVectorStore.WeaviateVectorStoreConfig.builder()
      .withObjectClass(<YOUR OBJECT CLASS>)
      .withConsistencyLevel(<YOUR CONSISTENCY LEVEL>);

   return new WeaviateVectorStore(configBuilder.build(), embeddingModel, weaviateClient);
}

docker コンテナーで Weaviate クラスターを実行する

docker コンテナーで Weaviate を開始します。

docker run -it --rm --name weaviate -e AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED=true -e PERSISTENCE_DATA_PATH=/var/lib/weaviate -e QUERY_DEFAULTS_LIMIT=25 -e DEFAULT_VECTORIZER_MODULE=none -e CLUSTER_HOSTNAME=node1 -p 8080:8080 semitechnologies/weaviate:1.22.4

localhost:8080/v1 で、scheme=http、host=localhost:8080、および apiKey="" を使用して Weaviate クラスターを開始します。その後は使用説明書に従ってください。