news 2026/4/13 1:31:33

40_Spring AI 干货笔记之 Transformers (ONNX) 嵌入

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
40_Spring AI 干货笔记之 Transformers (ONNX) 嵌入

一、Transformers (ONNX) 嵌入

TransformersEmbeddingModel 是一个 EmbeddingModel 实现,它使用选定的 句子转换器 在本地计算 句子嵌入。

您可以使用任何 HuggingFace 嵌入模型。

它使用 预训练 的 Transformer 模型,这些模型已序列化为 开放神经网络交换(ONNX) 格式。

应用 Deep Java Library 和 Microsoft ONNX Java 运行时库来运行 ONNX 模型并在 Java 中计算嵌入。

二、先决条件

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

使用 optimum-cli 序列化 - 一种快速实现此目的的方法是使用 optimum-cli 命令行工具。以下代码片段准备了一个 Python 虚拟环境,安装所需的包,并使用 optimum-cli 序列化(例如导出)指定的模型:

python3 -m venv venvsource./venv/bin/activate(venv)pipinstall--upgrade pip(venv)pipinstalloptimum onnx onnxruntime sentence-transformers(venv)optimum-cliexportonnx --model sentence-transformers/all-MiniLM-L6-v2 onnx-output-folder

该代码片段将 sentence-transformers/all-MiniLM-L6-v2 转换器导出到 onnx-output-folder 文件夹中。后者包含嵌入模型使用的 tokenizer.json 和 model.onnx 文件。

您可以选择任何 HuggingFace 转换器标识符或直接提供文件路径来替代 all-MiniLM-L6-v2。

三、自动配置

Spring AI 的自动配置和 starter 模块的工件名称发生了重大变化。更多信息请参阅 升级说明。

Spring AI 为 ONNX Transformer 嵌入模型提供了 Spring Boot 自动配置。要启用它,请将以下依赖项添加到项目的 Maven pom.xml 文件中:

<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-transformers</artifactId></dependency>

或添加到您的 Gradle build.gradle 构建文件中:

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

请参阅 依赖管理 部分,将 Spring AI BOM 添加到您的构建文件中。请参阅 工件仓库 部分,将这些仓库添加到您的构建系统中。

要配置它,请使用 spring.ai.embedding.transformer.* 属性。

例如,将此添加到您的 application.properties 文件中,以使用 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

支持的完整属性列表如下:

3.1 嵌入属性

嵌入自动配置的启用和禁用现在通过顶级属性 spring.ai.model.embedding 前缀进行配置。

  • 要启用:spring.ai.model.embedding=transformers(默认启用)

  • 要禁用:spring.ai.model.embedding=none(或任何与 transformers 不匹配的值)

进行此更改是为了允许配置多个模型。

3.2 错误和特殊情况

如果看到类似 Caused by: ai.onnxruntime.OrtException: Supplied array is ragged,… 的错误,您还需要在 application.properties 中启用分词器填充,如下所示:

spring.ai.embedding.transformer.tokenizer.options.padding=true

如果出现类似 The generative output names don’t contain expected: last_hidden_state. Consider one of the available model outputs: token_embeddings, …​. 的错误,您需要根据您的模型将模型输出名称设置为正确的值。请考虑错误消息中列出的名称。例如:

spring.ai.embedding.transformer.onnx.modelOutputName=token_embeddings

如果出现类似 ai.onnxruntime.OrtException: Error code - ORT_FAIL - message: Deserialize tensor onnx::MatMul_10319 failed.GetFileLength for ./model.onnx_data failed:Invalid fd was supplied: -1 的错误,这意味着您的模型大于 2GB,并被序列化为两个文件:model.onnx 和 model.onnx_data。

model.onnx_data 称为外部数据,应位于与 model.onnx 相同的目录下。

目前唯一的解决方法是将大型的 model.onnx_data 复制到运行 Boot 应用程序的文件夹中。

如果出现类似 ai.onnxruntime.OrtException: Error code - ORT_EP_FAIL - message: Failed to find CUDA shared provider 的错误,这意味着您正在使用 GPU 参数
spring.ai.embedding.transformer.onnx.gpuDeviceId,但缺少 onnxruntime_gpu 依赖项。

<dependency><groupId>com.microsoft.onnxruntime</groupId><artifactId>onnxruntime_gpu</artifactId></dependency>

请根据 CUDA 版本选择适当的 onnxruntime_gpu 版本(ONNX Java 运行时)。

四、手动配置

如果不使用 Spring Boot,您可以手动配置 Onnx Transformers 嵌入模型。为此,请将 spring-ai-transformers 依赖项添加到项目的 Maven pom.xml 文件中:

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

请参阅 依赖管理 部分,将 Spring AI BOM 添加到您的构建文件中。

然后创建一个新的 TransformersEmbeddingModel 实例,并使用 setTokenizerResource(tokenizerJsonUri) 和 setModelResource(modelOnnxUri) 方法设置导出的 tokenizer.json 和 model.onnx 文件的 URI。(支持 classpath:、file: 或 https: URI 模式)。

