之前做个几个大模型的应用,都是使用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模型评估》