当前位置: 首页 > news >正文

Spring AI 系列之二十四 - ModerationModel

之前做个几个大模型的应用,都是使用Python语言,后来有一个项目使用了Java,并使用了Spring AI框架。随着Spring AI不断地完善,最近它发布了1.0正式版,意味着它已经能很好的作为企业级生产环境的使用。对于Java开发者来说真是一个福音,其功能已经能满足基于大模型开发企业级应用。借着这次机会,给大家分享一下Spring AI框架。

注意由于框架不同版本改造会有些使用的不同,因此本次系列中使用基本框架是 Spring AI-1.0.0,JDK版本使用的是19
代码参考: https://github.com/forever1986/springai-study

目录

  • 1 ModerationModel
    • 1.1 关于Moderation
    • 1.2 Spring AI的ModerationModel
  • 2 示例演示

上一章讲了AudioModels(音频大模型),这一章再讲一个ModerationModel(内容审核大模型)

1 ModerationModel

1.1 关于Moderation

在互联网时代,用户每天会生成海量的内容,现在有了大模型那么网上的内容增加量几乎是几何倍增长。一方面享受到了大模型的生产力和创造力的红利,但是另一方面,对生成内容的安全性与合规性也提出了更高的要求。因此对于一些场景比如评论、弹幕、论坛、短视频、直播等领域,用户发表的内容可能包含一些敏感的、违规的内容。这不仅会对用户体验造成影响,更重要的,可能会给企业带来舆论和法律风险。因此需要对其内容进行审核。
ModerationModel :也叫内容审核模型,旨在基于文本、图像、音频、视频的检测技术,可自动检测涉黄、涉暴、图文违规等内容,对用户上传的文字、图片、音视频进行内容审核,以满足上传要求,帮助客户降低业务违规风险。以下是常见的违规事项(不同模型可能内容不同,但是大同小异):

类型说明
Sexual性相关(色情等)
Hate and Discrimination仇恨与歧视
Violence and Threats暴力与威胁
Dangerous and Criminal危险且犯罪的
Self-Harm自残,自我伤害
Health包含或试图提供详细或个性化医疗建议的内容。
Financial包含或试图提供详细或个性化财务建议的内容。
Law包含或试图提供详细或定制化法律建议的内容。
PII包含个人信息

1.2 Spring AI的ModerationModel

在Spring AI中抽象了一个ModerationModel接口,定义了一个通用的用于内容审核的 AI 模型。它扩展了Model接口,以处理与各种类型 AI 模型的交互(目前该接口来看只适合于文本类型内容审核)。其源码如下:

import org.springframework.ai.model.Model;/*** 提供了一个单一的方法“call”方法*/
@FunctionalInterface
public interface ModerationModel extends Model<ModerationPrompt, ModerationResponse> {ModerationResponse call(ModerationPrompt request);}

同时提供的入参ModerationPrompt和出参ModerationResponse
其中ModerationPrompt有2个重要的变量:

  • ModerationMessage:表示一条需进行审核处理的消息,其中包含文本内容。此类别为可提交至审核流程的消息提供了基本结构。
  • ModerationOptions:提供一些模型可用的配置,只是个接口,需要模型厂商需要自己实现自己的配置

其中ModerationResponse有2个重要的变量:

  • ModerationResponseMetadata:定义了与审核回复相关的元数据,扩展了基础回复接口。
  • Generation:来自审核流程的响应。它包含了审核生成的元数据以及审核对象。

比较遗憾的是目前Spring AI中的ModerationModel只实现了OpeanAI和MistralAI两个模型,不过相信后续会有更多厂商模型接入。

2 示例演示

代码参考lesson20子模块

示例说明:由于目前Spring AI只有OpeanAI和MistralAI两个模型实现了ModerationModel,这里利用Mistral AI模型作为演示,只是它是免费且没有被禁用

1)申请MistralAI的API KEY,访问:https://console.mistral.ai/api-keys

在这里插入图片描述

说明:没注册的朋友可能要注册一下,需要使用一个邮箱和手机

2)新建lesson20子模块,其pom引入如下:

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-mistral-ai</artifactId></dependency>
</dependencies>

3)配置application.properties文件

spring.ai.mistralai.api-key=你的Mistral API KEY

4)新建演示类ModerationController :

