收藏本站,收获最前沿的人工智能与编程资讯!!

Spring AI 使用 Transformers (ONNX) 嵌入向量

技术文档 13℃ 0

TransformersEmbeddingModel 是一种 EmbeddingModel 实现,它可以在本地使用选定的句子转换器模型计算句子嵌入向量。你可以使用任意 HuggingFace 嵌入模型,它采用预训练的 Transformer 模型,并序列化为开放神经网络交换(ONNX)格式。

该实现使用 Deep Java Library 和微软 ONNX Java 运行时库,在 Java 环境中运行 ONNX 模型并计算嵌入向量。

前提条件

要在 Java 中运行,需要将分词器(Tokenizer)和 Transformer 模型序列化为 ONNX 格式。

最快捷的方式是使用 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.jsonmodel.onnx 文件。

你可以替换为任意 HuggingFace 模型标识或本地文件路径。

自动配置

Spring AI 自动配置与启动器模块名称已变更,详情请参考升级说明。

Spring AI 为 ONNX Transformer 嵌入模型提供 Spring Boot 自动配置,在 Maven 中添加依赖:

org.springframework.aispring-ai-starter-model-transformers

Gradle 依赖:

dependencies {
    implementation 'org.springframework.ai:spring-ai-starter-model-transformers'
}

参考依赖管理章节添加 Spring AI BOM,参考构件仓库章节添加仓库源。

使用 spring.ai.embedding.transformer.* 配置属性,示例(使用 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.model.embedding=transformers(默认启用)

  • 禁用:spring.ai.model.embedding=none

配置属性说明默认值
spring.ai.embedding.transformer.enabled(已废弃)启用 Transformer 嵌入模型true
spring.ai.model.embedding启用 Transformer 嵌入模型transformers
spring.ai.embedding.transformer.tokenizer.uri分词器 JSON 文件地址onnx/all-MiniLM-L6-v2/tokenizer.json
spring.ai.embedding.transformer.tokenizer.options分词器参数(padding、truncation 等)
spring.ai.embedding.transformer.cache.enabled启用远程资源缓存true
spring.ai.embedding.transformer.cache.directory缓存目录${java.io.tmpdir}/spring-ai-onnx-model
spring.ai.embedding.transformer.onnx.modelUriONNX 模型地址onnx/all-MiniLM-L6-v2/model.onnx
spring.ai.embedding.transformer.onnx.modelOutputName模型输出节点名称last_hidden_state
spring.ai.embedding.transformer.onnx.gpuDeviceIdGPU 设备 ID(≥0 生效)-1
spring.ai.embedding.transformer.metadataMode文档元数据嵌入模式NONE

常见错误与解决方案

  • 数组不规整错误:Supplied array is ragged

  • spring.ai.embedding.transformer.tokenizer.options.padding=true
  • 输出节点不匹配:don’t contain expected: last_hidden_state

  • spring.ai.embedding.transformer.onnx.modelOutputName=token_embeddings
  • 模型大于 2GB 外部数据错误:将 model.onnx_data 放到应用启动目录,与 model.onnx 同级

  • CUDA 共享提供程序缺失:添加 GPU 依赖

  • com.microsoft.onnxruntimeonnxruntime_gpu

手动配置

不使用 Spring Boot 时,手动添加依赖:

org.springframework.aispring-ai-transformers

手动创建 TransformersEmbeddingModel 示例:

TransformersEmbeddingModel embeddingModel = new TransformersEmbeddingModel();

// 设置分词器
embeddingModel.setTokenizerResource("classpath:/onnx/all-MiniLM-L6-v2/tokenizer.json");

// 设置模型
embeddingModel.setModelResource("classpath:/onnx/all-MiniLM-L6-v2/model.onnx");

// 设置缓存目录
embeddingModel.setResourceCacheDirectory("/tmp/onnx-zoo");

// 启用填充
embeddingModel.setTokenizerOptions(Map.of("padding", "true"));

// 必须调用
embeddingModel.afterPropertiesSet();

// 生成嵌入向量
List> embeddings = embeddingModel.embed(List.of("Hello world", "World is big"));

注意:手动创建必须调用 afterPropertiesSet(),首次调用会下载并缓存模型,耗时较长。

推荐注册为 Bean:

@Bean
public EmbeddingModel embeddingModel() {
   return new TransformersEmbeddingModel();
}

默认模型信息

  • 模型:sentence-transformers/all-MiniLM-L6-v2

  • 向量维度:384

  • 平均性能:58.80

  • 速度:14200 句/秒

  • 大小:80MB

相关推荐