news 2026/3/28 14:15:53

在Java中加载和调用Embedding模型

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
在Java中加载和调用Embedding模型

推荐方案

  1. 生产环境推荐:使用ONNX Runtime方案,性能好,无需Python依赖
  2. 快速原型开发:使用REST API方案,部署简单
  3. 需要完整功能:考虑DeepSeek4j等专用Java库
  4. 灵活性要求高:使用DJL,支持多种模型格式

方法1:使用ONNX Runtime(推荐)

这是最直接且性能较好的Java集成方式。

步骤1:将BGE-M3转换为ONNX格式(Python端)
安装依赖

pip install torch transformers onnx onnxruntime

加载模型、设置为评估模式并导出onnx

importtorchfromFlagEmbeddingimportBGEM3FlagModel model=BGEM3FlagModel('BAAI/bge-m3',use_fp16=True)model.eval()# 设置为评估模式dummy_input=torch.tensor([[0]*model.config.hidden_size])# 需要根据模型结构调整onnx_path="bge_m3.onnx"torch.onnx.export(model,dummy_input,onnx_path,opset_version=13,input_names=['input_ids','attention_mask'],# 根据实际输入调整output_names=['output'])
步骤2:在Java中使用ONNX Runtime(Maven依赖)
<dependency><groupId>com.microsoft.onnxruntime</groupId><artifactId>onnxruntime</artifactId><version>1.17.0</version></dependency>

Java代码示例:

