Neo4j
本节将引导您设置 Neo4jVectorStore
以存储文档嵌入并执行相似性搜索。
Neo4j 是一个开源的 NoSQL 图数据库。它是一个完全事务性的数据库 (ACID),它将数据结构化为由节点组成的图,并通过关系连接。受现实世界结构的启发,它允许对复杂数据进行高性能查询,同时保持对开发人员的直观和简单。
在 Neo4j 的向量搜索 中,用户可以从大型数据集中查询向量嵌入。嵌入是数据对象的数值表示,例如文本、图像、音频或文档。嵌入可以存储在节点属性上,并且可以使用 db.index.vector.queryNodes()
函数进行查询。这些索引由 Lucene 提供支持,使用分层可导航小世界图 (HNSW) 对向量字段执行 k 个近似最近邻 (k-ANN) 查询。
先决条件
-
正在运行的 Neo4j (5.15+) 实例。以下选项可用
-
如果需要,则需要 EmbeddingModel 的 API 密钥以生成
Neo4jVectorStore
存储的嵌入。
依赖项
将 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 文件中。
如果您选择创建 shell 脚本以方便将来使用,请确保在启动应用程序之前通过“source”文件运行它,即 source <your_script_name>.sh 。 |
除了application.properties 和环境变量之外,Spring Boot 还提供了 其他配置选项。 |
Spring Boot 的 Neo4j 驱动程序自动配置功能将创建一个 bean 实例,该实例将由 Neo4jVectorStore
使用。
自动配置
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 的情况下,您仍然可以定义自己的 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 向量存储。
属性 | 默认值 |
---|---|
|
neo4j |
|
false |
|
1536 |
|
cosine |
|
Document |
|
embedding |
|
spring-ai-document-index |