转换器(ONNX)嵌入
你可以使用任何 HuggingFace 嵌入模型。
它使用预训练的变换器模型,并序列化为开放神经网络交换(ONNX)格式。
Deep Java 库和 Microsoft ONNX Java 运行时库被用于运行 ONNX 模型并计算 Java 中的嵌入。
前提条件
要在 Java 中运行,我们需要将 Tokenizer 和 Transformer 模型序列化为ONNX格式。
用 optimum-cli 序列化——一种快速实现的方法,就是使用 optimum-cli 命令行工具。
以下摘要将准备一个 Python 虚拟环境,安装所需的包,并用以下方式序列化(例如导出)指定模型最佳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
该摘要将句子变换器/全MiniLM-L6-v2变换器导出为onnx-输出文件夹文件夹。后者包括tokenizer.json和model.onnx嵌入模型使用的文件。
你可以选择任何 huggingface 转换器标识符,或者直接提供文件路径,取代全 MiniLM-L6-v2。
自动配置
|
春季AI自动配置、起始模块的工件名称发生了重大变化。 更多信息请参阅升级说明。 |
Spring AI 为 ONNX 转换器嵌入模型提供 Spring Boot 自动配置。
要启用它,请在项目的Maven中添加以下依赖pom.xml文件:
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-transformers</artifactId>
</dependency>
或者去你的Gradlebuild.gradle构建文件。
dependencies {
implementation 'org.springframework.ai:spring-ai-starter-model-transformers'
}
要配置它,请使用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
支持的房产完整列表如下:
嵌入性质
|
嵌入自动配置的启用和禁用现在通过带有前缀的顶层属性配置 启用时,spring.ai.model.embedding=transformers(默认启用) 要禁用,可以使用spring.ai.model.embedding=none(或任何与变换器不匹配的值) 此改动旨在允许配置多个模型。 |
| 属性 | 描述 | 默认值 |
|---|---|---|
spring.ai.embedding.transformer.enabled(已移除且不再有效) |
启用转换器嵌入模型。 |
true |
spring.ai.model.embedding |
启用转换器嵌入模型。 |
变形金刚 |
spring.ai.embedding.transformer.tokenizer.uri |
由ONNX引擎创建的预训练HuggingFaceTokenizer的URI(例如tokenizer.json)。 |
onnx/all-MiniLM-L6-v2/tokenizer.json |
spring.ai.embedding.transformer.tokenizer.options |
HuggingFaceTokenizer 选项包括“addSpecialTokens”、“modelMaxLength”、“截断”、“填充”、“maxLength”、“stride”、“padToMultipleOf”。留空以便退回默认。 |
empty |
spring.ai.embedding.transformer.cache.enabled |
启用远程资源缓存。 |
true |
spring.ai.embedding.transformer.cache.directory |
缓存远程资源的目录路径,如 ONNX 模型 |
${java.io.tmpdir}/Spring-ai-OnnX-model |
spring.ai.embedding.transformer.onnx.modelUri |
现有的预训练 ONNX 模型。 |
onnx/all-MiniLM-L6-v2/model.onnx |
spring.ai.embedding.transformer.onnx.modelOutputName |
ONNX模型的输出节点名称,我们将用它进行嵌入计算。 |
last_hidden_state |
spring.ai.embedding.transformer.onnx.gpuDeviceId |
GPU设备ID来执行。仅当 >= 0 时才适用。否则就被忽视了。(需要额外的onnxruntime_gpu依赖) |
-1 |
spring.ai.embedding.transformer.metadataMode |
指定文档内容和元数据中哪些部分用于计算嵌入。 |
没有 |
误差与特殊情况
|
如果你看到像这样的错误 spring.ai.embedding.transformer.tokenizer.options.padding=true |
|
如果出现类似的错误 spring.ai.embedding.transformer.onnx.modelOutputName=token_embeddings |
|
如果出现类似的错误 这 目前唯一的解决办法是复制大号 |
|
如果出现类似的错误 <dependency>
<groupId>com.microsoft.onnxruntime</groupId>
<artifactId>onnxruntime_gpu</artifactId>
</dependency>
请根据CUDA版本(ONNX Java运行时)选择合适的onnxruntime_gpu版本。 |
手动配置
如果你没有使用 Spring Boot,可以手动配置 Onnx 转换器嵌入模型。
为此添加Spring-AI变换器对你项目Maven的依赖pom.xml文件:
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-transformers</artifactId>
</dependency>
| 请参考依赖管理部分,将Spring AI的物料清单添加到你的构建文件中。 |
然后创建一个新的变换器嵌入模型实例并使用setTokenizerResource(tokenizerJsonUri)和setModelResource(modelOnnxUri)设置导出 URI 的方法tokenizer.json和model.onnx文件。(Classpath:,文件:或https:支持URI模式)。
如果模型未被明确设定,变换器嵌入模型默认为sentence-transformers/all-MiniLM-L6-v2:
尺寸 |
384 |
平均性能 |
58.80 |
速度 |
每秒14200句 |
大小 |
80MB |
以下摘录展示了如何使用变换器嵌入模型手动下载:
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.
更方便(也更推荐)将TransformersEmbeddingModel创建为豆.
那你就不用打电话给afterPropertiesSet()手动下载。
@Bean
public EmbeddingModel embeddingModel() {
return new TransformersEmbeddingModel();
}