简介
在和AI聊天时,我们要对一些敏感词进行过滤,比如政治敏感词,色情/涉黄词,暴力/脏话词,广告/营销词,违法词。AI只会回答与敏感词无关的提问。所以我们需要在AI客服中引入过滤敏感词的功能。
实战
<!--敏感词检索-->
<dependency>
<groupId>com.github.houbb</groupId>
<artifactId>sensitive-word</artifactId>
<version>0.21.0</version>
</dependency>
package com.yutian.config;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.github.houbb.sensitive.word.api.IWordAllow;
import com.github.houbb.sensitive.word.api.IWordDeny;
import com.github.houbb.sensitive.word.bs.SensitiveWordBs;
import com.github.houbb.sensitive.word.support.allow.WordAllows;
import com.github.houbb.sensitive.word.support.deny.WordDenys;
import com.yutian.biz.entity.SensitiveWord;
import com.yutian.biz.mapper.SensitiveWordMapper;
import com.yutian.enums.SensitiveWordEnums;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.List;
/**
* 敏感词检索配置类
*/
@Configuration
public class SensitiveWordConfig {
@Autowired
private SensitiveWordMapper sensitiveWordMapper;
@Bean
public SensitiveWordBs sensitiveWordBs() {
return SensitiveWordBs.newInstance()
//使用内置黑名单词库+自定义黑名单
.wordDeny(WordDenys.chains(WordDenys.defaults(), new IWordDeny() {
//数据库自定义黑名单
@Override
public List<String> deny() {
return sensitiveWordMapper.selectList(Wrappers.lambdaQuery(SensitiveWord.class)
.eq(SensitiveWord::getType, SensitiveWordEnums.SENSITIVE_WORD_DENY.getCode()))
.stream()
.map(SensitiveWord::getWord)
.toList();
}
}))
//使用内置白名单词库+自定义白名单
.wordAllow(WordAllows.chains(WordAllows.defaults(),new IWordAllow() {
//数据库中自定义白名单
@Override
public List<String> allow() {
return sensitiveWordMapper.selectList(Wrappers.lambdaQuery(SensitiveWord.class)
.eq(SensitiveWord::getType, SensitiveWordEnums.SENSITIVE_WORD_ALLOW.getCode()))
.stream()
.map(SensitiveWord::getWord)
.toList();
}
}))
//启用邮箱检查
.enableEmailCheck(true)
//启用URL检查
.enableUrlCheck(true)
//启用数字检查
.enableNumCheck(true)
//忽略大小写
.ignoreCase(true)
//半角全角忽略
.ignoreWidth(true)
.init();
}
}
@Autowired
private SensitiveWordBs sensitiveWordBs;
/**
* 检查用户问题是否包含敏感词
* @param userMessage
* @return
*/
private String userMessageCheck(String userMessage){
Assert.notEmpty(userMessage,"输入内容不可为空...");
if(sensitiveWordBs.contains(userMessage)){
return "该问题内容包含敏感词汇,我暂时无法回答,请重新换一个问题我们再聊吧...";
}
return null;
}