為什么說(shuō)“嵌入”是 AI 的靈魂?一文帶你玩轉(zhuǎn) SpringAI 向量模型
最近有小伙伴問(wèn)我,AI 里的“嵌入模型 API”到底是干嘛的?其實(shí),它就像把文字、圖片、數(shù)據(jù)轉(zhuǎn)成“數(shù)字DNA”,方便 AI 理解和處理。在 SpringAI 里,這一套 API 已經(jīng)封裝得很優(yōu)雅,今天小米就帶大家從故事開(kāi)頭一路聊到落地實(shí)現(xiàn),保證看完你能用得飛起。
1.故事開(kāi)場(chǎng):為什么要有嵌入模型?
前段時(shí)間,我的同事阿輝遇到一個(gè)經(jīng)典問(wèn)題:
公司知識(shí)庫(kù)的內(nèi)容太龐大,光靠關(guān)鍵字搜索效率極低,經(jīng)常搜不到真正相關(guān)的答案。于是,老板甩下一句話:
“要讓用戶輸入一句話,系統(tǒng)能立刻找到最相關(guān)的資料!”
阿輝一臉懵逼地跑來(lái)找我。
我說(shuō):“這事啊,用嵌入(Embedding)就能解決?!?/p>
嵌入是什么?簡(jiǎn)單理解:就是把自然語(yǔ)言(文本)轉(zhuǎn)化為一堆高維向量。這樣相似的內(nèi)容就能在“向量空間”里自動(dòng)靠近,檢索、推薦、聚合都不在話下。
SpringAI 里有一套嵌入模型 API,把復(fù)雜的細(xì)節(jié)都封裝好了,我們只需要會(huì)用,就能輕松上手。
2.嵌入模型 API 概述
在 SpringAI 里,嵌入模型 API 的定位很清晰:
- 統(tǒng)一接口:無(wú)論你用的是 OpenAI、Ollama 還是本地模型,調(diào)用方式都一致。
- 標(biāo)準(zhǔn)化輸入輸出:請(qǐng)求就是 EmbeddingRequest,響應(yīng)就是 EmbeddingResponse。
- 結(jié)果可復(fù)用:嵌入的結(jié)果可以直接拿去做向量數(shù)據(jù)庫(kù)檢索(比如 Milvus、Pinecone、Postgres+pgvector),也能做相似度計(jì)算。
這套 API 就像一座“適配橋梁”,把不同廠商、不同實(shí)現(xiàn)的模型統(tǒng)一到一套 Spring 風(fēng)格的接口下。
一句話總結(jié):寫一次代碼,隨便切換模型實(shí)現(xiàn)。
3.核心類:EmbeddingModel
嵌入 API 的核心抽象是 EmbeddingModel。
它是一個(gè)接口,定義了嵌入模型應(yīng)該具備的能力。典型的方法有:
- 調(diào)用嵌入:接收文本或文檔,返回對(duì)應(yīng)的向量表示。
- 返回 EmbeddingResponse:把模型生成的結(jié)果統(tǒng)一打包。
比如你用 OpenAiEmbeddingModel,它就是 EmbeddingModel 的一個(gè)具體實(shí)現(xiàn)。換成 OllamaEmbeddingModel 也沒(méi)問(wèn)題,代碼不用大改。
這就是 SpringAI 的強(qiáng)大之處:通過(guò)抽象接口,把“變化的部分”交給實(shí)現(xiàn),“不變的部分”交給我們開(kāi)發(fā)者。
4.請(qǐng)求參數(shù):EmbeddingRequest
要跟嵌入模型說(shuō)話,我們得先準(zhǔn)備好“輸入材料”。
這時(shí)登場(chǎng)的就是 EmbeddingRequest。
它的作用就像一張訂單單據(jù),把我們要轉(zhuǎn)換的文本交給模型。常見(jiàn)參數(shù)有:
- input:待嵌入的文本,可以是一段話,也可以是多個(gè)文檔。
- options:模型選項(xiàng),比如指定使用哪個(gè) embedding 模型。
舉個(gè)例子,如果你要嵌入一句話:
圖片
是不是很直觀?這就是典型的 Spring 風(fēng)格,寫起來(lái)很順手。
5.響應(yīng)結(jié)果:EmbeddingResponse
模型跑完之后,返回的就是 EmbeddingResponse。
它里面包含了:
- 一個(gè)或多個(gè) Embedding:每一條輸入文本對(duì)應(yīng)一個(gè)向量。
- 使用的模型信息:方便你追蹤是哪個(gè)模型干的活。
- 元信息:比如消耗的 tokens,或者額外的調(diào)試數(shù)據(jù)。
開(kāi)發(fā)者最常用的就是取出 Embedding,拿到向量后再存進(jìn)數(shù)據(jù)庫(kù)或者計(jì)算相似度。
6.向量本體:Embedding
重點(diǎn)來(lái)了!
Embedding 就是嵌入結(jié)果的核心載體,它里面有:
- embedding 向量:一個(gè)高維數(shù)組,比如 [0.021, -0.543, 0.112, ...]。
- 索引:對(duì)應(yīng)輸入的第幾條文本。
想象一下,如果你輸入了三段話,返回結(jié)果里就有三個(gè) Embedding,每個(gè)都對(duì)應(yīng)一段文本的向量化表示。
這個(gè)向量可不是普通數(shù)組,它能支撐起相似度計(jì)算。比如兩段話的余弦相似度越接近 1,就說(shuō)明它們?cè)较嗨啤?/p>
7.可用實(shí)現(xiàn)
SpringAI 已經(jīng)幫我們封裝了多種實(shí)現(xiàn):
- OpenAIEmbeddingModel:調(diào)用 OpenAI 的 text-embedding 系列模型。
- OllamaEmbeddingModel:支持本地部署的模型,比如 llama2 的 embedding 版本。
- VertexAIEmbeddingModel:對(duì)接 Google Vertex AI 的嵌入能力。
- BedrockEmbeddingModel:AWS Bedrock 提供的 embedding 模型。
未來(lái)還會(huì)有更多廠商接入,比如 Anthropic、智譜等。
更酷的是,如果你想接入自研模型,只要實(shí)現(xiàn) EmbeddingModel 接口就行,完全無(wú)縫銜接。
8.場(chǎng)景落地:知識(shí)庫(kù)問(wèn)答
阿輝聽(tīng)完我的解釋后,立刻跑去寫了個(gè)小 demo:
- 用戶輸入問(wèn)題,比如:“如何在 SpringBoot 中使用 Redis 緩存?”
- 系統(tǒng)先把這句話丟給 EmbeddingModel,生成向量。
- 向量拿去查數(shù)據(jù)庫(kù),找最相似的文檔。
- 最后把文檔交給大模型,總結(jié)出自然語(yǔ)言答案。
效果超神!以前搜不到答案的同事,現(xiàn)在一句話就能命中關(guān)鍵文檔。
這就是嵌入的魔力。
9.總結(jié)
今天我們從故事出發(fā),完整走了一遍 SpringAI 的嵌入模型 API:
- 嵌入模型 API 概述:統(tǒng)一調(diào)用,適配多廠商。
- EmbeddingModel:核心接口,定義模型能力。
- EmbeddingRequest:輸入載體。
- EmbeddingResponse:結(jié)果打包。
- Embedding:向量本體。
- 可用實(shí)現(xiàn):OpenAI、Ollama、Vertex、Bedrock 等。
一句話總結(jié):嵌入模型 API 是 SpringAI 的“向量心臟”,讓 AI 能看懂語(yǔ)義,搞定相似度搜索和知識(shí)問(wèn)答。
下次再聊,我會(huì)結(jié)合 pgvector,帶你做一個(gè)完整的“企業(yè)知識(shí)庫(kù)問(wèn)答”小系統(tǒng),把嵌入模型的威力發(fā)揮到極致。


































