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.pswp.cn/news/916057.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/916057.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在 macOS 上 安装最新 Python 和 pip

文章目录方法一&#xff1a;使用 Homebrew&#xff08;推荐&#xff09;方法二&#xff1a;使用 pyenv&#xff08;管理多个 Python 版本&#xff09;方法三&#xff1a;从官网下载安装包升级 pip验证安装方法一&#xff1a;使用 Homebrew&#xff08;推荐&#xff09; 1. 安装…

新能源电池厂自动化应用:Modbus TCP转DeviceNet实践

一、项目背景在新能源电池厂的生产过程中&#xff0c;提升自动化水平对提高生产效率和产品质量至关重要。我们的生产线上&#xff0c;施耐德PLC负责整体的生产流程控制&#xff0c;采用Modbus TCP协议进行数据传输&#xff0c;它基于以太网&#xff0c;传输速度快、稳定性高&am…

Java进阶3:Java集合框架、ArrayList、LinkedList、HashSet、HashMap和他们的迭代器

Java集合框架 集合框架被设计成的目标&#xff1a;高性能、高效 允许不同类型的结合&#xff0c;以类似的方式进行工作&#xff0c;有高度的互操作性 对一个集合的扩展和适应必须是简单的两种容器&#xff1a;集合Collection、图Map 集合接口被分为了三种子类型&#xff1a;Lis…

笔记/使用Excel进行财务预测

文章目录金融预测的决策与数据收集决定财务问题收集财务数据清理与合并财务数据解释与应用预测结果使用excel进行财务回归分析回归预测的步骤解释回归结果在 Excel 中执行预测财务分析指标财务分析常用指标一览表财务指标的相关性对竞争对手进行基准测试财务指标的趋势分析持续…

力扣1287:有序数组中出现次数超过25%的元素

力扣1287:有序数组中出现次数超过25%的元素题目思路代码题目 给你一个非递减的 有序 整数数组&#xff0c;已知这个数组中恰好有一个整数&#xff0c;它的出现次数超过数组元素总数的 25%。 请你找到并返回这个整数 思路 哈希表秒了 代码 class Solution { public:int fi…

如何用 Z.ai 生成PPT,一句话生成整套演示文档

大家好&#xff0c;这里是K姐。 一个帮你追踪最新AI应用的女子。 最近朋友给我分享了一个好玩的页面截图。 一眼看过去&#xff0c;就感觉这PPT的文字排版很有人工味。 我立马就去试了一下&#xff0c;才发现它根本不是传统的 PPT&#xff0c;而是一种网页式的 Slides 。 做…

C/C++ 编程:掌握静态库与动态库的编译

在 C/C 项目开发中&#xff0c;理解并掌握如何编译和使用库文件是至关重要的一环。库允许你将常用的函数和代码模块化&#xff0c;从而提高代码重用性、简化项目管理并缩短编译时间。最常见的两种库类型是静态库 (.a) 和动态库 (.so)。它们各有优缺点&#xff0c;适用于不同的开…

汽车安全 | 汽车安全入门

引言 汽车安全不仅仅是对汽车/车辆进行物理入侵。这只是很小且简单的一部分。当你以攻击者/对手的思维去看待一辆联网汽车时&#xff0c;你关注的是整个车辆生态系统。这不仅包括它如何与外部实体通信&#xff0c;也包括它在车内如何运作。 汽车是主要的交通工具&#xff0c;…

CLIP与SIGLIP对比浅析

CLIP 和 SIGLIP 的核心区别在于损失函数的设计&#xff1a;CLIP 使用基于 softmax 的对比损失&#xff08;InfoNCE&#xff09;&#xff0c;强制正样本在全局对比中压倒所有负样本&#xff0c;计算成本高且受限于负样本数量&#xff1b;SIGLIP 改用基于 sigmoid 的二元分类损失…

移动管家手机控车便捷性如何

移动管家4G手机控车-全面升级一键启动、无钥匙进入、手机启动、手机开关锁、手机开尾箱、手机寻车、车辆诊断、GPS北斗定位、电子围栏、车辆授权、车辆防盗抢、胎压检测、预约启动、车窗控制、车况提醒等功&#xff1b;移动管家手机控车系统&#xff08;以“移动管家控车APP”为…

