埋め込みモデル API

EmbeddingModel インターフェースは、AI および機械学習の埋め込みモデルと簡単に統合できるように設計されています。その主な機能は、テキストを一般に埋め込みと呼ばれる数値ベクトルに変換することです。これらの埋め込みは、意味分析やテキスト分類などのさまざまなタスクにとって重要です。

EmbeddingModel インターフェースの設計は、次の 2 つの主なゴールを中心にしています。

  • ポータビリティ : このインターフェースにより、さまざまな埋め込みモデルに簡単に適応できます。これにより、開発者は最小限のコード変更で、さまざまな埋め込み手法やモデルを切り替えることができます。この設計は、Spring のモジュール性と互換性の哲学に沿っています。

  • シンプルさ: EmbeddingModel は、テキストを埋め込みに変換するプロセスを簡素化します。embed(String text) や embed(Document document) のような簡単なメソッドを提供することで、生のテキストデータや埋め込みアルゴリズムの処理の複雑さが軽減されます。この設計の選択により、開発者、特に AI を初めて使用する開発者は、基礎となる仕組みを深く掘り下げることなく、アプリケーションで埋め込みを利用することが容易になります。

API の概要

埋め込みモデル API は、Spring AI ライブラリの一部である汎用 Spring AI モデル API [GitHub] (英語) 上に構築されています。そのため、EmbeddingModel インターフェースは、AI モデルと対話するための標準的なメソッドセットを提供する Model インターフェースを継承します。EmbeddingRequest クラスと EmbeddingResponse クラスは、それぞれ ModelRequest と ModelResponse から拡張され、埋め込みモデルの入力と出力をカプセル化するために使用されます。

Embedding API は、OpenAI、Titan、Azure、OpenAI、Ollie などの特定の埋め込みモデルの埋め込みモデルを実装するために、上位レベルのコンポーネントによって使用されます。

次の図は、Embedding 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.
	 */
	List<Double> embed(Document document);

	/**
	 * Embeds the given text into a vector.
	 * @param text the text to embed.
	 * @return the embedded vector.
	 */
	default List<Double> 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<List<Double>> 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 メソッドを中心に実装されます。

通常、埋め込みは数値ベクトル形式で埋め込みを表す double のリストを返します。

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 メタデータも保持します。

埋め込み

Embedding は単一の埋め込みベクトルを表します。

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

利用可能な実装

内部的には、さまざまな EmbeddingModel 実装がさまざまな低レベルライブラリと API を使用して埋め込みタスクを実行します。以下は、EmbeddingModel 実装の利用可能な実装の一部です。