Spring AI 前兩天(4.10 日)更新了 1.0.0-M7 版本后,原來的 SimpleVectorStore 內存級別的向量數據庫就不能用了,Spring AI 將其全部源碼刪除了。
此時我們就需要一種成本更低的解決方案來解決這個問題,如何解決呢?我們一起來看。
解決方案:Redis 向量數據庫
雖然 SimpleVectorStore 不支持了,但 Spring AI 內置了 Redis 或 ES 作為向量數據庫的分布式存儲中間件,我們可以用他們來進行向量的存儲。
而在這兩種方案中,顯然 Redis 使用成本更低,因此,我們來看如何將向量存儲到 Redis 數據庫中。
它的具體實現步驟如下。
安裝Redis-Stack
- 下載 Docker Hub:https://www.docker.com/get-started/
- 安裝 redis-stack-server:使用“docker run -d --name redis-stack-server -p 6379:6379 redis/redis-stack-server”。
添加依賴
我們使用阿里云百煉平臺的嵌入模型 text-embedding-v3 是兼容 OpenAI 的 SDK 的,因此,我們需要添加 OpenAI 和 Redis Vector 依賴:
<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-vector-store-redis</artifactId>
</dependency><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-openai</artifactId>
</dependency>
設置配置信息
配置 Redis 連接信息,以及嵌入模型的配置信息:
spring:data:redis:host: localhostport: 6379ai:vectorstore:redis:initialize-schema: trueindex-name: custom-indexprefix: custom-prefixopenai:api-key: ${ALIYUN-AK}embedding:options:model: text-embedding-v3
阿里云百煉平臺支持的向量模型:
代碼實現
Redis 添加向量數據
@Autowired
private VectorStore vectorStore;// 構建數據
List<Document> documents =
List.of(new Document("I like Spring Boot"),new Document("I love Java"));
// 添加到向量數據庫
vectorStore.add(documents);
當然,向量數據的數據源可以是文件、圖片、音頻等資源,這里為了簡單演示整體執行流程,使用了更簡單直觀的文本作為數據源。
VectorStore 提供的常用方法如下:
- add(List documents) :添加文檔。
- delete(List idList) :按 ID 刪除文檔。
- delete(Filter.Expression filterExpression) :按過濾表達式刪除文檔。
- similaritySearch(String query) 和 similaritySearch(SearchRequest request) :相似性搜索。
執行結果如下:
查詢向量數據
@RestController
@RequestMapping("/vector")
public class VectorController {@Resourceprivate VectorStore vectorStore;@RequestMapping("/find")public List find(@RequestParam String query) {// 構建搜索請求,設置查詢文本和返回的文檔數量SearchRequest request = SearchRequest.builder().query(query).topK(3).build();List<Document> result = vectorStore.similaritySearch(request);System.out.println(result);return result;}
}
執行結果如下:
從上述結果可以看出,和“java”相似度最高的向量為“I love Java”,相似度評分為 0.77,如果我們 SearchRequest 對象中的 topK 設置為 1 的話,只會查詢“I love Java”這條數據,如下圖所示:
本文已收錄到我的技術小站 www.javacn.site,其中包含的內容有:Spring AI、并發編程、MySQL、Redis、Spring、Spring MVC、Spring Boot、Spring Cloud、MyBatis、JVM、設計模式、消息隊列、場景題等模塊。