Spring AI 支持 PostgresML 文本嵌入模型。
嵌入是文本的数值表示形式,用于将单词和句子表示为向量(数值数组)。嵌入可通过距离度量算法对比数值向量的相似度来查找相似文本片段,也可作为其他机器学习模型的输入特征(因为大多数算法无法直接处理文本)。
在 PostgresML 中,你可以使用多种预训练大语言模型从文本生成嵌入向量。你可以在 Hugging Face 上浏览所有可用模型,找到最优解决方案。
添加仓库和物料清单(BOM)
Spring AI 构件发布在 Maven 中央仓库和 Spring 快照仓库中。参考构件仓库章节,将这些仓库添加到你的构建系统中。
为了简化依赖管理,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.enabled (已移除,不再生效) | 启用 PostgresML 嵌入模型 | true |
| spring.ai.model.embedding | 启用 PostgresML 嵌入模型 | postgresml |
| spring.ai.postgresml.embedding.create-extension | 执行 SQL 语句 'CREATE EXTENSION IF NOT EXISTS pgml' 启用扩展 | false |
| spring.ai.postgresml.embedding.options.transformer | 用于生成嵌入的 Hugging Face Transformer 模型 | distilbert-base-uncased |
| spring.ai.postgresml.embedding.options.kwargs | Transformer 模型专属的附加参数 | 空集合 |
| spring.ai.postgresml.embedding.options.vectorType | 嵌入使用的 PostgresML 向量类型,支持两种选项:PG_ARRAY 和 PG_VECTOR | PG_ARRAY |
| spring.ai.postgresml.embedding.options.metadataMode | 文档元数据聚合模式 | EMBED |
所有以 spring.ai.postgresml.embedding.options 为前缀的属性,都可以在运行时通过向 EmbeddingRequest 请求添加特定的运行时选项进行覆盖。
运行时选项
使用 PostgresMlEmbeddingOptions.java 为 PostgresMlEmbeddingModel 配置参数,例如使用的模型等。
启动时,你可以向 PostgresMlEmbeddingModel 构造方法传入 PostgresMlEmbeddingOptions 对象,配置所有嵌入请求的默认选项。
运行时,你可以在 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") // Hugging Face Transformer 模型名称
.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());
}