PostgresML 埋め込み

Spring AI は、PostgresML テキスト埋め込みモデルをサポートしています。

埋め込みはテキストの数値表現です。これらは、単語や文章をベクトル、つまり数値の配列として表すために使用されます。エンベディングは、距離測定を使用して数値ベクトルの類似性を比較することで、類似したテキストの部分を見つけるために使用できます。また、ほとんどのアルゴリズムはテキストを直接使用できないため、エンベディングを他の機械学習モデルの入力特徴として使用することもできます。

多くの事前トレーニング済み LLM を使用して、PostgresML 内のテキストから埋め込みを生成できます。利用可能なすべてのモデル (英語) を参照して、Hugging Face で最適なソリューションを見つけることができます。

リポジトリと BOM の追加

Spring AI アーティファクトは、Spring マイルストーンおよびスナップショットリポジトリで公開されます。これらのリポジトリをビルドシステムに追加するには、リポジトリセクションを参照してください。

依存関係の管理を支援するために、Spring AI は BOM (部品表) を提供し、一貫したバージョンの Spring AI がプロジェクト全体で使用されるようにします。Spring AI BOM をビルドシステムに追加するには、"依存関係管理" セクションを参照してください。

自動構成

Spring AI は、Azure PostgresML 埋め込みモデル用の Spring Boot 自動構成を提供します。これを有効にするには、プロジェクトの Maven pom.xml ファイルに次の依存関係を追加します。

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-postgresml-spring-boot-starter</artifactId>
</dependency>

または、Gradle build.gradle ビルドファイルに保存します。

dependencies {
    implementation 'org.springframework.ai:spring-ai-postgresml-spring-boot-starter'
}
Spring AI BOM をビルドファイルに追加するには、"依存関係管理" セクションを参照してください。

spring.ai.postgresml.embedding.options.* プロパティを使用して PostgresMlEmbeddingModel を構成します。リンク

埋め込みプロパティ

接頭辞 spring.ai.postgresml.embedding は、PostgresML 埋め込みの EmbeddingModel 実装を構成するプロパティ接頭辞です。

プロパティ

説明

デフォルト

spring.ai.postgresml.embedding.enabled

PostgresML 埋め込みモデルを有効にします。

true

spring.ai.postgresml.embedding.options.transformer

組み込みに使用する Hugging Face トランスモデル。

distilbert-base-uncased

spring.ai.postgresml.embedding.options.kwargs

追加のトランスフォーマー固有のオプション。

空の地図

spring.ai.postgresml.embedding.options.vectorType

埋め込みに使用する PostgresML ベクトル型。PG_ARRAY と PG_VECTOR の 2 つのオプションがサポートされています。

PG_ARRAY

spring.ai.postgresml.embedding.options.metadataMode

ドキュメントメタデータ集約モード

EMBED

spring.ai.postgresml.embedding.options というプレフィックスが付いたすべてのプロパティは、リクエスト固有のランタイムオプションを EmbeddingRequest 呼び出しに追加することで実行時にオーバーライドできます。

ランタイムオプション

PostgresMlEmbeddingOptions.java [GitHub] (英語) を使用して、使用するモデルなどのオプションを使用して PostgresMlEmbeddingModel を設定します。

開始時に、PostgresMlEmbeddingOptions を PostgresMlEmbeddingModel コンストラクターに渡して、すべての埋め込みリクエストに使用されるデフォルトのオプションを構成できます。

実行時に、EmbeddingRequest の PostgresMlEmbeddingOptions を使用して、デフォルトのオプションをオーバーライドできます。

たとえば、特定のリクエストのデフォルトのモデル名をオーバーライドするには、次のようにします。

EmbeddingResponse embeddingResponse = embeddingModel.call(
    new EmbeddingRequest(List.of("Hello World", "World is big and salvation is near"),
            PostgresMlEmbeddingOptions.builder()
                .withTransformer("intfloat/e5-small")
                .withVectorType(VectorType.PG_ARRAY)
                .withKwargs(Map.of("device", "gpu"))
                .build()));

サンプルコントローラー

これにより、クラスに注入できる EmbeddingModel 実装が作成されます。以下は、EmbeddingModel 実装を使用する単純な @Controller クラスの例です。

spring.ai.postgresml.embedding.options.transformer=distilbert-base-uncased
spring.ai.postgresml.embedding.options.vectorType=PG_ARRAY
spring.ai.postgresml.embedding.options.metadataMode=EMBED
spring.ai.postgresml.embedding.options.kwargs.device=cpu
@RestController
public class EmbeddingController {

    private final EmbeddingModel embeddingModel;

    @Autowired
    public EmbeddingController(EmbeddingModel embeddingModel) {
        this.embeddingModel = embeddingModel;
    }

    @GetMapping("/ai/embedding")
    public Map embed(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {
        EmbeddingResponse embeddingResponse = this.embeddingModel.embedForResponse(List.of(message));
        return Map.of("embedding", embeddingResponse);
    }
}

手動構成

Spring Boot 自動構成を使用する代わりに、PostgresMlEmbeddingModel を手動で作成できます。このために、プロジェクトの Maven pom.xml ファイルに spring-ai-postgresml 依存関係を追加します。

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-postgresml</artifactId>
</dependency>

または、Gradle build.gradle ビルドファイルに保存します。

dependencies {
    implementation 'org.springframework.ai:spring-ai-postgresml'
}
Spring AI BOM をビルドファイルに追加するには、"依存関係管理" セクションを参照してください。

次に、PostgresMlEmbeddingModel インスタンスを作成し、それを使用して 2 つの入力テキスト間の類似性を計算します。

var jdbcTemplate = new JdbcTemplate(dataSource); // your posgresml data source

PostgresMlEmbeddingModel embeddingModel = new PostgresMlEmbeddingModel(this.jdbcTemplate,
        PostgresMlEmbeddingOptions.builder()
            .withTransformer("distilbert-base-uncased") // huggingface transformer model name.
            .withVectorType(VectorType.PG_VECTOR) //vector type in PostgreSQL.
            .withKwargs(Map.of("device", "cpu")) // optional arguments.
            .withMetadataMode(MetadataMode.EMBED) // Document metadata mode.
            .build());

embeddingModel.afterPropertiesSet(); // initialize the jdbc template and database.

EmbeddingResponse embeddingResponse = embeddingModel
	.embedForResponse(List.of("Hello World", "World is big and salvation is near"));
手動で作成した場合は、プロパティを設定した後、クライアントを使用する前に afterPropertiesSet() を呼び出す必要があります。PostgresMlEmbeddingModel を @Bean として作成する方が便利です (そして推奨されます)。そうすれば、afterPropertiesSet() を手動で呼び出す必要がなくなります。
@Bean
public EmbeddingModel embeddingModel(JdbcTemplate jdbcTemplate) {
    return new PostgresMlEmbeddingModel(jdbcTemplate,
        PostgresMlEmbeddingOptions.builder()
             ....
            .build());
}