43_Spring AI 干货笔记之 PostgresML 嵌入模型
本文介绍了在Spring AI框架中集成PostgresML文本嵌入模型的方法。该模型利用数据库内置能力,可直接调用Hugging Face的预训练模型(如DistilBERT)将文本转换为向量,用于语义分析和机器学习。文章详细说明了通过添加starter依赖启用自动配置、使用属性前缀设置模型参数的步骤,并重点阐述了通过PostgresMlEmbeddingOptions在运行时动态选择模型及设备
一、PostgresML 嵌入模型
Spring AI 支持 PostgresML 文本嵌入模型。
嵌入是文本的一种数值表示形式,用于将单词和句子表示为向量(即数字数组)。通过使用距离度量比较数值向量的相似性,嵌入可用于查找相似的文本片段;此外,由于大多数算法无法直接使用文本,嵌入也可用作其他机器学习模型的输入特征。
PostgresML 内部可使用许多预训练的大型语言模型从文本生成嵌入。您可以在 Hugging Face 上浏览所有可用 模型,以找到最适合的解决方案。
二、添加仓库和 BOM
Spring AI 的构件发布在 Maven Central 和 Spring Snapshot 仓库中。请参阅 构件仓库 部分,将这些仓库添加到您的构建系统中。
为便于依赖管理,Spring AI 提供了 BOM(物料清单),以确保在整个项目中使用统一版本的 Spring AI。请参阅 依赖管理 部分,将 Spring AI BOM 添加到您的构建系统中。
三、自动配置
Spring AI 的自动配置和启动器模块的构件名称发生了重大变化。更多信息请参阅升级说明。
Spring AI 为 Azure PostgresML 嵌入模型提供了 Spring Boot 自动配置。要启用它,请在项目的 Maven pom.xml 文件中添加以下依赖:
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-postgresml-embedding</artifactId>
</dependency>
或在您的 Gradle build.gradle 构建文件中添加:
dependencies {
implementation 'org.springframework.ai:spring-ai-starter-model-postgresml-embedding'
}
请参阅 依赖管理 部分,将 Spring AI BOM 添加到您的构建文件中。
使用 spring.ai.postgresml.embedding.options.* 属性来配置您的 PostgresMlEmbeddingModel。
嵌入属性
现在通过前缀为 spring.ai.model.embedding 的顶级属性来配置嵌入自动配置的启用和禁用。
启用:spring.ai.model.embedding=postgresml(默认已启用)
禁用:spring.ai.model.embedding=none(或任何与 postgresml 不匹配的值)
此项更改是为了支持配置多个模型。
前缀 spring.ai.postgresml.embedding 是用于配置 PostgresML 嵌入的 EmbeddingModel 实现的属性前缀。
所有以 spring.ai.postgresml.embedding.options 为前缀的属性,都可以在运行时通过向 EmbeddingRequest 调用添加特定于请求的 运行时选项 来覆盖。
四、运行时选项
使用 PostgresMlEmbeddingOptions.java 来配置 PostgresMlEmbeddingModel 的选项,例如要使用的模型等。
在启动时,您可以将 PostgresMlEmbeddingOptions 传递给 PostgresMlEmbeddingModel 构造函数,以配置用于所有嵌入请求的默认选项。
在运行时,您可以在 EmbeddingRequest 中使用 PostgresMlEmbeddingOptions 来覆盖默认选项。
例如,为特定请求覆盖默认模型名称:
EmbeddingResponse embeddingResponse = embeddingModel.call(
new EmbeddingRequest(List.of("Hello World", "World is big and salvation is near"),
PostgresMlEmbeddingOptions.builder()
.transformer("intfloat/e5-small")
.vectorType(VectorType.PG_ARRAY)
.kwargs(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 实例,并用它来计算两个输入文本的相似度:
var jdbcTemplate = new JdbcTemplate(dataSource); // 您的 postgresml 数据源
PostgresMlEmbeddingModel embeddingModel = new PostgresMlEmbeddingModel(this.jdbcTemplate,
PostgresMlEmbeddingOptions.builder()
.transformer("distilbert-base-uncased") // huggingface 转换器模型名称
.vectorType(VectorType.PG_VECTOR) // PostgreSQL 中的向量类型
.kwargs(Map.of("device", "cpu")) // 可选参数
.metadataMode(MetadataMode.EMBED) // 文档元数据模式
.build());
embeddingModel.afterPropertiesSet(); // 初始化 jdbc 模板和数据库
EmbeddingResponse embeddingResponse = this.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());
}
更多推荐




所有评论(0)