PostgresML Embeddings

Spring AI 支持 PostgresML 文本嵌入模型。

嵌入是文本的数字表示。它们用于将单词和句子表示为向量(数字数组)。嵌入可以通过使用距离度量比较数字向量的相似性来查找相似的文本片段,或者它们可以用作其他机器学习模型的输入特征,因为大多数算法不能直接使用文本。

许多预先训练的 LLMs 可用于从 PostgresML 中的文本生成嵌入。您可以通过浏览在 Hugging Face 上的 所有可用模型,找到最佳解决方案。

添加存储库和 BOM

Spring AI 工件发布在 Spring MilestoneSnapshot 存储库中。请参阅存储库部分将这些存储库添加到您的构建系统中。

为了帮助进行依赖管理,Spring AI 提供了 BOM(物料清单),以确保在整个项目中使用一致的 Spring AI 版本。请参阅依赖管理部分将 Spring AI BOM 添加到您的构建系统。

自动配置

Spring AI 为 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.postgresml.embedding.options.* 配置,初始化 PostgresMlEmbeddingClient.

Embedding 属性

spring.ai.postgresml.embedding 前缀的属性,可让您配置 PostgresML 的 EmbeddingClient 嵌入实现。

属性 描述 默认值
spring.ai.postgresml.embedding.enabled 启用 PostgresML 嵌入客户端。 true
spring.ai.postgresml.embedding.options.transformer 用于嵌入的 Huggingface transformer 模型。 distilbert-base-uncased
spring.ai.postgresml.embedding.options.kwargs 其他 transformer 特定选项. empty map
spring.ai.postgresml.embedding.options.vectorType 用于嵌入的 PostgresML 矢量类型。支持两个选项:PG_ARRAY and PG_VECTOR. PG_ARRAY
spring.ai.postgresml.embedding.options.metadataMode 文档元数据聚合模式 EMBED

提示: 通过向 EmbeddingRequest 调用添加请求特定的嵌入选项,可以在运行时覆盖所有 spring.ai.postgresml.embedding.options 前缀的属性。

Embedding 选项

使用 PostgresMlEmbeddingOptions.java 来配置 PostgresMlEmbeddingClient,例如要使用的模型等

在开始时,您可以将传递一个 PostgresMlEmbeddingOptionsPostgresMlEmbeddingClient 的构造函数来配置用于所有嵌入请求的默认选项。

在运行时,您可以在你的 EmbeddingRequest 中使用 PostgresMlEmbeddingOptions 覆盖模型选型.

例如,要覆盖特定请求的默认模型名称:

EmbeddingResponse embeddingResponse = embeddingClient.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()));

Sample Controller (自动配置)

创建一个新的 Spring Boot 项目,并将 spring-ai-vertex-ai-palm2-spring-boot-starter 添加到您的 pom(或 gradle)依赖项中。

src/main/resources 目录下添加一个 application.properties 文件,以启用和配置 VertexAi 聊天客户端:

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

这将创建一个可以注入到您的类中的 PostgresMlEmbeddingClient 实现。下面是一个@Controller使用 EmbeddingClient 的简单示例。

@RestController
public class EmbeddingController {

    private final EmbeddingClient embeddingClient;

    @Autowired
    public EmbeddingController(EmbeddingClient embeddingClient) {
        this.embeddingClient = embeddingClient;
    }

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

手动配置

如果您不使用 Spring Boot,则可以手动配置 PostgresMlEmbeddingClient。为此,请将 spring-ai-postgresml 依赖项添加到项目的 Maven pom.xml文件中:

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

或者,在你的 Gradle 构建文件 build.gradle 中添加:

dependencies {
    implementation 'org.springframework.ai:spring-ai-postgresml'
}

接下来,创建一个 PostgresMlEmbeddingClient实例并使用它来计算两个输入文本之间的相似度:

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

PostgresMlEmbeddingClient embeddingClient = new PostgresMlEmbeddingClient(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());

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

EmbeddingResponse embeddingResponse = embeddingClient
    .embedForResponse(List.of("Hello World", "World is big and salvation is near"));

注意:手动创建时,必须在设置属性之后且在使用客户端之前调用 afterPropertiesSet() 方法。最好是将 PostgresMlEmbeddingClient 创建为@Bean. 这样你就不必手动调用 afterPropertiesSet() 方法了:

@Bean
public EmbeddingClient embeddingClient(JdbcTemplate jdbcTemplate) {
    return new PostgresMlEmbeddingClient(jdbcTemplate,
        PostgresMlEmbeddingOptions.builder()
             ....
            .build());
}
作者:Jeebiz  创建时间:2024-04-05 23:32
最后编辑:Jeebiz  更新时间:2024-07-06 19:00