Oracle Database 23ai — AI 向量搜索

Oracle Database 23ai (23.4+) 的 AI 矢量搜索功能以 Spring AI 的形式提供VectorStore帮助您存储文档嵌入并执行相似性搜索。当然,所有其他功能也都可用。spring-doc.cadn.net.cn

在本地运行 Oracle Database 23ai 附录显示了如何使用轻量级 Docker 容器启动数据库。

自动配置

首先,将 Oracle Vector Store 引导启动程序依赖项添加到您的项目中:spring-doc.cadn.net.cn

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

或发送到您的 Gradlebuild.gradlebuild 文件。spring-doc.cadn.net.cn

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

如果需要此 vector store 来初始化架构,则需要为initializeSchemaboolean 参数,或者通过设置…​initialize-schema=trueapplication.properties文件。spring-doc.cadn.net.cn

这是一个突破性的变化!在早期版本的 Spring AI 中,默认情况下会进行此架构初始化。

Vector Store 还需要一个EmbeddingModel实例来计算文档的嵌入。 您可以选择一个可用的 EmbeddingModel Implementationsspring-doc.cadn.net.cn

例如,要使用 OpenAI EmbeddingModel,请将以下依赖项添加到您的项目中:spring-doc.cadn.net.cn

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

或发送到您的 Gradlebuild.gradlebuild 文件。spring-doc.cadn.net.cn

dependencies {
    implementation 'org.springframework.ai:spring-ai-openai-spring-boot-starter'
}
请参阅 Dependency Management 部分,将 Spring AI BOM 添加到您的构建文件中。 请参阅 Repositories 部分,将 Milestone 和/或 Snapshot Repositories 添加到您的构建文件中。

要连接并配置OracleVectorStore,您需要提供数据库的访问详细信息。 可以通过 Spring Boot 的application.ymlspring-doc.cadn.net.cn

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在您的应用程序中并使用它:spring-doc.cadn.net.cn

@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 = this.vectorStore.similaritySearch(SearchRequest.query("Spring").withTopK(5));

配置属性

您可以在 Spring Boot 配置中使用以下属性来自定义OracleVectorStore.spring-doc.cadn.net.cn

财产 描述 默认值

spring.ai.vectorstore.oracle.index-typespring-doc.cadn.net.cn

最近邻搜索索引类型。选项包括NONE- 精确最近邻搜索,IVF- 倒排平面文件索引。与 HNSW 相比,它具有更快的构建时间并使用更少的内存,但查询性能较低(在速度-召回率权衡方面)。HNSW- 创建多层图。与 IVF 相比,它的构建时间较慢,使用的内存更多,但具有更好的查询性能(在速度-召回率权衡方面)。spring-doc.cadn.net.cn

没有spring-doc.cadn.net.cn

spring.ai.vectorstore.oracle.distance-typespring-doc.cadn.net.cn

搜索距离类型COSINE(默认)、DOT,EUCLIDEAN,EUCLIDEAN_SQUAREDMANHATTAN.spring-doc.cadn.net.cn

注意:如果向量已归一化,则可以使用DOTCOSINE以获得最佳性能。spring-doc.cadn.net.cn

余弦spring-doc.cadn.net.cn

spring.ai.vectorstore.oracle.forced-normalizationspring-doc.cadn.net.cn

允许在插入之前启用向量规范化(如果为 true)和进行相似性搜索。spring-doc.cadn.net.cn

注意:将此设置为 true 是允许搜索请求相似度阈值的要求。spring-doc.cadn.net.cn

注意:如果向量已归一化,则可以使用DOTCOSINE以获得最佳性能。spring-doc.cadn.net.cn

spring-doc.cadn.net.cn

spring.ai.vectorstore.oracle.dimensionsspring-doc.cadn.net.cn

嵌入维度。如果未明确指定,则 OracleVectorStore 将允许最大值:65535。维度在创建表时设置为 embedding 列。如果更改维度,则还必须重新创建表。spring-doc.cadn.net.cn

65535spring-doc.cadn.net.cn

spring.ai.vectorstore.oracle.remove-existing-vector-store-tablespring-doc.cadn.net.cn

在启动时删除现有表。spring-doc.cadn.net.cn

spring-doc.cadn.net.cn

spring.ai.vectorstore.oracle.initialize-schemaspring-doc.cadn.net.cn

是否初始化所需的 schema。spring-doc.cadn.net.cn

spring-doc.cadn.net.cn

spring.ai.vectorstore.oracle.search-accuracyspring-doc.cadn.net.cn

在存在 index 的情况下表示请求的准确率目标。默认处于禁用状态。您需要提供 [1,100] 范围内的整数以覆盖默认索引精度 (95)。使用较低的准确率可以在搜索速度与准确率之间进行近似相似性搜索。spring-doc.cadn.net.cn

-1 (DEFAULT_SEARCH_ACCURACY)spring-doc.cadn.net.cn

元数据筛选

您可以将通用的可移植元数据过滤器OracleVectorStore.spring-doc.cadn.net.cn

例如,您可以使用文本表达式语言:spring-doc.cadn.net.cn

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

或者以编程方式使用Filter.ExpressionDSL:spring-doc.cadn.net.cn

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 驱动程序和JdbcTemplateauto-configuration 依赖项添加到项目中:spring-doc.cadn.net.cn

<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>
请参阅 Dependency Management 部分,将 Spring AI BOM 添加到您的构建文件中。

要配置OracleVectorStore在您的应用程序中,您可以使用以下设置:spring-doc.cadn.net.cn

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

在本地运行 Oracle Database 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

然后,您可以使用以下方法连接到数据库:spring-doc.cadn.net.cn

sql mlops/mlops@localhost/freepdb1