Transformers (ONNX) 埋め込み
TransformersEmbeddingModel
は、選択された sentence transformer (英語) を使用して sentence embeddings (英語) をローカルに計算する EmbeddingModel
実装です。
任意の HuggingFace 埋め込みモデル (英語) を使用できます。
オープンニューラルネットワーク交換 (ONNX) (英語) 形式に直列化された、事前トレーニング済み (英語) のトランスフォーマーモデルを使用します。
ディープ Java ライブラリ (英語) と Microsoft ONNX Java ランタイム (英語) ライブラリは、ONNX モデルを実行し、Java で埋め込みを計算するために適用されます。
前提条件
Java で実行するには、Tokenizer と Transformer モデルを ONNX
形式に直列化する必要があります。
optimum-cli で直列化 - これを実現する簡単な方法の 1 つは、optimum-cli (英語) コマンドラインツールを使用することです。次のスニペットは、python 仮想環境を準備し、必要なパッケージをインストールし、optimum-cli
を使用して指定されたモデルを直列化 (エクスポートなど) します。
python3 -m venv venv
source ./venv/bin/activate
(venv) pip install --upgrade pip
(venv) pip install optimum onnx onnxruntime sentence-transformers
(venv) optimum-cli export onnx --model sentence-transformers/all-MiniLM-L6-v2 onnx-output-folder
このスニペットは、sentence-transformers/all-MiniLM-L6-v2 (英語) トランスフォーマーを onnx-output-folder
フォルダーにエクスポートします。後者には、埋め込みモデルで使用される tokenizer.json
ファイルと model.onnx
ファイルが含まれます。
all-MiniLM-L6-v2 の代わりに、任意の huggingface トランス識別子を選択するか、直接ファイルパスを指定できます。
自動構成
Spring AI は、ONNX Transformer Embedding Model 用の Spring Boot 自動構成を提供します。これを有効にするには、プロジェクトの Maven pom.xml
ファイルに次の依存関係を追加します。
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-transformers-spring-boot-starter</artifactId>
</dependency>
または、Gradle build.gradle
ビルドファイルに保存します。
dependencies {
implementation 'org.springframework.ai:spring-ai-transformers-spring-boot-starter'
}
これを構成するには、spring.ai.embedding.transformer.*
プロパティを使用します。
例: これを application.properties ファイルに追加して、intfloat/e5-small-v2 (英語) テキスト埋め込みモデルを使用してクライアントを構成します。
spring.ai.embedding.transformer.onnx.modelUri=https://huggingface.co/intfloat/e5-small-v2/resolve/main/model.onnx spring.ai.embedding.transformer.tokenizer.uri=https://huggingface.co/intfloat/e5-small-v2/raw/main/tokenizer.json
サポートされているプロパティの完全なリストは次のとおりです。
埋め込みプロパティ
プロパティ | 説明 | デフォルト |
---|---|---|
spring.ai.embedding.transformer.enabled | Transformer Embedding モデルを有効にします。 | true |
spring.ai.embedding.transformer.tokenizer.uri | ONNX エンジンによって作成された事前トレーニング済み HuggingFaceTokenizer の URI (例: tokenizer.json)。 | onnx/all-MiniLM-L6-v2/tokenizer.json |
spring.ai.embedding.transformer.tokenizer.options | HuggingFaceTokenizer オプションには、"addSpecialTokens"、"modelMaxLength"、"truncation"、"padding"、"maxLength"、"stride"、"padToMultipleOf" などがあります。デフォルトに戻すには空のままにしておきます。 | 空 |
spring.ai.embedding.transformer.cache.enabled | リモートリソースキャッシュを有効にします。 | true |
spring.ai.embedding.transformer.cache.directory | ONNX モデルなどの リモートリソースをキャッシュするディレクトリパス | ${java.io.tmpdir}/spring-ai-onnx-model |
spring.ai.embedding.transformer.onnx.modelUri | 既存の事前トレーニングされた ONNX モデル。 | onnx/all-MiniLM-L6-v2/model.onnx |
spring.ai.embedding.transformer.onnx.modelOutputName | 埋め込み計算に使用する ONNX モデルの出力ノード名。 | last_hidden_state |
spring.ai.embedding.transformer.onnx.gpuDeviceId | 実行する GPU デバイス ID。>= 0 の場合にのみ適用されます。それ以外の場合は無視されます。(追加の onnxruntime_gpu 依存関係が必要です) | -1 |
spring.ai.embedding.transformer.metadataMode | ドキュメントのコンテンツとメタデータのどの部分を埋め込みの計算に使用するかを指定します。 | NONE |
エラーと特殊なケース
spring.ai.embedding.transformer.tokenizer.options.padding=true |
spring.ai.embedding.transformer.onnx.modelOutputName=token_embeddings |
現在、唯一の回避策は、Boot アプリケーションを実行するフォルダーに大きな |
<dependency> <groupId>com.microsoft.onnxruntime</groupId> <artifactId>onnxruntime_gpu</artifactId> </dependency> CUDA バージョン (ONNX Java ランタイム (英語) ) に基づいて適切な onnxruntime_gpu バージョンを選択してください。 |
手動構成
Spring Boot を使用していない場合は、Onnx Transformers Embedding Model を手動で構成できます。そのためには、プロジェクトの Maven pom.xml
ファイルに spring-ai-transformers
依存関係を追加します。
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-transformers</artifactId>
</dependency>
Spring AI BOM をビルドファイルに追加するには、"依存関係管理" セクションを参照してください。 |
次に、新しい TransformersEmbeddingModel
インスタンスを作成し、setTokenizerResource(tokenizerJsonUri)
および setModelResource(modelOnnxUri)
メソッドを使用して、エクスポートされた tokenizer.json
および model.onnx
ファイルの URI を設定します。(classpath:
、file:
または https:
URI スキーマがサポートされています)。
モデルが明示的に設定されていない場合、TransformersEmbeddingModel
はデフォルトで sentence-transformers/all-MiniLM-L6-v2 (英語) になります。
サイズ | 384 |
平均パフォーマンス | 58.80 |
速度 | 14200 文 / 秒 |
サイズ | 80MB |
次のスニペットは、TransformersEmbeddingModel
を手動で使用する方法を示しています。
TransformersEmbeddingModel embeddingModel = new TransformersEmbeddingModel();
// (optional) defaults to classpath:/onnx/all-MiniLM-L6-v2/tokenizer.json
embeddingModel.setTokenizerResource("classpath:/onnx/all-MiniLM-L6-v2/tokenizer.json");
// (optional) defaults to classpath:/onnx/all-MiniLM-L6-v2/model.onnx
embeddingModel.setModelResource("classpath:/onnx/all-MiniLM-L6-v2/model.onnx");
// (optional) defaults to ${java.io.tmpdir}/spring-ai-onnx-model
// Only the http/https resources are cached by default.
embeddingModel.setResourceCacheDirectory("/tmp/onnx-zoo");
// (optional) Set the tokenizer padding if you see an errors like:
// "ai.onnxruntime.OrtException: Supplied array is ragged, ..."
embeddingModel.setTokenizerOptions(Map.of("padding", "true"));
embeddingModel.afterPropertiesSet();
List<List<Double>> embeddings = embeddingModel.embed(List.of("Hello world", "World is big"));
TransformersEmbeddingModel のインスタンスを手動で作成する場合は、プロパティを設定した後、クライアントを使用する前に afterPropertiesSet() メソッドを呼び出す必要があります。 |
最初の embed()
呼び出しでは、大規模な ONNX モデルをダウンロードし、ローカルファイルシステムにキャッシュします。そのため、最初の呼び出しには通常より時間がかかる場合があります。#setResourceCacheDirectory(<path>)
メソッドを使用して、ONNX モデルが保存されるローカルフォルダーを設定します。デフォルトのキャッシュフォルダーは ${java.io.tmpdir}/spring-ai-onnx-model
です。
TransformersEmbeddingModel を Bean
として作成する方が便利です (そして推奨されます)。そうすれば、afterPropertiesSet()
を手動で呼び出す必要がなくなります。
@Bean
public EmbeddingModel embeddingModel() {
return new TransformersEmbeddingModel();
}