SpringAI用嵌入模型操作向量數(shù)據(jù)庫!
嵌入模型(Embedding Model)和向量數(shù)據(jù)庫(Vector Database/Vector Store)是一對(duì)親密無間的合作伙伴,也是 AI 技術(shù)棧中緊密關(guān)聯(lián)的兩大核心組件,兩者的協(xié)同作用構(gòu)成了現(xiàn)代語義搜索、推薦系統(tǒng)和 RAG(Retrieval Augmented Generation,檢索增強(qiáng)生成)等應(yīng)用的技術(shù)基礎(chǔ)。
“PS:準(zhǔn)確來說 Vector Database 和 Vector Store 不完全相同,前者主要用于“向量”數(shù)據(jù)的存儲(chǔ),而 Vector Store 是用于存儲(chǔ)和檢索向量數(shù)據(jù)的組件。
在 Spring AI 中,嵌入模型 API 和 Spring AI Model API 和嵌入模型的關(guān)系如下:
系統(tǒng)整體交互流程如下:
接下來我們使用以下技術(shù):
- Spring AI
- 阿里云文本嵌入模型 text-embedding-v3
- SimpleVectorStore(內(nèi)存級(jí)別存儲(chǔ)和檢索向量數(shù)據(jù)組件)
實(shí)現(xiàn)嵌入模型操作內(nèi)存級(jí)別向量數(shù)據(jù)庫的案例。
1.添加項(xiàng)目依賴
我們使用阿里云百煉平臺(tái)的嵌入模型 text-embedding-v3 是兼容 OpenAI 的 SDK 的,因此,我們只需要添加 OpenAI 依賴即可:
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-openai</artifactId>
</dependency>
2.配置嵌入模型
阿里云百煉平臺(tái)支持的向量模型:
項(xiàng)目配置文件配置向量模型:
spring:
ai:
openai:
api-key: ${aliyun-ak}
embedding:
options:
model: text-embedding-v3
chat:
options:
model: deepseek-r1
3.配置向量模型
將 EmbeddingModel 和 VectorStore 進(jìn)行關(guān)聯(lián),如下代碼所示:
@Bean
public VectorStore vectorStore(EmbeddingModel embeddingModel) {
return SimpleVectorStore.builder(embeddingModel).build();
}
4.向量數(shù)據(jù)庫添加數(shù)據(jù)
VectorStore 提供的常用方法如下:
- add(Listdocuments) :添加文檔。
- delete(ListidList) :按 ID 刪除文檔。
- delete(Filter.Expression filterExpression) :按過濾表達(dá)式刪除文檔。
- similaritySearch(String query) 和 similaritySearch(SearchRequest request) :相似性搜索。
向數(shù)據(jù)庫添加向量數(shù)據(jù)的方法如下:
// 構(gòu)建測(cè)試數(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ù)源可以是文件、圖片、音頻等資源,這里為了簡(jiǎn)單演示整體執(zhí)行流程,使用了更簡(jiǎn)單直觀的文本作為數(shù)據(jù)源。
5.查詢數(shù)據(jù)
@RestController
@RequestMapping("/vector")
publicclass 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ù),如下圖所示:
“想要獲取完整案例的同學(xué)加V:vipStone【備注:向量】
小結(jié)
嵌入模型和向量數(shù)據(jù)庫是實(shí)現(xiàn) RAG(檢索增強(qiáng)生成)的技術(shù)基礎(chǔ),當(dāng)然除了以上案例外,你可以使用 Redis 或 ES 來存儲(chǔ)向量數(shù)據(jù),并嘗試加入 DeepSeek 實(shí)現(xiàn) RAG 功能,這種形式更符合企業(yè)真實(shí)的技術(shù)應(yīng)用。