最新快照版本请使用Spring AI 1.1.0spring-doc.cadn.net.cn

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

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

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

自动配置

春季AI自动配置、起始模块的工件名称发生了重大变化。 更多信息请参阅升级说明spring-doc.cadn.net.cn

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

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

或者去你的Gradlebuild.gradle构建文件。spring-doc.cadn.net.cn

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

如果你需要这个向量存储来初始化模式,那么你需要通过 true来初始化模式在相应构造函数中设置布尔参数,或通过设置…​initialize-schema=trueapplication.properties文件。spring-doc.cadn.net.cn

这是一个颠覆性的变革!在早期版本的 Spring AI 中,这种模式初始化是默认的。

向量存储还需要嵌入模型实例用于计算文档的嵌入。 你可以选择其中一种可用的嵌入模型实现spring-doc.cadn.net.cn

例如,要使用 OpenAI EmbeddingModel,可以在你的项目中添加以下依赖关系:spring-doc.cadn.net.cn

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

或者去你的Gradlebuild.gradle构建文件。spring-doc.cadn.net.cn

dependencies {
    implementation 'org.springframework.ai:spring-ai-starter-model-openai'
}
请参考依赖管理部分,将Spring AI的物料清单添加到你的构建文件中。 请参阅“遗物仓库”部分,将Maven Central和/或快照仓库添加到你的构建文件中。

连接并配置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.builder().query("Spring").topK(5).build());

配置属性

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

属性 描述 默认值

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

最近邻搜索索引类型。选项包括没有- 精确最近邻搜索,试管婴儿- 倒置平面文件索引。它构建时间更快,内存消耗更少,但查询性能较低(在速度和召回权衡方面)。新南威尔士大学- 创建多层图。它构建时间较慢,内存占用比IVF多,但查询性能更好(在速度和回忆权衡方面)。spring-doc.cadn.net.cn

没有spring-doc.cadn.net.cn

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

搜索距离类型余弦(默认),,欧 氏,EUCLIDEAN_SQUARED曼哈顿.spring-doc.cadn.net.cn

注意:如果矢量已归一化,你可以使用余弦为了表现最佳。spring-doc.cadn.net.cn

余弦spring-doc.cadn.net.cn

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

允许在插入前和相似性搜索前启用向量归一化(如果为真)。spring-doc.cadn.net.cn

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

注意:如果矢量已归一化,你可以使用余弦为了表现最佳。spring-doc.cadn.net.cn

falsespring-doc.cadn.net.cn

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

嵌入维度。如果没有明确指定,OracleVectorStore 将允许的最大值为:65535。尺寸在创建表时设置为嵌入列。如果你更改了尺寸,也得重新创建表格。spring-doc.cadn.net.cn

65535spring-doc.cadn.net.cn

spring.ai.vectorstore.oracle.remove-existing-vector-store-table(Springspring-doc.cadn.net.cn

启动时会丢弃现有的表格。spring-doc.cadn.net.cn

falsespring-doc.cadn.net.cn

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

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

falsespring-doc.cadn.net.cn

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

在索引存在时,表示请求的准确目标。默认为禁用。你需要提供一个整数,范围为[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.builder()
    .query("The World")
    .topK(TOP_K)
    .similarityThreshold(SIMILARITY_THRESHOLD)
    .filterExpression("author in ['john', 'jill'] && article_type == 'blog'").build());

或者程序化地使用滤波。表达DSL:spring-doc.cadn.net.cn

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());
这些滤波表达式被转换为等价的OracleVectorStore过滤器。

手动配置

你可以手动配置OracleVectorStore. 为此你需要添加Oracle JDBC驱动,Jdbc模板对你的项目进行自动配置依赖: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>
请参考依赖管理部分,将Spring AI的物料清单添加到你的构建文件中。

要配置OracleVectorStore在你的应用中,你可以采用以下设置:spring-doc.cadn.net.cn

@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();
}

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

访问本地客户端

Oracle 向量存储实现提供了对底层原生 Oracle 客户端的访问(OracleConnection)通过getNativeClient()方法:spring-doc.cadn.net.cn

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
}

原生客户端允许你访问Oracle 专属的功能和作,这些可能不会通过VectorStore接口。spring-doc.cadn.net.cn