之前做個幾個大模型的應用,都是使用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模型評估》