嵌入模型 API

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

嵌入的工作原理是將文字、影像和影片轉換為浮點數陣列,稱為向量。這些向量旨在捕獲文字、影像和影片的含義。嵌入陣列的長度稱為向量的維度。

透過計算兩個文字向量表示之間的數值距離,應用程式可以確定用於生成嵌入向量的物件之間的相似性。

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

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

  • 可移植性:此介面確保了在各種嵌入模型之間的輕鬆適應性。它允許開發人員在不同的嵌入技術或模型之間切換,只需最少的程式碼更改。此設計與 Spring 的模組化和可互換性理念一致。

  • 簡單性:EmbeddingModel 簡化了將文字轉換為嵌入的過程。透過提供如 embed(String text)embed(Document document) 等簡單明瞭的方法,它消除了處理原始文字資料和嵌入演算法的複雜性。這種設計選擇使得開發人員,特別是 AI 新手,更容易在他們的應用程式中使用嵌入,而無需深入瞭解底層機制。

API 概覽

嵌入模型 API 構建在通用的 Spring AI 模型 API 之上,它是 Spring AI 庫的一部分。因此,EmbeddingModel 介面擴充套件了 Model 介面,後者提供了一套標準方法用於與 AI 模型互動。EmbeddingRequestEmbeddingResponse 類擴充套件自 ModelRequestModelResponse,用於分別封裝嵌入模型的輸入和輸出。

嵌入 API 又被更高級別的元件用於為特定的嵌入模型實現嵌入模型,例如 OpenAI、Titan、Azure OpenAI、Ollama 等。

下圖展示了嵌入 API 以及它與 Spring AI 模型 API 和嵌入模型的關係

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 方法提供了將文字轉換為嵌入的各種選項,可處理單個字串、結構化的 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 元資料。

Embedding

Embedding 代表單個嵌入向量。

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