importai.onnxruntime.*;importjava.nio.file.Paths;importjava.util.*;publicclassBGE_M3_ONNX{privateOrtSessionsession;privateOrtEnvironmentenv;publicBGE_M3_ONNX(StringmodelPath)throwsOrtException{env=OrtEnvironment.getEnvironment();OrtSession.SessionOptionsopts=newOrtSession.SessionOptions();session=env.createSession(modelPath,opts);}publicfloat[]getEmbedding(Stringtext)throwsOrtException{// 文本预处理(需要实现分词器)// 这里简化处理,实际需要将文本转换为input_ids和attention_mask// 准备输入long[]inputIds=tokenize(text);// 需要实现tokenize方法long[]attentionMask=createAttentionMask(inputIds);// 创建输入Tensorlong[]shape={1,inputIds.length};OnnxTensorinputIdsTensor=OnnxTensor.createTensor(env,inputIds,shape);OnnxTensorattentionMaskTensor=OnnxTensor.createTensor(env,attentionMask,shape);// 准备输入MapMap<String,OnnxTensor>inputs=newHashMap<>();inputs.put("input_ids",inputIdsTensor);inputs.put("attention_mask",attentionMaskTensor);// 运行推理OrtSession.Resultresults=session.run(inputs);// 获取输出OnnxTensoroutputTensor=(OnnxTensor)results.get("output");float[]embeddings=(float[])outputTensor.getValue();returnembeddings;}privatelong[]tokenize(Stringtext){// 需要实现BGE-M3的分词逻辑// 可以使用HuggingFace的tokenizer或实现简单的分词returnnewlong[]{101,2345,6789,102};// 示例}privatelong[]createAttentionMask(long[]inputIds){long[]mask=newlong[inputIds.length];Arrays.fill(mask,1L);returnmask;}publicvoidclose()throwsOrtException{if(session!=null){session.close();}}}

方法2:使用Deep Java Library (DJL)

DJL是亚马逊开发的Java深度学习库,支持PyTorch、TensorFlow等模型。

Maven依赖:

<dependency><groupId>ai.djl</groupId><artifactId>api</artifactId><version>0.27.0</version></dependency><dependency><groupId>ai.djl.pytorch</groupId><artifactId>pytorch-engine</artifactId><version>0.27.0</version></dependency>

Java代码示例:

importai.djl.Model;importai.djl.inference.Predictor;importai.djl.modality.Input;importai.djl.modality.Output;importai.djl.translate.TranslateException;importai.djl.translate.Translator;importjava.nio.file.Paths;publicclassBGE_M3_DJL{privateModelmodel;privatePredictor<String,float[]>predictor;publicvoidloadModel(StringmodelPath)throwsException{model=Model.newInstance("bge-m3");model.load(Paths.get(modelPath));// 创建Translator(需要自定义实现)Translator<String,float[]>translator=newBGETranslator();predictor=model.newPredictor(translator);}publicfloat[]getEmbedding(Stringtext)throwsTranslateException{returnpredictor.predict(text);}publicvoidclose(){if(predictor!=null){predictor.close();}if(model!=null){model.close();}}// 自定义TranslatorstaticclassBGETranslatorimplementsTranslator<String,float[]>{@Overridepublicfloat[]processOutput(ai.djl.ndarray.NDListlist){// 处理模型输出returnlist.get(0).toFloatArray();}@Overridepublicai.djl.ndarray.NDListprocessInput(TranslatorContextctx,Stringinput){// 文本预处理和tokenization// 需要实现分词逻辑returnnewai.djl.ndarray.NDList();}}}

方法3:通过REST API调用

如果模型部署在Python服务中,可以通过HTTP调用。

Python服务端(FastAPI):

fromfastapiimportFastAPIfrompydanticimportBaseModelfromFlagEmbeddingimportBGEM3FlagModelimportnumpyasnp app=FastAPI()model=BGEM3FlagModel('BAAI/bge-m3',use_fp16=True)classEmbeddingRequest(BaseModel):texts:list[str]@app.post("/embed")asyncdefget_embeddings(request:EmbeddingRequest):embeddings=model.encode(request.texts)['dense_vecs']return{"embeddings":embeddings.tolist()}

Java客户端:

importcom.fasterxml.jackson.databind.ObjectMapper;importokhttp3.*;publicclassBGE_M3_API_Client{privatestaticfinalStringAPI_URL="http://localhost:8000/embed";privatefinalOkHttpClientclient=newOkHttpClient();privatefinalObjectMappermapper=newObjectMapper();publicfloat[][]getEmbeddings(List<String>texts)throwsException{// 构建请求体Map<String,Object>requestBody=newHashMap<>();requestBody.put("texts",texts);Stringjson=mapper.writeValueAsString(requestBody);RequestBodybody=RequestBody.create(json,MediaType.parse("application/json"));Requestrequest=newRequest.Builder().url(API_URL).post(body).build();try(Responseresponse=client.newCall(request).execute()){if(!response.isSuccessful()){thrownewRuntimeException("请求失败: "+response.code());}StringresponseBody=response.body().string();Map<String,Object>result=mapper.readValue(responseBody,Map.class);// 解析返回的向量List<List<Double>>embeddingsList=(List<List<Double>>)result.get("embeddings");float[][]embeddings=newfloat[embeddingsList.size()][];for(inti=0;i<embeddingsList.size();i++){List<Double>vec=embeddingsList.get(i);embeddings[i]=newfloat[vec.size()];for(intj=0;j<vec.size();j++){embeddings[i][j]=vec.get(j).floatValue();}}returnembeddings;}}}

方法4:使用DeepSeek4j(专用Java库)

根据搜索结果,DeepSeek4j提供了BGE-M3的Java支持。

代码示例:

importcom.deepseek4j.embedding.EmbeddingClient;importcom.deepseek4j.embedding.EmbeddingRequest;importcom.deepseek4j.embedding.EmbeddingResponse;publicclassBGE_M3_DeepSeek4j{publicstaticvoidmain(String[]args){EmbeddingClientclient=newEmbeddingClient();EmbeddingRequestrequest=EmbeddingRequest.builder().model("bge-m3:latest").input("What is BGE M3?").build();try{EmbeddingResponseresponse=client.embed(request);float[]embedding=response.getEmbedding();System.out.println("向量维度: "+embedding.length);System.out.println("向量: "+Arrays.toString(embedding));}catch(Exceptione){e.printStackTrace();}}}

注:

  1. 分词器实现:BGE-M3使用特定的分词器,需要正确处理
  2. 模型大小:BGE-M3模型较大,需要足够内存
  3. 性能优化:考虑批处理、GPU加速等优化手段
  4. 错误处理:添加适当的异常处理和资源清理
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/26 9:01:37

ai智能搜索文献:提升学术研究效率的智能文献检索新方法与实践应用

生成式人工智能的浪潮正引发各领域的颠覆性变革&#xff0c;在学术研究这一知识生产的前沿阵地&#xff0c;其影响尤为显著。文献检索作为科研工作的基石&#xff0c;在AI技术的赋能下各大学术数据库已实现智能化升级。小编特别策划"AI科研导航"系列专题&#xff0c;…

作者头像 李华
网站建设 2026/3/20 4:52:37

如何高效查找文献:掌握文献怎么查的实用方法与技巧

生成式人工智能的浪潮正引发各领域的颠覆性变革&#xff0c;在学术研究这一知识生产的前沿阵地&#xff0c;其影响尤为显著。文献检索作为科研工作的基石&#xff0c;在AI技术的赋能下各大学术数据库已实现智能化升级。小编特别策划"AI科研导航"系列专题&#xff0c;…

作者头像 李华
网站建设 2026/3/20 7:03:58

冲刺全球大模型第一股!智谱与MiniMax双双过会

中国大模型赛道在这个岁末寒冬突然沸腾&#xff0c;两家独角兽企业几乎同时扣响了港交所的大门&#xff0c;正在争夺全球大模型第一股头衔。被视为中国版OpenAI的智谱AI与主打极致效率的独角兽MiniMax&#xff0c;不约而同地通过了上市聆讯。两家公司的IPO冲刺&#xff0c;两种…

作者头像 李华
网站建设 2026/3/24 10:14:32

代理和虚拟信用卡如何协同工作以保护您的隐私

随着在线平台反机器人系统和地理限制越来越严格&#xff0c;从广告网络到 SaaS 平台都会分析您的IP、行为和支付信息。对于跨区域营销、全球代发货或跨境支付业务&#xff0c;这些审查可能成为增长障碍。代理服务器可以隐藏 IP&#xff0c;但如果多个账户使用同一信用卡&#x…

作者头像 李华
网站建设 2026/3/21 20:44:09

中文语音合成哪家强?GPT-SoVITS实测表现亮眼

中文语音合成哪家强&#xff1f;GPT-SoVITS实测表现亮眼 在智能语音助手越来越“懂人心”的今天&#xff0c;你有没有想过&#xff1a;如果能让AI用亲人的声音读一封家书&#xff0c;用偶像的语调讲一段故事&#xff0c;甚至用自己的音色播报新闻——这样的技术&#xff0c;离我…

作者头像 李华
网站建设 2026/3/26 14:41:52

【Open-AutoGLM邀请码获取指南】:3步教你成功注册内测账号

第一章&#xff1a;Open-AutoGLM新官网邀请码 Open-AutoGLM 作为新一代开源大语言模型自动化推理框架&#xff0c;近期发布了全新官方网站&#xff0c;旨在为开发者提供更高效的模型调用接口、可视化调试工具和社区协作平台。新官网采用邀请制注册机制&#xff0c;确保早期用户…

作者头像 李华