进程内 (ONNX)
LangChain4j 提供了一些常用的本地向量化(embedding)模型,并作为 Maven 依赖进行打包。
这些模型由 ONNX runtime 驱动,并在同一个 Java 进程中运行。
每个模型提供两种版本:原始版和量化版(在 Maven artifact 名称中带有 -q
后缀,在类名中带有 Quantized
)。
例如:
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-embeddings-all-minilm-l6-v2</artifactId>
<version>1.3.0-beta9</version>
</dependency>
EmbeddingModel embeddingModel = new AllMiniLmL6V2EmbeddingModel();
Response<Embedding> response = embeddingModel.embed("test");
Embedding embedding = response.content();
量化版示例:
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-embeddings-all-minilm-l6-v2-q</artifactId>
<version>1.3.0-beta9</version>
</dependency>
EmbeddingModel embeddingModel = new AllMiniLmL6V2QuantizedEmbeddingModel();
Response<Embedding> response = embeddingModel.embed("test");
Embedding embedding = response.content();
完整的嵌入模型列表可以在 这里 查看。
并行化
默认情况下,嵌入过程会使用所有可用的 CPU 内核进行并行化,
因此每个 TextSegment
会在单独的线程中被嵌入处理。
并行化是通过 Executor
来实现的。
默认情况下,进程内的嵌入模型使用一个缓存线程池,
线程数等于可用处理器的数量。线程会缓存 1 秒钟。
你可以在创建模型时,提供自定义的 Executor
实例:
Executor = ...;
EmbeddingModel embeddingModel = new AllMiniLmL6V2QuantizedEmbeddingModel(executor);
暂不支持 GPU 加速嵌入。
自定义模型
许多模型(例如来自 Hugging Face 的模型)都可以使用,
只要它们是 ONNX 格式即可。
关于如何将模型转换为 ONNX 格式,可以参考 这里。
许多已经转换为 ONNX 格式的模型可以在 这里 找到。
使用自定义嵌入模型的示例:
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-embeddings</artifactId>
<version>1.3.0-beta9</version>
</dependency>
String pathToModel = "/home/langchain4j/model.onnx";
String pathToTokenizer = "/home/langchain4j/tokenizer.json";
PoolingMode poolingMode = PoolingMode.MEAN;
EmbeddingModel embeddingModel = new OnnxEmbeddingModel(pathToModel, pathToTokenizer, poolingMode);
Response<Embedding> response = embeddingModel.embed("test");
Embedding embedding = response.content();