转换器(ONNX)嵌入

变换器嵌入模型嵌入模型实现时,利用选定的句子变换器局部计算句子嵌入spring-doc.cadn.net.cn

它使用预训练的变换器模型,并序列化为开放神经网络交换(ONNX)格式。spring-doc.cadn.net.cn

Deep Java 库和 Microsoft ONNX Java 运行时库被用于运行 ONNX 模型并计算 Java 中的嵌入。spring-doc.cadn.net.cn

前提条件

要在 Java 中运行,我们需要将 Tokenizer 和 Transformer 模型序列化ONNX格式。spring-doc.cadn.net.cn

用 optimum-cli 序列化——一种快速实现的方法,就是使用 optimum-cli 命令行工具。 以下摘要将准备一个 Python 虚拟环境,安装所需的包,并用以下方式序列化(例如导出)指定模型最佳CLI:spring-doc.cadn.net.cn

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

该摘要将句子变换器/全MiniLM-L6-v2变换器导出为onnx-输出文件夹文件夹。后者包括tokenizer.jsonmodel.onnx嵌入模型使用的文件。spring-doc.cadn.net.cn

你可以选择任何 huggingface 转换器标识符,或者直接提供文件路径,取代全 MiniLM-L6-v2。spring-doc.cadn.net.cn

自动配置

春季AI自动配置、起始模块的工件名称发生了重大变化。 更多信息请参阅升级说明spring-doc.cadn.net.cn

Spring AI 为 ONNX 转换器嵌入模型提供 Spring Boot 自动配置。 要启用它,请在项目的Maven中添加以下依赖pom.xml文件:spring-doc.cadn.net.cn

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

或者去你的Gradlebuild.gradle构建文件。spring-doc.cadn.net.cn

dependencies {
    implementation 'org.springframework.ai:spring-ai-starter-model-transformers'
}
请参考依赖管理部分,将Spring AI的物料清单添加到你的构建文件中。 请参阅神器仓库部分,将这些仓库添加到你的构建系统中。

要配置它,请使用spring.ai.embedding.transformer.*性能。spring-doc.cadn.net.cn

例如,将此添加到你的application.properties文件中,以配置客户端使用intfloat/e5-small-v2文本嵌入模型:spring-doc.cadn.net.cn

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-doc.cadn.net.cn

嵌入性质

嵌入自动配置的启用和禁用现在通过带有前缀的顶层属性配置spring.ai.model.embedding.spring-doc.cadn.net.cn

启用时,spring.ai.model.embedding=transformers(默认启用)spring-doc.cadn.net.cn

要禁用,可以使用spring.ai.model.embedding=none(或任何与变换器不匹配的值)spring-doc.cadn.net.cn

此改动旨在允许配置多个模型。spring-doc.cadn.net.cn

属性 描述 默认值

spring.ai.embedding.transformer.enabled(已移除且不再有效)spring-doc.cadn.net.cn

启用转换器嵌入模型。spring-doc.cadn.net.cn

truespring-doc.cadn.net.cn

spring.ai.model.embeddingspring-doc.cadn.net.cn

启用转换器嵌入模型。spring-doc.cadn.net.cn

变形金刚spring-doc.cadn.net.cn

spring.ai.embedding.transformer.tokenizer.urispring-doc.cadn.net.cn

由ONNX引擎创建的预训练HuggingFaceTokenizer的URI(例如tokenizer.json)。spring-doc.cadn.net.cn

onnx/all-MiniLM-L6-v2/tokenizer.jsonspring-doc.cadn.net.cn

spring.ai.embedding.transformer.tokenizer.optionsspring-doc.cadn.net.cn

HuggingFaceTokenizer 选项包括“addSpecialTokens”、“modelMaxLength”、“截断”、“填充”、“maxLength”、“stride”、“padToMultipleOf”。留空以便退回默认。spring-doc.cadn.net.cn

emptyspring-doc.cadn.net.cn

spring.ai.embedding.transformer.cache.enabledspring-doc.cadn.net.cn

启用远程资源缓存。spring-doc.cadn.net.cn

truespring-doc.cadn.net.cn

spring.ai.embedding.transformer.cache.directoryspring-doc.cadn.net.cn

缓存远程资源的目录路径,如 ONNX 模型spring-doc.cadn.net.cn

${java.io.tmpdir}/Spring-ai-OnnX-modelspring-doc.cadn.net.cn

spring.ai.embedding.transformer.onnx.modelUrispring-doc.cadn.net.cn

现有的预训练 ONNX 模型。spring-doc.cadn.net.cn

onnx/all-MiniLM-L6-v2/model.onnxspring-doc.cadn.net.cn

spring.ai.embedding.transformer.onnx.modelOutputNamespring-doc.cadn.net.cn

ONNX模型的输出节点名称,我们将用它进行嵌入计算。spring-doc.cadn.net.cn

last_hidden_statespring-doc.cadn.net.cn

