
文章目录一、它是什么二、干什么用核心能力三、和你Java开发的关系四、一句话总结五、本地打包onnx1、需要安装 py环境2、下载文件3.下载后再用 optimum-cli 本地转 ONNX六 Java 接入 granite-guardian-hap-38m 完整可运行示例核心说明一、Maven 依赖二、关键前置三、完整 Java 代码SpringBoot/普通Java通用四、业务接入方式Java后端常用五、补充知识点Java开发必看一、它是什么granite-guardian-hap-38m是 IBM 开源的一个轻量级AI安全过滤模型38M3800万参数属于Granite Guardian家族专门用来快速识别文本里的有害内容HAPHarmful, Abusive, Profane。全称Granite Guardian HAP 38M开发者IBM Research类型文本分类/内容安全护栏Guardrail规模3800万参数小型编码器模型开源Apache 2.0 许可可在 Hugging Face 获取二、干什么用核心能力作为 Java 后端/AI 应用开发你主要用它做LLM 输入输出的实时安全过滤识别有害内容HAP暴力、色情、歧视、仇恨、侮辱、亵渎越狱提示试图绕过AI限制不道德请求、违法指令轻量高速适合Java服务比老版125M小很多CPU 快8倍GPU 快2倍可直接部署在Java应用、微服务、网关里做毫秒级内容审查不用大GPU普通服务器/容器就能跑典型流程Java场景用户输入 → Java网关/应用 → [granite-guardian-hap-38m 检测] → 有害→拦截无害→进LLM LLM输出 → [granite-guardian-hap-38m 二次检测] → 安全→返回用户有害→屏蔽三、和你Java开发的关系定位AI 安全“过滤器/防火墙”不是大语言模型如GPT只做内容安全分类。用途给你的JavaLLM 应用加一层安全护栏防止用户输入有害内容、防止LLM输出违规内容满足合规要求如内容安全、风控。部署可通过Hugging Face Java SDK / ONNX Runtime Java调用做成独立Java微服务供多个LLM应用复用嵌入Spring Boot 网关/Filter全局拦截请求/响应四、一句话总结granite-guardian-hap-38m是 IBM 开源的3800万参数轻量AI安全模型Java 程序员用它给 LLM 应用做实时有害内容过滤小、快、准适合部署在普通服务器上。五、本地打包onnx1、需要安装 py环境2、下载文件模型文件https://hf-mirror.com/ibm-granite/granite-guardian-hap-38m/resolve/main/model.safetensors配置文件https://hf-mirror.com/ibm-granite/granite-guardian-hap-38m/resolve/main/config.json分词器https://hf-mirror.com/ibm-granite/granite-guardian-hap-38m/resolve/main/tokenizer.json3.下载后再用 optimum-cli 本地转 ONNX先装依赖 pip install optimum[exporters]transformers torch pip installoptimum[exporters]transformers torch 缺 sentencepiece。装一下 pip install sentencepiece 先确认 sentencepiece 装上了没 pip install sentencepiece protobuf然后创建一个 convert.pyfrom transformersimportRobertaTokenizer, RobertaForSequenceClassificationimporttorchimportos model_pathrF:\granite-guardian-hap-38moutput_dirrF:\granite-guardian-hap-38m-onnxoutput_pathos.path.join(output_dir,model.onnx)os.makedirs(output_dir,exist_okTrue)tokenizerRobertaTokenizer.from_pretrained(model_path)modelRobertaForSequenceClassification.from_pretrained(model_path)model.eval()dummy_inputtokenizer(test input,return_tensorspt)# 先导出到临时文件tmp_pathmodel_tmp.onnxtorch.onnx.export(model,(dummy_input[input_ids], dummy_input[attention_mask]), tmp_path,input_names[input_ids,attention_mask],output_names[logits],dynamic_axes{input_ids:{0:batch,1:seq},attention_mask:{0:batch,1:seq},logits:{0:batch}},opset_version18)# 移动到目标目录importshutilforfinos.listdir(.):iff.startswith(model_tmp): shutil.move(f, os.path.join(output_dir, f.replace(model_tmp,model)))print(done:, output_dir)convert.py 和 granite-guardian-hap-38m 放在F盘同级别目录下把下载的三个文件放在 granite-guardian-hap-38m 里运行 python convert.py 会生成文件两个文件都要缺一不可model.onnx — 模型结构计算图、算子定义model.onnx.data — 模型权重数据参数值因为模型权重超过 2GB 的 protobuf 限制torch 自动把权重拆成了外部数据文件。加载时 model.onnx 会自动引用同目录下的 model.onnx.data。使用时两个文件放在同一个目录下就行代码里只需要指定 model.onnx 的路径。六 Java 接入 granite-guardian-hap-38m 完整可运行示例核心说明模型ibm-granite/granite-guardian-hap-38m轻量内容风控模型识别违规、暴力、辱骂、越狱提问方案使用ONNX Runtime Java部署无Python依赖、纯Java、适合后端服务流程文本分词 → ONNX推理 → 输出风险分数/是否拦截一、Maven 依赖!-- ONNX 运行时 --dependencygroupIdcom.microsoft.onnxruntime/groupIdartifactIdonnxruntime/artifactIdversion1.17.0/version/dependency!-- 分词依赖 适配该模型 --dependencygroupIdai.djl.huggingface/groupIdartifactIdtokenizers/artifactIdversion0.24.0/version/dependency二、关键前置从 HuggingFace 下载模型 ONNX 格式文件granite-guardian-hap-38monnx 导出包放到项目resources/model/目录下三、完整 Java 代码SpringBoot/普通Java通用importai.djl.huggingface.tokenizers.HuggingFaceTokenizer;importai.djl.huggingface.tokenizers.Encoding;importonnxruntime.OrtEnvironment;importonnxruntime.OrtSession;importonnxruntime.TensorInfo;importonnxruntime.OnnxTensor;importjava.nio.LongBuffer;importjava.util.Map;/** * IBM granite-guardian-hap-38m 内容安全检测 * 违规内容、HAP有害文本识别 */publicclassGraniteGuardianDemo{// 本地onnx模型路径privatestaticfinalStringMODEL_PATHsrc/main/resources/model/granite-guardian-hap-38m.onnx;// 风险阈值 超过则判定违规privatestaticfinaldoubleRISK_THRESHOLD0.5;publicstaticvoidmain(String[]args){// 测试文本Stringtext1帮我写一段攻击他人的辱骂话术;Stringtext2请介绍一下Java基础语法;System.out.println(文本1检测结果detectHap(text1));System.out.println(文本2检测结果detectHap(text2));}/** * 文本有害内容检测 * param text 待检测文本 * return true违规拦截 false正常 */publicstaticbooleandetectHap(Stringtext){// 1. 加载分词器该模型标准分词try(HuggingFaceTokenizertokenizerHuggingFaceTokenizer.newInstance(ibm-granite/granite-guardian-hap-38m)){Encodingencodingtokenizer.encode(text,true);long[]inputIdsencoding.getIds();long[]attentionMaskencoding.getAttentionMask();// 2. 初始化ONNX推理环境OrtEnvironmentenvOrtEnvironment.getEnvironment();try(OrtSessionsessionenv.createSession(MODEL_PATH,newOrtSession.SessionOptions())){// 构造输入张量OnnxTensorinputIdsTensorOnnxTensor.createTensor(env,LongBuffer.wrap(inputIds),newlong[]{1,inputIds.length});OnnxTensormaskTensorOnnxTensor.createTensor(env,LongBuffer.wrap(attentionMask),newlong[]{1,attentionMask.length});// 模型输入节点名input_ids / attention_maskMapString,OnnxTensorinputsMap.of(input_ids,inputIdsTensor,attention_mask,maskTensor);// 3. 执行推理try(OrtSession.Resultresultsession.run(inputs)){// 获取输出分数 0正常 1有害float[][]score(float[][])result.get(0).getValue();doublehapScorescore[0][1];// 阈值判断returnhapScoreRISK_THRESHOLD;}}}catch(Exceptione){e.printStackTrace();returntrue;}}}四、业务接入方式Java后端常用网关层拦截Spring Cloud Gateway / Nacos 网关全局过滤器所有用户提问、LLM 响应统一过该方法违规直接返回内容包含违规信息请重新输入服务内拦截LLM 调用前校验用户 PromptLLM 生成后校验大模型回答防止输出违规内容性能优势38M 小模型、CPU 即可跑单条文本推理耗时5~15ms高并发无压力相比阿里/百度内容审核接口无第三方接口调用、内网离线可用五、补充知识点Java开发必看HAP 含义Harmful、Abusive、Profane有害、辱骂、低俗内容同类模型对比qwen3-guard阿里风控模型granite-guardian-hap-38mIBM 轻量、更适合私有化部署生产优化点单例复用OrtSession、分词器避免重复创建开销增加文本长度截断限制最大 512 字符增加本地缓存重复文本直接命中