Embeddings 模型 API

Embeddings 是文字、圖像或影片的數值表示,用於捕捉輸入之間的關係。

Embeddings 的運作方式是將文字、圖像和影片轉換為浮點數陣列,稱為向量。這些向量旨在捕捉文字、圖像和影片的含義。Embedding 陣列的長度稱為向量的維度。

透過計算兩個文字片段的向量表示之間的數值距離,應用程式可以判斷用於產生 Embedding 向量的物件之間的相似性。

EmbeddingModel 介面旨在與 AI 和機器學習中的 Embedding 模型進行直接整合。其主要功能是將文字轉換為數值向量,通常稱為 embeddings。這些 embeddings 對於各種任務至關重要,例如語義分析和文字分類。

EmbeddingModel 介面的設計圍繞著兩個主要目標

  • 可攜性:此介面確保在各種 Embedding 模型之間輕鬆適應。它允許開發人員在不同的 Embedding 技術或模型之間切換,而只需最少的程式碼變更。此設計符合 Spring 的模組化和可互換性理念。

  • 簡潔性:EmbeddingModel 簡化了將文字轉換為 embeddings 的過程。透過提供直接的方法,例如 embed(String text)embed(Document document),它消除了處理原始文字資料和 Embedding 演算法的複雜性。此設計選擇使開發人員,尤其是 AI 新手,更容易在其應用程式中使用 embeddings,而無需深入研究底層機制。

API 總覽

Embedding 模型 API 建構於通用的 Spring AI 模型 API 之上,這是 Spring AI 程式庫的一部分。因此,EmbeddingModel 介面擴展了 Model 介面,該介面為與 AI 模型互動提供了一組標準方法。EmbeddingRequestEmbeddingResponse 類別從 ModelRequestModelResponse 擴展而來,分別用於封裝 Embedding 模型的輸入和輸出。

Embedding API 接著被更高等級的元件用於為特定的 Embedding 模型實作 Embedding 模型,例如 OpenAI、Titan、Azure OpenAI、Ollie 等。

以下圖表說明了 Embedding API 及其與 Spring AI 模型 API 和 Embedding 模型的關係

embeddings 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 方法提供了多種選項,用於將文字轉換為 embeddings,可容納單個字串、結構化的 Document 物件或批次文字。

提供了多個用於嵌入文字的快捷方法,包括 embed(String text) 方法,該方法接受單個字串並傳回對應的 Embedding 向量。所有快捷方式都是圍繞 call 方法實作的,call 方法是調用 Embedding 模型的主要方法。

通常,embedding 會傳回浮點數列表,以數值向量格式表示 embeddings。

embedForResponse 方法提供更全面的輸出,可能包括有關 embeddings 的其他資訊。

dimensions 方法是開發人員快速確定 Embedding 向量大小的便捷工具,這對於理解 Embedding 空間以及後續處理步驟非常重要。

EmbeddingRequest

EmbeddingRequest 是一個 ModelRequest,它接受文字物件列表和可選的 Embedding 請求選項。以下列表顯示了 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 中繼資料。

Embedding

Embedding 代表單個 Embedding 向量。

public class Embedding implements ModelResult<float[]> {
	private float[] embedding;
	private Integer index;
	private EmbeddingResultMetadata metadata;
	// other methods omitted
}