MariaDB ベクトルストア

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

MariaDB ベクトル (英語) は MariaDB 11.7 の一部であり、機械学習によって生成された埋め込みの保存と検索を可能にします。ベクトルインデックスを使用した効率的なベクトル類似性検索機能を提供し、コサイン類似度とユークリッド距離メトリクスの両方をサポートします。

前提条件

自動構成

Spring AI は、MariaDB ベクトルストアの Spring Boot 自動構成を提供します。これを有効にするには、プロジェクトの Maven pom.xml ファイルに次の依存関係を追加します。

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

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

dependencies {
    implementation 'org.springframework.ai:spring-ai-mariadb-store-spring-boot-starter'
}
Spring AI BOM をビルドファイルに追加するには、"依存関係管理" セクションを参照してください。

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

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

さらに、設定済みの EmbeddingModel Bean が必要です。詳細については、"EmbeddingModel" セクションを参照してください。

例: OpenAI EmbeddingModel を使用するには、次の依存関係を追加します。

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-openai-spring-boot-starter</artifactId>
</dependency>
マイルストーンおよび / またはスナップショットリポジトリをビルドファイルに追加するには、リポジトリセクションを参照してください。

これで、アプリケーションで MariaDBVectorStore をオートワイヤーできるようになりました。

@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 to MariaDB
vectorStore.add(documents);

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

プロパティの構成

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

spring:
  datasource:
    url: jdbc:mariadb://localhost/db
    username: myUser
    password: myPassword
  ai:
    vectorstore:
      mariadb:
        initialize-schema: true
        distance-type: COSINE
        dimensions: 1536
Docker Compose または Testcontainers 経由で MariaDB Vector を Spring Boot 開発サービスとして実行する場合、URL、ユーザー名、パスワードは Spring Boot によって自動的に構成されるため、構成する必要はありません。

spring.ai.vectorstore.mariadb.* で始まるプロパティは、MariaDBVectorStore を構成するために使用されます。

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

spring.ai.vectorstore.mariadb.initialize-schema

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

false

spring.ai.vectorstore.mariadb.distance-type

検索距離型。COSINE (デフォルト) または EUCLIDEAN を使用します。ベクトルが長さ 1 に正規化されている場合は、EUCLIDEAN を使用すると最高のパフォーマンスが得られます。

COSINE

spring.ai.vectorstore.mariadb.dimensions

埋め込み次元。明示的に指定されていない場合は、提供された EmbeddingModel から次元を取得します。

1536

spring.ai.vectorstore.mariadb.remove-existing-vector-store-table

起動時に既存のベクトルストアテーブルを削除します。

false

spring.ai.vectorstore.mariadb.schema-name

ベクトルストアスキーマ名

null

spring.ai.vectorstore.mariadb.table-name

ベクトルストアテーブル名

vector_store

spring.ai.vectorstore.mariadb.schema-validation

スキーマとテーブル名の検証を有効にして、それらが有効で既存のオブジェクトであることを確認します。

false

カスタムスキーマやテーブル名を構成する場合は、spring.ai.vectorstore.mariadb.schema-validation=true を設定してスキーマ検証を有効にすることを検討してください。これにより、名前の正確性が保証され、SQL インジェクション攻撃のリスクが軽減されます。

手動構成

Spring Boot 自動構成を使用する代わりに、MariaDB ベクトルストアを手動で構成できます。そのためには、プロジェクトに次の依存関係を追加する必要があります。

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

<dependency>
    <groupId>org.mariadb.jdbc</groupId>
    <artifactId>mariadb-java-client</artifactId>
    <scope>runtime</scope>
</dependency>

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-mariadb-store</artifactId>
</dependency>
Spring AI BOM をビルドファイルに追加するには、"依存関係管理" セクションを参照してください。

次に、ビルダーパターンを使用して MariaDBVectorStore Bean を作成します。

@Bean
public VectorStore vectorStore(JdbcTemplate jdbcTemplate, EmbeddingModel embeddingModel) {
    return MariaDBVectorStore.builder(jdbcTemplate, embeddingModel)
        .dimensions(1536)                      // Optional: defaults to 1536
        .distanceType(MariaDBDistanceType.COSINE) // Optional: defaults to COSINE
        .schemaName("mydb")                    // Optional: defaults to null
        .vectorTableName("custom_vectors")     // Optional: defaults to "vector_store"
        .contentFieldName("text")             // Optional: defaults to "content"
        .embeddingFieldName("embedding")      // Optional: defaults to "embedding"
        .idFieldName("doc_id")                // Optional: defaults to "id"
        .metadataFieldName("meta")           // Optional: defaults to "metadata"
        .initializeSchema(true)               // Optional: defaults to false
        .schemaValidation(true)              // Optional: defaults to false
        .removeExistingVectorStoreTable(false) // Optional: defaults to false
        .maxDocumentBatchSize(10000)         // Optional: defaults to 10000
        .build();
}

// This can be any EmbeddingModel implementation
@Bean
public EmbeddingModel embeddingModel() {
    return new OpenAiEmbeddingModel(new OpenAiApi(System.getenv("OPENAI_API_KEY")));
}

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

MariaDB Vector ストアでは、汎用的で移植可能なメタデータフィルターを活用できます。

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

vectorStore.similaritySearch(
    SearchRequest.builder()
        .query("The World")
        .topK(TOP_K)
        .similarityThreshold(SIMILARITY_THRESHOLD)
        .filterExpression("author in ['john', 'jill'] && article_type == 'blog'").build());

または、Filter.Expression DSL を使用してプログラム的に次のようにします。

FilterExpressionBuilder b = new FilterExpressionBuilder();

vectorStore.similaritySearch(SearchRequest.builder()
    .query("The World")
    .topK(TOP_K)
    .similarityThreshold(SIMILARITY_THRESHOLD)
    .filterExpression(b.and(
        b.in("author", "john", "jill"),
        b.eq("article_type", "blog")).build()).build());
これらのフィルター式は、同等の MariaDB JSON パス式に自動的に変換されます。