跳到主要内容

Oracle 数据库 23ai - AI 向量搜索

DeepSeek V3 中英对照 Oracle Oracle Database 23ai - AI Vector Search

AI 向量搜索 功能是 Oracle Database 23ai(23.4+)的一部分,现已作为 Spring AI 的 VectorStore 提供,以帮助您存储文档嵌入并执行相似性搜索。当然,所有其他功能也同样可用。

提示

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

自动配置

首先,将 Oracle Vector Store 启动器依赖项添加到您的项目中:

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

或者添加到你的 Gradle build.gradle 构建文件中。

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

如果你需要这个向量存储为你初始化模式,那么你需要在适当的构造函数中将 initializeSchema 布尔参数设置为 true,或者在 application.properties 文件中设置 …​initialize-schema=true

备注

这是一个重大变更!在 Spring AI 的早期版本中,默认情况下会进行此模式初始化。

向量存储(Vector Store)还需要一个 EmbeddingModel 实例来计算文档的嵌入。你可以从可用的 EmbeddingModel 实现 中选择一个。

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

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

或者到你的 Gradle build.gradle 构建文件中。

dependencies {
implementation 'org.springframework.ai:spring-ai-openai-spring-boot-starter'
}
groovy

:::提示
请参考 依赖管理 部分,将 Spring AI BOM 添加到您的构建文件中。参考 仓库 部分,将 Maven Central 和/或 Snapshot 仓库添加到您的构建文件中。
:::

要连接并配置 OracleVectorStore,您需要提供数据库的访问详细信息。可以通过 Spring Boot 的 application.yml 提供简单的配置。

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 并使用它:

@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.builder().query("Spring").topK(5).build());
java

配置属性

你可以在 Spring Boot 配置中使用以下属性来自定义 OracleVectorStore

属性描述默认值
spring.ai.vectorstore.oracle.index-type最近邻搜索索引类型。选项为 NONE - 精确最近邻搜索,IVF - 倒排平面文件索引。与 HNSW 相比,它的构建时间更快,使用的内存更少,但查询性能较低(在速度-召回权衡方面)。HNSW - 创建一个多层图。与 IVF 相比,它的构建时间更慢,使用的内存更多,但查询性能更好(在速度-召回权衡方面)。NONE
spring.ai.vectorstore.oracle.distance-type搜索距离类型,选项为 COSINE(默认)、DOTEUCLIDEANEUCLIDEAN_SQUAREDMANHATTAN

注意:如果向量已归一化,可以使用 DOTCOSINE 以获得最佳性能。
COSINE
spring.ai.vectorstore.oracle.forced-normalization允许在插入和相似性搜索之前启用向量归一化(如果为 true)。

警告:将此设置为 true 是允许 搜索请求相似性阈值 的要求。

注意:如果向量已归一化,可以使用 DOTCOSINE 以获得最佳性能。
false
spring.ai.vectorstore.oracle.dimensions嵌入维度。如果未明确指定,OracleVectorStore 将允许最大维度:65535。维度在表创建时设置为嵌入列。如果更改维度,则必须重新创建表。65535
spring.ai.vectorstore.oracle.remove-existing-vector-store-table在启动时删除现有表。false
spring.ai.vectorstore.oracle.initialize-schema是否初始化所需的模式。false
spring.ai.vectorstore.oracle.search-accuracy表示在存在索引时请求的精度目标。默认情况下禁用。您需要提供一个范围在 [1,100] 内的整数来覆盖默认索引精度(95)。使用较低的精度可以提供近似的相似性搜索,以速度换取精度。-1 (DEFAULT_SEARCH_ACCURACY)

元数据过滤

你可以利用通用的、可移植的元数据过滤器OracleVectorStore 一起使用。

例如,你可以使用文本表达式语言:

vectorStore.similaritySearch(
SearchRequest.builder()
.query("The World")
.topK(TOP_K)
.similarityThreshold(SIMILARITY_THRESHOLD)
.filterExpression("author in ['john', 'jill'] && article_type == 'blog'").build());
java

或者以编程方式使用 Filter.Expression DSL:

FilterExpressionBuilder b = new FilterExpressionBuilder();

vectorStore.similaritySearch(SearchRequest.builder()
.query("The World")
.topK(TOP_K)
.similarityThreshold(SIMILARITY_THRESHOLD)
.filterExpression(b.and(
b.in("author","john", "jill"),
b.eq("article_type", "blog")).build()).build());
java
备注

这些过滤表达式会被转换为等价的 OracleVectorStore 过滤器。

手动配置

你可以手动配置 OracleVectorStore,而不是使用 Spring Boot 的自动配置。为此,你需要在项目中添加 Oracle JDBC 驱动和 JdbcTemplate 自动配置依赖项:

<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>
xml
提示

请参考依赖管理部分,将 Spring AI BOM 添加到您的构建文件中。

要在你的应用程序中配置 OracleVectorStore,可以使用以下设置:

@Bean
public VectorStore vectorStore(JdbcTemplate jdbcTemplate, EmbeddingModel embeddingModel) {
return OracleVectorStore.builder(jdbcTemplate, embeddingModel)
.tableName("my_vectors")
.indexType(OracleVectorStoreIndexType.IVF)
.distanceType(OracleVectorStoreDistanceType.COSINE)
.dimensions(1536)
.searchAccuracy(95)
.initializeSchema(true)
.build();
}
java

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

然后你可以使用以下命令连接到数据库:

sql mlops/mlops@localhost/freepdb1

访问 Native Client

Oracle Vector Store 实现通过 getNativeClient() 方法提供了对底层原生 Oracle 客户端(OracleConnection)的访问:

OracleVectorStore vectorStore = context.getBean(OracleVectorStore.class);
Optional<OracleConnection> nativeClient = vectorStore.getNativeClient();

if (nativeClient.isPresent()) {
OracleConnection connection = nativeClient.get();
// Use the native client for Oracle-specific operations
}
java

原生客户端使您能够访问可能未通过 VectorStore 接口公开的 Oracle 特定功能和操作。