Oracle Database 23ai — AI 向量搜索

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

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

自动配置

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

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

或您的 Gradle 构建文件。build.gradlespring-doc.cn

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

如果需要此 vector store 为你初始化架构,则需要在相应的构造函数中或通过在文件中的设置为 boolean 参数传递 true。initializeSchema…​initialize-schema=trueapplication.propertiesspring-doc.cn

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

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

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

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

或您的 Gradle 构建文件。build.gradlespring-doc.cn

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

要连接并配置 ,您需要提供数据库的访问详细信息。 可以通过 Spring Boot 的OracleVectorStoreapplication.ymlspring-doc.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
检查配置参数列表以了解默认值和配置选项。

现在,您可以在应用程序中自动连接并使用它:OracleVectorStorespring-doc.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 配置中使用以下属性来自定义 .OracleVectorStorespring-doc.cn

财产 描述 默认值

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

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

没有spring-doc.cn

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

在 (default)、、、 和 之间搜索距离类型。COSINEDOTEUCLIDEANEUCLIDEAN_SQUAREDMANHATTANspring-doc.cn

注意:如果矢量已归一化,则可以使用 or 以获得最佳性能。DOTCOSINEspring-doc.cn

余弦spring-doc.cn

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

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

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

注意:如果矢量已归一化,则可以使用 or 以获得最佳性能。DOTCOSINEspring-doc.cn

spring-doc.cn

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

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

65535spring-doc.cn

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

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

spring-doc.cn

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

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

spring-doc.cn

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

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

-1 (DEFAULT_SEARCH_ACCURACY)spring-doc.cn

元数据筛选

您可以将通用的可移植元数据过滤器与 .OracleVectorStorespring-doc.cn

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

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

或使用 DSL 以编程方式:Filter.Expressionspring-doc.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

手动配置

您可以手动配置 . 为此,您需要将 Oracle JDBC 驱动程序和自动配置依赖项添加到您的项目中:OracleVectorStoreJdbcTemplatespring-doc.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 添加到您的构建文件中。

要在应用程序中配置 ,您可以使用以下设置:OracleVectorStorespring-doc.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.cn

sql mlops/mlops@localhost/freepdb1