Neo4j
本节将指导您设置Neo4jVectorStore
以存储文档嵌入并执行相似性搜索。
Neo4j是一款开源的NoSQL图数据库。它是一个完全事务性的数据库(ACID),将数据结构化为由节点和关系连接的图形。受到现实世界结构的启发,它允许在复杂数据上高效查询,同时对开发人员来说简单易懂。
Neo4j的向量搜索允许用户查询大型数据集中的向量嵌入。嵌入是数据对象(如文本、图像、音频或文档)的数值表示。嵌入可以存储在节点属性上,并可以使用db.index.vector.queryNodes()
函数进行查询。这些索引由Lucene驱动,使用Hierarchical Navigable Small World Graph (HNSW)来执行k近似最近邻(k-ANN)查询以查找向量字段。
先决条件
-
运行中的Neo4j(5.15+)实例。以下选项可用:
-
如果需要,为
Neo4jVectorStore
存储的嵌入生成嵌入时,需要EmbeddingClient的API密钥。
依赖项
将Neo4j Vector Store依赖项添加到您的项目中:
<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添加到您的构建文件中。 |
配置
要连接到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密钥,例如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密钥,例如OpenAI
export SPRING_AI_OPENAI_API_KEY=<api-key>
或者两者混合使用。例如,如果您想将API密钥存储为环境变量,但将其余部分保留在普通的application.properties文件中。
如果您选择创建一个shell脚本以便未来更容易工作,请确保在启动应用程序之前运行它,即通过“sourcing”文件,即source <your_script_name>.sh 。 |
除了application.properties和环境变量之外,Spring Boot还提供了其他配置选项。 |
Spring Boot的Neo4j Driver自动配置功能将创建一个bean实例,该实例将由Neo4jVectorStore
使用。
自动配置
Spring AI 为 Neo4j Vector 存储提供了 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 添加到您的构建文件中。 |
请查看向量存储的配置参数列表,了解默认值和配置选项。
请参阅仓库部分,将里程碑和/或快照仓库添加到您的构建文件中。 |
此外,您需要配置一个 EmbeddingClient
bean。有关更多信息,请参阅EmbeddingClient部分。
这是所需 bean 的示例:
@Bean
public EmbeddingClient embeddingClient() {
// 可以是任何其他 EmbeddingClient 实现。
return new OpenAiEmbeddingClient(new OpenAiApi(System.getenv("SPRING_AI_OPENAI_API_KEY")));
}
在 Spring Boot 自动配置的 Neo4j Driver
bean 不符合您的要求或需求的情况下,您仍然可以定义自己的 bean。请阅读Neo4j Java Driver 参考文档,以获取有关自定义驱动程序配置的更深入信息。
@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("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 |
|
1536 |
|
cosine |
|
Document |
|
embedding |
|
spring-ai-document-index |