嵌入模型 API
嵌入是文字、影像或影片的數值表示,用於捕獲輸入之間的關係。
嵌入透過將文字、影像和影片轉換為浮點數陣列(稱為向量)來工作。這些向量旨在捕獲文字、影像和影片的含義。嵌入陣列的長度稱為向量的維度。
透過計算兩段文字的向量表示之間的數值距離,應用程式可以確定用於生成嵌入向量的物件之間的相似性。
EmbeddingModel 介面旨在與 AI 和機器學習中的嵌入模型進行直接整合。其主要功能是將文字轉換為數值向量,通常稱為嵌入。這些嵌入對於語義分析和文字分類等各種任務至關重要。
EmbeddingModel 介面的設計圍繞兩個主要目標
-
可移植性:此介面確保可以輕鬆適應各種嵌入模型。它允許開發人員在不同的嵌入技術或模型之間切換,只需最少的程式碼更改。此設計與 Spring 的模組化和互換性理念相符。
-
簡單性:EmbeddingModel 簡化了將文字轉換為嵌入的過程。透過提供
embed(String text)和embed(Document document)等直接方法,它消除了處理原始文字資料和嵌入演算法的複雜性。這種設計選擇使開發人員(尤其是 AI 新手)更容易在應用程式中使用嵌入,而無需深入瞭解底層機制。
API 概述
嵌入模型 API 構建在通用的 Spring AI 模型 API 之上,它是 Spring AI 庫的一部分。因此,EmbeddingModel 介面擴充套件了 Model 介面,該介面提供了一組用於與 AI 模型互動的標準方法。EmbeddingRequest 和 EmbeddingResponse 類擴充套件自 ModelRequest 和 ModelResponse,分別用於封裝嵌入模型的輸入和輸出。
嵌入 API 反過來又被更高級別的元件用於實現特定嵌入模型(如 OpenAI、Titan、Azure OpenAI、Ollie 等)的嵌入模型。
下圖說明了嵌入 API 及其與 Spring AI 模型 API 和嵌入模型的關係

EmbeddingModel
本節提供了 EmbeddingModel 介面及相關類的指南。
public interface EmbeddingModel extends Model<EmbeddingRequest, EmbeddingResponse> {
@Override
EmbeddingResponse call(EmbeddingRequest request);
/**
* Embeds the given document's content into a vector.
* @param document the document to embed.
* @return the embedded vector.
*/
float[] embed(Document document);
/**
* Embeds the given text into a vector.
* @param text the text to embed.
* @return the embedded vector.
*/
default float[] embed(String text) {
Assert.notNull(text, "Text must not be null");
return this.embed(List.of(text)).iterator().next();
}
/**
* Embeds a batch of texts into vectors.
* @param texts list of texts to embed.
* @return list of list of embedded vectors.
*/
default List<float[]> embed(List<String> texts) {
Assert.notNull(texts, "Texts must not be null");
return this.call(new EmbeddingRequest(texts, EmbeddingOptions.EMPTY))
.getResults()
.stream()
.map(Embedding::getOutput)
.toList();
}
/**
* Embeds a batch of texts into vectors and returns the {@link EmbeddingResponse}.
* @param texts list of texts to embed.
* @return the embedding response.
*/
default EmbeddingResponse embedForResponse(List<String> texts) {
Assert.notNull(texts, "Texts must not be null");
return this.call(new EmbeddingRequest(texts, EmbeddingOptions.EMPTY));
}
/**
* @return the number of dimensions of the embedded vectors. It is generative
* specific.
*/
default int dimensions() {
return embed("Test String").size();
}
}
嵌入方法提供了將文字轉換為嵌入的各種選項,可容納單個字串、結構化 Document 物件或批次文字。
提供了多種用於嵌入文字的快捷方法,包括 embed(String text) 方法,該方法接受單個字串並返回相應的嵌入向量。所有快捷方法都圍繞 call 方法實現,call 方法是呼叫嵌入模型的主要方法。
通常,嵌入返回一個浮點數列表,以數值向量格式表示嵌入。
embedForResponse 方法提供了更全面的輸出,可能包括有關嵌入的附加資訊。
維度方法是開發人員快速確定嵌入向量大小的便捷工具,這對於理解嵌入空間和後續處理步驟很重要。
EmbeddingRequest
EmbeddingRequest 是一個 ModelRequest,它接受文字物件列表和可選的嵌入請求選項。以下清單顯示了 EmbeddingRequest 類的截斷版本,不包括建構函式和其他實用方法
public class EmbeddingRequest implements ModelRequest<List<String>> {
private final List<String> inputs;
private final EmbeddingOptions options;
// other methods omitted
}
EmbeddingResponse
EmbeddingResponse 類的結構如下
public class EmbeddingResponse implements ModelResponse<Embedding> {
private List<Embedding> embeddings;
private EmbeddingResponseMetadata metadata = new EmbeddingResponseMetadata();
// other methods omitted
}
EmbeddingResponse 類儲存 AI 模型的輸出,每個 Embedding 例項都包含來自單個文字輸入的的結果向量資料。
EmbeddingResponse 類還包含有關 AI 模型響應的 EmbeddingResponseMetadata 元資料。