Oracle データベース 23ai - AI ベクトル検索

Oracle データベース 23ai (23.4+) の AI ベクトル検索 [Oracle] (英語) 機能は、Spring AI VectorStore として利用でき、ドキュメントの埋め込みを保存し、類似性検索を実行できます。もちろん、他のすべての機能も利用できます。

Oracle データベース 23ai をローカルで実行する付録では、軽量の Docker コンテナーを使用してデータベースを起動する方法を示します。

自動構成

まず、Oracle ベクトルストア Boot スターター依存関係をプロジェクトに追加します。

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

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

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

このベクトルストアを使用してスキーマを初期化する必要がある場合は、適切なコンストラクターで initializeSchema ブールパラメーターに true を渡すか、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 をビルドファイルに追加するには、"依存関係管理" セクションを参照してください。マイルストーンやスナップショットリポジトリをビルドファイルに追加するには、リポジトリセクションを参照してください。

OracleVectorStore に接続して設定するには、データベースのアクセス詳細を提供する必要があります。簡単な設定は、Spring Boot の application.yml を介して提供できます。

spring:
  datasource:
    url: jdbc:oracle:thin:@//localhost:1521/freepdb1
    username: mlops
    password: mlops
  ai:
	vectorstore:
	  oracle:
		index-type: IVF
		distance-type: COSINE
		dimensions: 1536
デフォルト値と構成オプションについては、構成パラメーターのリストを確認してください。

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

@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 Oracle Vector Store
vectorStore.add(documents);

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

構成プロパティ

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

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

spring.ai.vectorstore.oracle.index-type

最近傍検索インデックス型。オプションは、NONE (正確な最近傍検索)、IVF (反転フラットファイルインデックス) です。HNSW よりもビルド時間が短く、メモリ使用量も少なくなりますが、クエリパフォーマンスは低くなります (速度とリコールのトレードオフの観点から)。HNSW - マルチレイヤーグラフを作成します。IVF よりもビルド時間が遅く、メモリ使用量も多くなりますが、クエリパフォーマンスは向上します (速度とリコールのトレードオフの観点から)。

NONE

spring.ai.vectorstore.oracle.distance-type

検索距離型は COSINE (デフォルト)、DOTEUCLIDEANEUCLIDEAN_SQUAREDMANHATTAN です。

NOTE: ベクトルが正規化されている場合は、最高のパフォーマンスを得るために DOT または COSINE を使用できます。

COSINE

spring.ai.vectorstore.oracle.forced-normalization

挿入前および類似性検索のために、ベクトル正規化 (true の場合) を有効にできます。

CAUTION: これを true に設定することは、検索リクエストの類似性しきい値を許可する要件です。

NOTE: ベクトルが正規化されている場合は、最高のパフォーマンスを得るために DOT または COSINE を使用できます。

false

spring.ai.vectorstore.oracle.dimensions

埋め込みディメンション。明示的に指定されていない場合、OracleVectorStore は最大値 65535 を許可します。ディメンションは、テーブルの作成時に埋め込み列に設定されます。ディメンションを変更する場合は、テーブルを再作成する必要があります。

65535

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

起動時に既存のテーブルを削除します。

false

spring.ai.vectorstore.oracle.initialize-schema

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

false

spring.ai.vectorstore.oracle.search-accuracy

インデックスが存在する場合にリクエストされる精度ターゲットを示します。デフォルトでは無効になっています。デフォルトのインデックス精度 (95) を上書きするには、[1,100] の範囲の整数を指定する必要があります。精度を低くすると、速度と精度のバランスが取れた近似類似検索が実現します。

-1 (DEFAULT_SEARCH_ACCURACY)

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

OracleVectorStore を使用すると、汎用的でポータブルなメタデータフィルターを活用できます。

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

vectorStore.similaritySearch(
    SearchRequest.defaults()
    .withQuery("The World")
    .withTopK(TOP_K)
    .withSimilarityThreshold(SIMILARITY_THRESHOLD)
    .withFilterExpression("author in ['john', 'jill'] && article_type == 'blog'"));

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

FilterExpressionBuilder b = new FilterExpressionBuilder();

vectorStore.similaritySearch(SearchRequest.defaults()
    .withQuery("The World")
    .withTopK(TOP_K)
    .withSimilarityThreshold(SIMILARITY_THRESHOLD)
    .withFilterExpression(b.and(
        b.in("author","john", "jill"),
        b.eq("article_type", "blog")).build()));
これらのフィルター式は、同等の OracleVectorStore フィルターに変換されます。

手動構成

Spring Boot 自動構成を使用する代わりに、OracleVectorStore を手動で構成できます。そのためには、プロジェクトに Oracle JDBC ドライバーと JdbcTemplate 自動構成の依存関係を追加する必要があります。

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

<dependency>
	<groupId>com.oracle.database.jdbc</groupId>
	<artifactId>ojdbc11</artifactId>
	<scope>runtime</scope>
</dependency>

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

アプリケーションで OracleVectorStore を構成するには、次の設定を使用できます。

@Bean
public VectorStore vectorStore(JdbcTemplate jdbcTemplate, EmbeddingModel embeddingModel) {
	return new OracleVectorStore(jdbcTemplate, embeddingModel, true);
}

Oracle データベース 23ai をローカルで実行する

docker run --rm --name oracle23ai -p 1521:1521 -e APP_USER=mlops -e APP_USER_PASSWORD=mlops -e ORACLE_PASSWORD=mlops gvenzl/oracle-free:23-slim

次に、次の方法でデータベースに接続できます。

sql mlops/mlops@localhost/freepdb1