import org.springframework.ai.mistralai.moderation.MistralAiModerationModel;
import org.springframework.ai.mistralai.moderation.MistralAiModerationOptions;
import org.springframework.ai.moderation.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RestController
public class ModerationController {private final MistralAiModerationModel mistralAiModerationModel;@Autowiredpublic ModerationController(MistralAiModerationModel mistralAiModerationModel) {this.mistralAiModerationModel = mistralAiModerationModel;}@GetMapping("/ai/moderation")public void moderation(@RequestParam(value = "message", defaultValue = "这个事情只有男的可以做,女的做不到!") String message) {// 说明一下,这个message只是为了测试效果,并不代表作者任何观点MistralAiModerationOptions moderationOptions = MistralAiModerationOptions.builder().model("mistral-moderation-latest").build();ModerationPrompt moderationPrompt = new ModerationPrompt(message, moderationOptions);ModerationResponse moderationResponse = mistralAiModerationModel.call(moderationPrompt);// 获取审核结果Moderation moderation = moderationResponse.getResult().getOutput();// Access the moderation results (there's usually only one, but it's a list)for (ModerationResult result : moderation.getResults()) {System.out.println("最终结果:");System.out.println("Flagged: " + result.isFlagged());// Access categoriesCategories categories = result.getCategories();System.out.println("\n类型,true表示包含:");// 触发法律System.out.println("Law: " + categories.isLaw());// 触发金融限制System.out.println("Financial: " + categories.isFinancial());// 包括个人信息System.out.println("PII: " + categories.isPii());// 包括色情System.out.println("Sexual: " + categories.isSexual());// 包括偏见、敌意System.out.println("Hate: " + categories.isHate());// 包括骚扰信息System.out.println("Harassment: " + categories.isHarassment());// 包括宣传、鼓励自杀自残等System.out.println("Self-Harm: " + categories.isSelfHarm());// 包括未成年人色情System.out.println("Sexual/Minors: " + categories.isSexualMinors());// 包括偏见、敌意的恐吓等System.out.println("Hate/Threatening: " + categories.isHateThreatening());// 包括暴力血腥层面System.out.println("Violence/Graphic: " + categories.isViolenceGraphic());// 包括自杀自残倾向System.out.println("Self-Harm/Intent: " + categories.isSelfHarmIntent());// 包括引导自杀自残System.out.println("Self-Harm/Instructions: " + categories.isSelfHarmInstructions());// 包括自杀自残恐吓System.out.println("Harassment/Threatening: " + categories.isHarassmentThreatening());// 包括暴力System.out.println("Violence: " + categories.isViolence());// Access category scoresCategoryScores scores = result.getCategoryScores();System.out.println("\n以下个各种类型分数(分数越高代表可能性越高:");System.out.println("Law: " + scores.getLaw());System.out.println("Financial: " + scores.getFinancial());System.out.println("PII: " + scores.getPii());System.out.println("Sexual: " + scores.getSexual());System.out.println("Hate: " + scores.getHate());System.out.println("Harassment: " + scores.getHarassment());System.out.println("Self-Harm: " + scores.getSelfHarm());System.out.println("Sexual/Minors: " + scores.getSexualMinors());System.out.println("Hate/Threatening: " + scores.getHateThreatening());System.out.println("Violence/Graphic: " + scores.getViolenceGraphic());System.out.println("Self-Harm/Intent: " + scores.getSelfHarmIntent());System.out.println("Self-Harm/Instructions: " + scores.getSelfHarmInstructions());System.out.println("Harassment/Threatening: " + scores.getHarassmentThreatening());System.out.println("Violence: " + scores.getViolence());}}
}

5)新建启动类Lesson20Application :

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class Lesson20Application {public static void main(String[] args) {SpringApplication.run(Lesson20Application.class, args);}}

6)演示效果:

http://localhost:8080/ai/moderation

在这里插入图片描述

说明:从上图可以看到,输入一句具有歧视的内容,Hate就是true,其代表的分数也接近1。

结语:本章讲述了什么是内容审核模型,并对Spring AI 中的ModerationModel相关类和接口进行讲解。最后通过使用Mistral模型演示了效果。看到有内容审核模型,有朋友可能会想到大模型经常出现幻觉,那么应该就有评估是否存在幻觉的测试,Spring AI也提供了Evaluation这样的模块实现模型评估测试,下一章将着重介绍这一部分的使用。

Spring AI系列上一章:《Spring AI 系列之二十三 - AudioModels》

Spring AI系列下一章:《Spring AI 系列之二十五 - Evaluation模型评估》

http://www.dtcms.com/a/295954.html

相关文章:

  • 每日算法刷题Day52:7.24:leetcode 栈5道题,用时1h35min
  • 前端性能新纪元:Rust + WebAssembly 如何在浏览器中实现10倍性能提升(以视频处理为例)
  • uniapp nvue开发App 横竖屏切换丢失上下文导致 setTimeout和clearTimeout报错
  • [网安工具] 自动化威胁检测工具 —— D 盾 · 使用手册
  • SAP-MM-采购订单批量创建 excel 版
  • 保留5位小数封装一个自定义指令
  • Linux 内核基础统简全解:Kbuild、内存分配和地址映射
  • 10分钟搭建脚手架:Spring Boot 3.2 + Vue3 前后端分离模板
  • Springboot儿童医院问诊导诊系统aqy75(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • 使用钉钉开源api发送钉钉工作消息
  • C语言 一文详解常用的字符串操作函数及模拟实现
  • 医疗系统国产化实录:SQL Server国产替代,乙方保命指南
  • DigitalOcean 一键模型部署,新增支持百度开源大模型ERNIE 4.5 21B
  • 集合中Comparable接口和Equals方法的冲突
  • 【Mermaid 离线工具】Mermaid 流程图生成器 - 高清PNG输出,一键生成专业级流程图!
  • 共创养生新时代——2025酵素益生产品展暨中秋滋补选品节即将开启
  • QT6 源(165)模型视图架构里的所有的信号函数概览
  • UNETR++: Delving Into Efficient and Accurate 3D Medical Image Segmentation
  • 深度分析Java内存模型
  • 【全新上线】境内 Docker 镜像状态监控
  • 算法第三十八天:动态规划part06(第九章)
  • 【shell脚本编程】day1 备份指定文件类型
  • Unreal5从入门到精通之 动画蓝图 快速入门
  • ML1-ETO 阳性白血病的复发与 LSC 的持续存在密切相关
  • 2025智能BI⼯具竞品深度解析:DataFocus如何挑Tableau与PowerBI的霸主地位?
  • OpenCV图像插值、边缘填充、图像掩膜、噪声消除实战指南
  • 华为仓颉编程语言的表达式的特点
  • 网安学习NO.18
  • 深入掌握CSS Grid布局:每个属性详解与实战示例
  • MySQL 8.4.4详细下载安装配置