前言
AI搜索引擎开源项目Demo站点(isou.chat)的用户量突然连续几天增长,高峰达到1000+用户每天,让我突然担忧了起来,这个站点本身只是一个项目演示的站点,没想到会涌入这么多当工具使用的用户,由于大部分用户都是来自国内,而Demo站点又没有对用户提问的问题进行违禁敏感词审查,担心非国产大模型(例如ChatGPT)会生成违法的内容,万一被请去喝茶就不好了。
实现过程
首先想到自己写个关键词过滤接口,但是我嫌麻烦,而且也没必要在这个项目中增加代码量了。
其次又想到了利用国内云服务平台的文本内容审查接口,接入他们的API对用户提问的问题进行审查,于是开始寻找各家云服务平台的内容安全产品。
一看价格就放弃了,如果只是用于演示站点的话似乎没必要(当然也有很多其他价格低廉的方案)。
这时候突然想到,国产大模型服务在输出内容的时候肯定都是经过了内容审查,那么似乎可以直接借用AI大模型的能力来实现敏感词的审查。
而且这个项目本身就是通过AI大模型来生成内容,相关接口已经都有了,不需要再重新写接口了,实现起来基本只需要一个Prompt就可以搞定了。
选用谁家的大模型?阿里百度腾讯等国产都是可以的,我这里选了阿里云的qwen-turbo模型,也是阿里最便宜的一个模型,注册就送100万tokens,并发大、响应快,似乎是个理想选择。
立刻开始测试,下面是一个简单的示例:
// 彩虹屁对LLM似乎是有奇效的,能有效提升准确率。这里紧紧是我自己写的一个示例,还有很大的优化空间。
// 这里仅让大模型输出[[stop]]或者[[safe]],不需要流式输出,响应速度也是很快。
// 需要特别注意的情况是:你不能在Prompt中增加具体的敏感词,这会导致所有的请求被拒绝,因为这个时候这个Prompt本身就是违禁的。
const prompts = `
你是一个专业的中国互联网违禁敏感词检查专家,特别擅长于检查用户输入的问题是否包含违禁敏感词汇,你已经持续稳定工作了数十年,从未出错。
你需要仔细检查用户输入的问题,如果包含了违禁敏感词汇,请直接返回[[stop]],如果用户输入的问题不包含违禁敏感词汇,请直接返回[[safe]],不要返回任何不相关的内容。
你需要谨慎的判断用户输入的问题,仔细分析用户的意图,判断用户是否是主观意图想要查询违禁敏感问题,如果你不能确定的话,那么用户的问题大概率不包含敏感词汇。
用户输入的问题是:
`
/**
* 敏感词审查
*/
export async function checkSensitive(query: string): Promise<boolean> {
try {
const messages: IChatInputMessage[] = [
{
role: 'user',
content: `${prompts}\n${query}`
}
];
const res: string = await aliyun.chat(messages);
if (res.includes('safe')) return false;
if (res.includes('stop')) return true;
return false;
} catch (error: any) {
// 阿里云大模型在检测出敏感词也会抛出错误
// 输出 code: DataInspectionFailed, message: 'Input data may contain inappropriate content.'
// 所以这里也是借用了国产大模型自身的审查能力
if (error?.message?.includes('inappropriate')) return true;
return false;
}
}
这样只需要这几行代码就实现了敏感词的基本审查能力,经过测试大部分违禁敏感词汇都会被识别,你可以通过调教prompt来增加敏感词的识别能力和严格程度。
接下来只需要在相关逻辑中增加审查逻辑就可以了。