如果未显式设置模型,TransformersEmbeddingModel 默认使用 sentence-transformers/all-MiniLM-L6-v2:

以下代码片段说明了如何手动使用 TransformersEmbeddingModel:

TransformersEmbeddingModelembeddingModel=newTransformersEmbeddingModel();// (可选)默认为 classpath:/onnx/all-MiniLM-L6-v2/tokenizer.jsonembeddingModel.setTokenizerResource("classpath:/onnx/all-MiniLM-L6-v2/tokenizer.json");// (可选)默认为 classpath:/onnx/all-MiniLM-L6-v2/model.onnxembeddingModel.setModelResource("classpath:/onnx/all-MiniLM-L6-v2/model.onnx");// (可选)默认为 ${java.io.tmpdir}/spring-ai-onnx-model// 默认只缓存 http/https 资源。embeddingModel.setResourceCacheDirectory("/tmp/onnx-zoo");// (可选)如果看到类似 "ai.onnxruntime.OrtException: Supplied array is ragged, ..." 的错误,请设置分词器填充embeddingModel.setTokenizerOptions(Map.of("padding","true"));embeddingModel.afterPropertiesSet();List<List<Double>>embeddings=this.embeddingModel.embed(List.of("Hello world","World is big"));

如果手动创建 TransformersEmbeddingModel 实例,则必须在设置属性之后、使用客户端之前调用 afterPropertiesSet() 方法。

第一次 embed() 调用会下载大型 ONNX 模型并将其缓存在本地文件系统中。因此,第一次调用可能比平时花费更长的时间。使用 #setResourceCacheDirectory() 方法设置存储 ONNX 模型的本地文件夹。默认缓存文件夹是 ${java.io.tmpdir}/spring-ai-onnx-model。

将 TransformersEmbeddingModel 创建为 Bean 更为方便(且推荐)。这样您就不必手动调用 afterPropertiesSet()。

@BeanpublicEmbeddingModelembeddingModel(){returnnewTransformersEmbeddingModel();}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/11 7:01:36

基于 Rust 实现单向网闸环境下的 MQTT 消息透明传输

摘要&#xff1a;在工业互联网与关键信息基础设施保护&#xff08;CIIP&#xff09;场景中&#xff0c;物理单向网闸&#xff08;Data Diode/光闸&#xff09;的部署虽然提升了安全边界&#xff0c;但也阻断了 TCP/IP 协议的双向通信能力&#xff0c;导致 Kafka、MQTT 等通信协…

作者头像 李华
网站建设 2026/4/3 4:15:44

31、Shell编程:从基础到高级应用

Shell编程:从基础到高级应用 1. Here文档的使用 在输出文本时,除了使用 echo 命令的两种方法外,还有一种称为Here文档(Here Document)或Here脚本的方式。Here文档是一种额外的I/O重定向形式,它允许我们将一段文本嵌入到脚本中,并将其作为命令的标准输入。其基本语法…

作者头像 李华
网站建设 2026/4/11 5:35:10

35、脚本开发的故障排除、流程控制与参数处理

脚本开发的故障排除、流程控制与参数处理 1. 脚本开发中的故障排除 在脚本开发过程中,故障排除是一项至关重要的工作。下面将介绍一些常见的故障排除方法。 1.1 测试用例设计 为了进行有效的测试,开发和应用良好的测试用例非常重要。我们需要仔细选择输入数据或操作条件,…

作者头像 李华
网站建设 2026/4/9 20:59:23

YashanDB数据库的国际化与本地化策略

YashanDB数据库的国际化&#xff08;Internationalization, i18n&#xff09;与本地化&#xff08;Localization, l10n&#xff09;策略主要包括以下几个方面&#xff1a;1. 字符编码支持- Unicode 支持&#xff1a;确保数据库使用 UTF-8 或其他 Unicode 编码&#xff0c;以支持…

作者头像 李华
网站建设 2026/4/11 21:22:05

YashanDB数据库的核心模块及功能剖析

数据库系统的查询性能以及数据一致性的维护一直是数据库技术的核心难题。如何在保证事务的ACID特性前提下&#xff0c;提升查询执行效率和系统的高可用能力&#xff0c;是关系型数据库设计中的重要课题。YashanDB作为面向高性能和高可用性的关系型数据库&#xff0c;采用多种技…

作者头像 李华
网站建设 2026/4/8 0:19:58

动态规划入门

动态规划入门 文章目录动态规划入门动态规划的概念dp的重点必须存在 “重叠子问题”必须满足 “最优子结构”状态定义与状态转移方程例子动态规划的解题步骤例题动态规划的概念 动态规划&#xff08;Dynamic Programming&#xff0c;DP&#xff09;&#xff1a;是一种求解多阶段…

作者头像 李华