嵌入模型 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、Ollama 等。
下圖展示了嵌入 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();
}
}
embed 方法提供了將文字轉換為嵌入的各種選項,可處理單個字串、結構化的 Document
物件或批次文字。
提供了多個用於嵌入文字的快捷方法,包括 embed(String text)
方法,該方法接收一個字串並返回相應的嵌入向量。所有快捷方法都圍繞 call
方法實現,call
方法是呼叫嵌入模型的主要方法。
通常,嵌入返回一個浮點數列表,表示數值向量格式的嵌入。
embedForResponse
方法提供更全面的輸出,可能包含有關嵌入的附加資訊。
dimensions 方法是一個方便的工具,開發人員可以快速確定嵌入向量的大小,這對於理解嵌入空間和後續處理步驟非常重要。
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
元資料。