SpringAI更新:向量數(shù)據(jù)庫不可用的解決方案!
Spring AI 前兩天(4.10 日)更新了 1.0.0-M7 版本后,原來的 SimpleVectorStore 內(nèi)存級(jí)別的向量數(shù)據(jù)庫就不能用了,Spring AI 將其全部源碼刪除了。
此時(shí)我們就需要一種成本更低的解決方案來解決這個(gè)問題,如何解決呢?我們一起來看。
解決方案:Redis 向量數(shù)據(jù)庫
雖然 SimpleVectorStore 不支持了,但 Spring AI 內(nèi)置了 Redis 或 ES 作為向量數(shù)據(jù)庫的分布式存儲(chǔ)中間件,我們可以用他們來進(jìn)行向量的存儲(chǔ)。
而在這兩種方案中,顯然 Redis 使用成本更低,因此,我們來看如何將向量存儲(chǔ)到 Redis 數(shù)據(jù)庫中。
它的具體實(shí)現(xiàn)步驟如下。
安裝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”。
添加依賴
我們使用阿里云百煉平臺(tái)的嵌入模型 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>
設(shè)置配置信息
配置 Redis 連接信息,以及嵌入模型的配置信息:
spring:
data:
redis:
host: localhost
port: 6379
ai:
vectorstore:
redis:
initialize-schema: true
index-name: custom-index
prefix: custom-prefix
openai:
api-key: ${ALIYUN-AK}
embedding:
options:
model: text-embedding-v3
阿里云百煉平臺(tái)支持的向量模型:
圖片
代碼實(shí)現(xiàn)
Redis 添加向量數(shù)據(jù)
@Autowired
private VectorStore vectorStore;
// 構(gòu)建數(shù)據(jù)
List<Document> documents =
List.of(new Document("I like Spring Boot"),
new Document("I love Java"));
// 添加到向量數(shù)據(jù)庫
vectorStore.add(documents);
當(dāng)然,向量數(shù)據(jù)的數(shù)據(jù)源可以是文件、圖片、音頻等資源,這里為了簡單演示整體執(zhí)行流程,使用了更簡單直觀的文本作為數(shù)據(jù)源。
VectorStore 提供的常用方法如下:
- add(Listdocuments):添加文檔。
- delete(ListidList):按 ID 刪除文檔。
- delete(Filter.Expression filterExpression):按過濾表達(dá)式刪除文檔。
- similaritySearch(String query) 和 similaritySearch(SearchRequest request):相似性搜索。
執(zhí)行結(jié)果如下:
圖片
查詢向量數(shù)據(jù)
@RestController
@RequestMapping("/vector")
public class VectorController {
@Resource
private VectorStore vectorStore;
@RequestMapping("/find")
public List find(@RequestParam String query) {
// 構(gòu)建搜索請(qǐng)求,設(shè)置查詢文本和返回的文檔數(shù)量
SearchRequest request = SearchRequest.builder()
.query(query)
.topK(3)
.build();
List<Document> result = vectorStore.similaritySearch(request);
System.out.println(result);
return result;
}
}
執(zhí)行結(jié)果如下:
圖片
從上述結(jié)果可以看出,和“java”相似度最高的向量為“I love Java”,相似度評(píng)分為 0.77,如果我們 SearchRequest 對(duì)象中的 topK 設(shè)置為 1 的話,只會(huì)查詢“I love Java”這條數(shù)據(jù),如下圖所示:
圖片