MySQL 8.4.4详细下载安装配置

1、下载mysql8.4.4文件&#xff0c;取zip文件 mysql8.4.4下载路径 MySQL 5.7.31详细下载安装配置 2、配置环境变量 1.系统—>高级系统设置—>环境变量—>系统变量 在系统变量中点击新建&#xff0c;变量名为量名为&#xff1a;MYSQL_HOME&#xff0c;添加你的mys…

在 Linux 上安装 `pgvector`(这是一个 PostgreSQL 的向量类型扩展,常用于处理嵌入向量,便于进行向量相似度搜索)

全文 4000 字&#xff0c;配图配码&#xff0c;已在多家企业落地验证。阅读完如有收获&#xff0c;文末投票告诉我你最关注的方向&#xff0c;我会在下一篇文章里继续深入。 0. pgvector 简介 pgvector 是一款 PostgreSQL 原生向量数据类型扩展&#xff0c;核心能力&#xff1…

【项目实战】——深度学习.全连接神经网络

目录 1.使用全连接网络训练和验证MNIST数据集 2.使用全连接网络训练和验证CIFAR10数据集 1.使用全连接网络训练和验证MNIST数据集 import torch from torch import nn from torchvision import datasets, transforms from torch.utils.data import DataLoader from torch im…

嵌入式学习的第三十四天-进程间通信-TCP

一、TCPTCP : 传输控制协议 传输层1. TCP特点(1).面向连接,避免部分数据丢失 (2).安全、可靠 (3).面向字节流 (4).占用资源开销大2.TCP安全可靠机制三次握手:指建立tcp连接时&#xff0c;需要客户端和服务端总共发送三次报文确认连接。确保双方均已做好 收发…

【爬虫】06 - 自动化爬虫selenium

自动化爬虫selenium 文章目录自动化爬虫selenium一&#xff1a;Selenium简介1&#xff1a;什么是selenium2&#xff1a;安装准备二&#xff1a;元素定位1&#xff1a;id 定位2&#xff1a;name 定位3&#xff1a;class 定位4&#xff1a;tag 定位5&#xff1a;xpath 定位(最常用…

2025年中国移动鸿鹄大数据实训营(大数据方向)kafka讲解及实践-第2次作业指导

书接上回&#xff0c;第二次作业比较容易解决&#xff0c;我问了ai&#xff0c;让他对我进行指导&#xff0c;按照它提供的步骤&#xff0c;我完成了本次实验&#xff0c;接下来我会标注出需要注意的细节&#xff0c;指导大家完成此次任务。 &#x1f3af; 一、作业目标 ✔️…

三十七、【高级特性篇】定时任务:基于 APScheduler 实现测试计划的灵活调度

三十七、【高级特性篇】定时任务:基于 APScheduler 实现测试计划的灵活调度 前言 准备工作 第一部分:后端实现 - `APScheduler` 集成与任务调度 1. 安装 `django-apscheduler` 2. 配置 `django-apscheduler` 3. 数据库迁移 4. 创建调度触发函数 5. 启动 APScheduler 调度器 6…

RabbitMQ--消息顺序性

看本章之前强烈建议先去看博主的这篇博客 RabbitMQ--消费端单线程与多线程-CSDN博客 一、消息顺序性概念 消息顺序性是指消息在生产者发送的顺序和消费者接收处理的顺序保持一致。 二、RabbitMQ 顺序性保证机制 情况顺序保证情况备注单队列&#xff0c;单消费者消息严格按发送顺…

.net core接收对方传递的body体里的json并反序列化

1、首先我在通用程序里有一个可以接收对象型和数组型json串的反序列化方法public static async Task<Dictionary<string, string>> AllParameters(this HttpRequest request){Dictionary<string, string> parameters QueryParameters(request);request.Enab…

(10)机器学习小白入门 YOLOv:YOLOv8-cls 模型评估实操

YOLOv8-cls 模型评估实操 (1)机器学习小白入门YOLOv &#xff1a;从概念到实践 (2)机器学习小白入门 YOLOv&#xff1a;从模块优化到工程部署 (3)机器学习小白入门 YOLOv&#xff1a; 解锁图片分类新技能 (4)机器学习小白入门YOLOv &#xff1a;图片标注实操手册 (5)机器学习小…