spring.ai.embedding.transformer.onnx.gpuDeviceIdspring-doc.cadn.net.cn

GPU设备ID来执行。仅当 >= 0 时才适用。否则就被忽视了。(需要额外的onnxruntime_gpu依赖)spring-doc.cadn.net.cn

-1spring-doc.cadn.net.cn

spring.ai.embedding.transformer.metadataModespring-doc.cadn.net.cn

指定文档内容和元数据中哪些部分用于计算嵌入。spring-doc.cadn.net.cn

没有spring-doc.cadn.net.cn

误差与特殊情况

如果你看到像这样的错误原因:ai.onnxruntime.OrtException:提供的数组是ragged,..你还需要启用分词器填充application.properties如下:spring-doc.cadn.net.cn

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

如果出现类似的错误生成输出名称中不包含预期:last_hidden_state。考虑其中一个可用的模型输出:token_embeddings,......你需要根据你的模型设置正确的模型输出名称。 请考虑错误信息中列出的名字。 例如:spring-doc.cadn.net.cn

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

如果出现类似的错误ai.onnxruntime.OrtException: 错误代码 - ORT_FAIL - 消息:取消序列化张量 onnx::MatMul_10319 失败。获取文件长度 for ./model.onnx_data 失败:无效 fd 被提供了:-1, 这意味着你的模型大于2GB,并且序列化为两个文件:model.onnxmodel.onnx_data.spring-doc.cadn.net.cn

model.onnx_data称为外部数据,预计位于model.onnx.spring-doc.cadn.net.cn

目前唯一的解决办法是复制大号model.onnx_data在你运行启动应用的文件夹里。spring-doc.cadn.net.cn

如果出现类似的错误ai.onnxruntime.OrtException:错误代码 - ORT_EP_FAIL - 消息:未能找到CUDA共享提供者, 这意味着你正在使用GPU参数spring.ai.embedding.transformer.onnx.gpuDeviceId但缺少onnxruntime_gpu依赖。spring-doc.cadn.net.cn

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

请根据CUDA版本(ONNX Java运行时)选择合适的onnxruntime_gpu版本。spring-doc.cadn.net.cn

手动配置

如果你没有使用 Spring Boot,可以手动配置 Onnx 转换器嵌入模型。 为此添加Spring-AI变换器对你项目Maven的依赖pom.xml文件:spring-doc.cadn.net.cn

<dependency>
  <groupId>org.springframework.ai</groupId>
  <artifactId>spring-ai-transformers</artifactId>
</dependency>
请参考依赖管理部分,将Spring AI的物料清单添加到你的构建文件中。

然后创建一个新的变换器嵌入模型实例并使用setTokenizerResource(tokenizerJsonUri)setModelResource(modelOnnxUri)设置导出 URI 的方法tokenizer.jsonmodel.onnx文件。(Classpath:,文件:https:支持URI模式)。spring-doc.cadn.net.cn

如果模型未被明确设定,变换器嵌入模型默认为sentence-transformers/all-MiniLM-L6-v2spring-doc.cadn.net.cn

尺寸spring-doc.cadn.net.cn

384spring-doc.cadn.net.cn

平均性能spring-doc.cadn.net.cn

58.80spring-doc.cadn.net.cn

速度spring-doc.cadn.net.cn

每秒14200句spring-doc.cadn.net.cn

大小spring-doc.cadn.net.cn

80MBspring-doc.cadn.net.cn

以下摘录展示了如何使用变换器嵌入模型手动下载:spring-doc.cadn.net.cn

TransformersEmbeddingModel embeddingModel = new TransformersEmbeddingModel();

// (optional) defaults to classpath:/onnx/all-MiniLM-L6-v2/tokenizer.json
embeddingModel.setTokenizerResource("classpath:/onnx/all-MiniLM-L6-v2/tokenizer.json");

// (optional) defaults to classpath:/onnx/all-MiniLM-L6-v2/model.onnx
embeddingModel.setModelResource("classpath:/onnx/all-MiniLM-L6-v2/model.onnx");

// (optional) defaults to ${java.io.tmpdir}/spring-ai-onnx-model
// Only the http/https resources are cached by default.
embeddingModel.setResourceCacheDirectory("/tmp/onnx-zoo");

// (optional) Set the tokenizer padding if you see an errors like:
// "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"));
如果你创建一个变换器嵌入模型手动时,你必须呼叫afterPropertiesSet()在设置属性后、使用客户端之前的方法。

第一embed()调用下载大型 ONNX 模型并将其缓存到本地文件系统。 因此,第一次通话可能会比平时花更长时间。 使用该#setResourceCacheDirectory(<path>)设置 ONNX 模型存储的本地文件夹的方法。 默认缓存文件夹是${java.io.tmpdir}/Spring-ai-OnnX-model.spring-doc.cadn.net.cn

更方便(也更推荐)将TransformersEmbeddingModel创建为. 那你就不用打电话给afterPropertiesSet()手动下载。spring-doc.cadn.net.cn

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