Neo4j

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

Neo4j (英語) は、オープンソースの NoSQL グラフデータベースです。これは、関連によって接続されたノードで構成されるグラフとして構造化されたデータを保存する、完全なトランザクションデータベース (ACID) です。現実世界の構造からインスピレーションを得たこのツールは、開発者にとって直感的でシンプルなままでありながら、複雑なデータに対する高いクエリパフォーマンスを可能にします。

Neo4j のベクトル検索 (英語) を使用すると、ユーザーは大規模なデータセットからベクトル埋め込みをクエリできます。埋め込みとは、テキスト、イメージ、音声、ドキュメントなどのデータオブジェクトの数値表現です。埋め込みはノードプロパティに保存でき、db.index.vector.queryNodes() 関数でクエリできます。これらのインデックスは、階層型ナビゲート可能なスモールワールドグラフ (HNSW) を使用して Lucene によって強化され、ベクトルフィールドに対して k 近似最近傍 (k-ANN) クエリを実行します。

前提条件

依存関係

Neo4j ベクトルストアの依存関係をプロジェクトに追加します。

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

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

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

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

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

構成

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

spring.neo4j.uri=<uri_for_your_neo4j_instance>
spring.neo4j.authentication.username=<your_username>
spring.neo4j.authentication.password=<your_password>
# API key if needed, e.g. OpenAI
spring.ai.openai.api.key=<api-key>

環境変数

export SPRING_NEO4J_URI=<uri_for_your_neo4j_instance>
export SPRING_NEO4J_AUTHENTICATION_USERNAME=<your_username>
export SPRING_NEO4J_AUTHENTICATION_PASSWORD=<your_password>
# API key if needed, e.g. OpenAI
export SPRING_AI_OPENAI_API_KEY=<api-key>

またはそれらの組み合わせでも構いません。例: API キーを環境変数として保存し、残りをプレーンな application.properties ファイルに保存したい場合。

将来の作業を容易にするためにシェルスクリプトを作成することを選択した場合は、ファイル (つまり source <your_script_name>.sh) を「ソース」してアプリケーションを開始する前に必ずシェルスクリプトを実行してください。
application.properties と環境変数に加えて、Spring Boot は追加の構成オプションを提供します。

Spring Boot の Neo4j ドライバーの自動構成機能は、Neo4jVectorStore によって使用される Bean インスタンスを作成します。

自動構成

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

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

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

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

デフォルト値と構成オプションについては、ベクトルストアの構成パラメーターのリストを参照してください。

マイルストーンおよび / またはスナップショットリポジトリをビルドファイルに追加するには、リポジトリセクションを参照してください。

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

必要な Bean の例を次に示します。

@Bean
public EmbeddingModel embeddingModel() {
    // Can be any other Embeddingmodel implementation.
    return new OpenAiEmbeddingModel(new OpenAiApi(System.getenv("SPRING_AI_OPENAI_API_KEY")));
}

自動構成された Spring Boot Neo4j Driver Bean が必要なものではない場合でも、独自の Bean を定義できます。カスタムドライバーの構成の詳細については、Neo4j Java ドライバーリファレンス (英語) を参照してください。

@Bean
public Driver driver() {
    return GraphDatabase.driver("neo4j://<host>:<bolt-port>",
            AuthTokens.basic("<username>", "<password>"));
}

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

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

Neo4j ストアでは、汎用のポータブルなメタデータフィルターを利用することもできます。

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

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()));
これらの (ポータブル) フィルター式は、独自の Neo4j WHERE  フィルター式 (英語) に自動的に変換されます。

例: この移植可能なフィルター式:

author in ['john', 'jill'] && 'article_type' == 'blog'

独自の Neo4j フィルター形式に変換されます。

node.`metadata.author` IN ["john","jill"] AND node.`metadata.'article_type'` = "blog"

Neo4jVectorStore プロパティ

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

プロパティ デフォルト値

spring.ai.vectorstore.neo4j.database-name

neo4j

spring.ai.vectorstore.neo4j.initialize-schema

false

spring.ai.vectorstore.neo4j.embedding-dimension

1536

spring.ai.vectorstore.neo4j.distance-type

余弦

spring.ai.vectorstore.neo4j.label

文書

spring.ai.vectorstore.neo4j.embedding-property

埋め込み

spring.ai.vectorstore.neo4j.index-name

spring-ai-document-index