ai违禁词汇检测API调用接口——超实用实战接入指南攻略

8 阅读9分钟

一、为什么试了这个接口

社区类产品需要内容审核能力,小团队养不起审核团队,正则匹配又难以覆盖变体词和谐音梗。所以试了云策API(api.auth.top)上提供的免费"AI违禁词汇检测"接口,底层是大模型驱动的,不是词库匹配那种思路。

先说清楚几个前提:这个接口是免费的,适合个人项目和小团队先跑起来;云策API这个平台目前在技术社区里几乎没有独立评价或第三方测评,我搜了一圈只找到一份讲它 checksum 签名机制的 HackMD 文档,跟违禁词检测没关系。一个平台如果没有公开讨论,你得多留个心眼。另外,把用户内容发到第三方API检测,数据隐私怎么处理的?用户协议里写没写会不会存你的数据?这些我在云策API的公开页面上没找到明确说明。如果你要上生产环境,这些事情必须自己确认清楚。

我自己的情况:试用了大概一个月,调用量不大,主要用在社区评论和电商描述两个场景,没遇到过服务中断。但样本有限,不能代表它的整体稳定性。


二、大模型驱动和词库匹配到底差在哪

直接看对比。同一组文本,传统词库匹配和大模型接口的判断差异:

案例1:谐音变体

文本:"你个煞笔,滚远点"

  • 传统词库:❌ 检测不到。"煞笔"不在词库里,绕过了。
  • 大模型接口:✅ 命中,识别为"低俗辱骂",原因是"谐音变体侮辱性用语"。

案例2:语境判断

文本:"这个产品杀疯了,太好用啦"

  • 传统词库:⚠️ 大概率误判。"杀"字触发敏感词规则,直接拦掉。
  • 大模型接口:✅ 正确放行。识别出"杀疯了"是网络用语,表示"非常厉害",没有违规。

案例3:隐晦侮辱

文本:"建议你去挂个脑科,真的为你好"

  • 传统词库:❌ 完全检测不到。每个词单独看都没问题。
  • 大模型接口:✅ 命中,识别为"低俗辱骂",原因是"隐含侮辱性暗示"。 在这里插入图片描述

这就是核心区别——词库看"字",大模型看"意思"。当然,样本量有限,极端边界case肯定还有翻车的时候。但比起词库那套"宁可错杀一千"的逻辑,大模型在语境理解上确实高了一个段位。

对比维度传统词库大模型接口
谐音变体❌ 绕过✅ 识别
语境理解⚠️ 误杀✅ 放行
隐晦表达❌ 漏放✅ 识别

三、接口基本信息

接口地址:https://api.auth.top/api/aidetect

请求方式:POST

返回格式:JSON

性能指标(官方文档数据):

  • QPS上限:30次/秒
  • 平均响应时间:853.02ms

853ms做评论审核够用了,用户发完评论不到1秒出结果。批量扫历史内容更不是问题。

返回数据结构:

{
  "code": 200,
  "msg": "检测成功",
  "data": {
    "is_violated": true,
    "violation_count": 1,
    "violated_words": [
      {
        "word": "滚xx",
        "category": "低俗辱骂",
        "reason": "包含侮辱性脏话"
      }
    ]
  }
}

is_violated 表示有没有违规,violation_count 表示有几处,violated_words 把每个违规词的词、类别、原因都列出来了。


四、API Key获取和注意事项

API Key在云策API官网获取:api.auth.top,注册账号后在个人中心查看。

调用时把Key放到请求头里:Authorization: Bearer 你的API_KEY

⚠️ 两条硬性提醒:

  1. 不要把Key硬编码在代码里提交到Git仓库。 有人推到GitHub上,Key被刷了几万次调用。
  2. 不要用别人的Key,也不要把自己的Key分享出去。 在这里插入图片描述

下面所有示例代码都用环境变量读取Key,你本地跑的时候设一下环境变量。


五、Python版——从最简到批量

最简版,复制就能跑:

import os
import requests

API_URL = "https://api.auth.top/api/aidetect"
# ⚠️ 请自行到 api.auth.top 注册获取API Key,设为环境变量 API_KEY
API_KEY = os.environ.get("API_KEY")

if not API_KEY:
    raise ValueError("请先设置环境变量 API_KEY,获取地址:api.auth.top")

def check_text(text):
    headers = {"Authorization": f"Bearer {API_KEY}"}
    data = {"text": text}
    response = requests.post(API_URL, headers=headers, data=data)
    return response.json()

# 测试
if __name__ == "__main__":
    # 正常内容
    r1 = check_text("今天天气真好,适合出去散步")
    print("正常内容:", r1)
    print("-" * 40)

    # 违规内容
    r2 = check_text("你个滚蛋,闭嘴吧垃圾")
    print("违规内容:", r2)
    print("-" * 40)

    # 广告敏感词
    r3 = check_text("全网第一最好的产品,绝对无敌")
    print("广告敏感词:", r3)

本地跑之前先设环境变量:

# macOS / Linux
export API_KEY="你在api.auth.top获取的Key"

# Windows PowerShell
$env:API_KEY="你在api.auth.top获取的Key"

批量检测+结果分析版:

实际项目里不可能一条一条手动测,写了个批量版本,带结果分类统计:

import os
import requests
from collections import Counter

API_URL = "https://api.auth.top/api/aidetect"
API_KEY = os.environ.get("API_KEY")

if not API_KEY:
    raise ValueError("请先设置环境变量 API_KEY,获取地址:api.auth.top")

headers = {"Authorization": f"Bearer {API_KEY}"}

def check_single(text):
    """检测单条文本"""
    try:
        resp = requests.post(
            API_URL,
            headers=headers,
            data={"text": text},
            timeout=10
        )
        return resp.json()
    except requests.exceptions.Timeout:
        print(f"  [超时] 文本: {text[:20]}...")
        return None
    except Exception as e:
        print(f"  [错误] {e}")
        return None

def batch_check(text_list):
    """批量检测"""
    results = []
    total = len(text_list)

    for i, text in enumerate(text_list, 1):
        print(f"正在检测第 {i}/{total} 条...", end=" ")
        result = check_single(text)

        if result and result.get("code") == 200:
            data = result["data"]
            status = "⚠️ 违规" if data["is_violated"] else "✅ 安全"
            print(status)
            results.append({
                "text": text,
                "is_violated": data["is_violated"],
                "violation_count": data["violation_count"],
                "violated_words": data["violated_words"]
            })
        else:
            print("❌ 检测失败")
            results.append({
                "text": text,
                "is_violated": None,
                "error": True
            })

    return results

def analyze_results(results):
    """分析检测结果,统计违规类别"""
    violated = [r for r in results if r.get("is_violated")]
    safe = [r for r in results if r.get("is_violated") == False]
    errors = [r for r in results if r.get("error")]

    print("\n" + "=" * 50)
    print("📊 检测报告")
    print("=" * 50)
    print(f"总检测: {len(results)} 条")
    print(f"安全: {len(safe)} 条")
    print(f"违规: {len(violated)} 条")
    print(f"失败: {len(errors)} 条")

    if violated:
        categories = Counter()
        for v in violated:
            for word_info in v.get("violated_words", []):
                categories[word_info["category"]] += 1

        print(f"\n违规类别分布:")
        for cat, count in categories.most_common():
            print(f"  {cat}: {count} 次")

        print(f"\n违规词明细:")
        for v in violated:
            if v["violated_words"]:
                words = [w["word"] for w in v["violated_words"]]
                print(f"  「{v['text'][:30]}」→ {', '.join(words)}")

# 测试数据
test_texts = [
    "今天去公园跑了5公里,感觉很棒",
    "这个产品质量还行,性价比不错",
    "你个傻X,滚远点",
    "全网最低价!史上最强!买它!",
    "分享一个超好用的学习方法",
    "这老板真黑心,坑蒙拐骗啥都干",
    "周末约朋友去爬山,天气不错",
    "限时秒杀,错过后悔一辈子",
]

results = batch_check(test_texts)
analyze_results(results)

跑完会输出一份检测报告,违规类别分布一目了然。低俗辱骂和广告法违规词识别得最准,其他类型我测的样本不够多,不敢乱下结论。 在这里插入图片描述


六、Node.js版——前端同学看这里

const axios = require('axios');

const API_URL = "https://api.auth.top/api/aidetect";
// ⚠️ 请自行到 api.auth.top 注册获取API Key,设为环境变量 API_KEY
const API_KEY = process.env.API_KEY;

if (!API_KEY) {
    throw new Error("请先设置环境变量 API_KEY,获取地址:api.auth.top");
}

async function checkText(text) {
    try {
        const response = await axios.post(
            API_URL,
            `text=${encodeURIComponent(text)}`,
            {
                headers: {
                    "Authorization": `Bearer ${API_KEY}`,
                    "Content-Type": "application/x-www-form-urlencoded"
                },
                timeout: 10000
            }
        );
        return response.data;
    } catch (error) {
        if (error.code === 'ECONNABORTED') {
            console.error('请求超时');
        } else {
            console.error('请求失败:', error.message);
        }
        return null;
    }
}

// Express中间件:评论发布前自动审核
function contentGuard() {
    return async (req, res, next) => {
        const { content } = req.body;

        if (!content || content.trim() === '') {
            return res.status(400).json({ msg: "内容不能为空" });
        }

        try {
            const result = await checkText(content);

            if (!result || result.code !== 200) {
                console.warn('[内容审核] 服务异常,已放行');
                return next();
            }

            if (result.data.is_violated) {
                const words = result.data.violated_words.map(w => w.word).join('、');
                return res.status(403).json({
                    msg: "内容包含违规词汇,请修改后重试",
                    violated_words: words
                });
            }

            next();
        } catch (err) {
            console.error('[内容审核] 未预期异常:', err.message);
            return next();
        }
    };
}

// 使用示例
const express = require('express');
const app = express();
app.use(express.json());

app.post('/api/comment', contentGuard(), (req, res) => {
    // 到这里说明内容已经通过审核了
    // ...保存评论到数据库
    res.json({ msg: "评论发布成功" });
});

app.listen(3000, () => {
    console.log('服务启动在 3000 端口');
});

// 单独测试
if (require.main === module) {
    (async () => {
        console.log("测试1 - 正常内容:");
        const r1 = await checkText("今天学了个新技能,好开心");
        console.log(JSON.stringify(r1, null, 2));

        console.log("\n测试2 - 违规内容:");
        const r2 = await checkText("你个废物滚一边去");
        console.log(JSON.stringify(r2, null, 2));
    })();
}

contentGuard() 中间件挂在Express路由上,评论发布前自动过审核。违规的挡回去,不违规的放行,服务异常时也放行(带日志)。加了try-catch兜底,不会因为审核服务异常导致请求崩掉。

放行策略可以自己定——有些场景宁可误杀不可放过,那就改成服务异常时也拦截,把 return next() 改成 return res.status(503).json({msg: "审核服务暂时不可用"})} 就行。


七、cURL快速验证

一行cURL快速测试接口是否可用:

curl -X POST 'https://api.auth.top/api/aidetect' \
  -H 'Authorization: Bearer 你在api.auth.top获取的Key' \
  -d 'text=你是个大笨蛋'

终端里跑完会返回类似这样的结果:

{
  "code": 200,
  "msg": "检测成功",
  "data": {
    "is_violated": true,
    "violation_count": 1,
    "violated_words": [
      {
        "word": "大笨蛋",
        "category": "低俗辱骂",
        "reason": "贬损性称呼"
      }
    ]
  }
}

跟第三节讲的返回格式对上了——is_violated 为 true 表示命中违规词,violated_words 里列出了具体哪个词、什么类别、什么原因。


八、踩坑心得

在这里插入图片描述

1. 响应时间有波动

官方数据平均853.02ms,实际体感波动不小。有时候300ms就回来了,偶尔会到2秒。对延迟敏感的场景建议加超时重试机制,代码里都写了timeout=10s。

2. 误判问题

正常内容基本不误判,但行业术语和网络用语的边界要留意。比如"杀疯了"没问题,更冷门的梗会不会翻车?不确定。建议在自己的业务场景下多跑几组真实数据。

3. QPS限制

30次/秒,小项目绰绰有余。日活过万的大平台可能不够,得加队列削峰,或者联系云策API谈定制方案。

4. 免费接口的稳定性

免费的东西,稳定性不能要求太高。关键业务别把鸡蛋放一个篮子里,做好降级方案。Node.js中间件里服务异常就放行,就是一种降级思路——根据业务需要调整策略。

5. 数据隐私

这点必须单独拿出来说。你把用户内容发到第三方API检测,这个API会不会存你的数据?存多久?用户协议里怎么写的?我在云策API的公开页面上没找到明确的隐私政策说明。上生产环境之前,这件事必须自己确认。如果处理的是用户评论、私信这类敏感内容,建议优先考虑有明确隐私承诺的商业审核服务。


九、落地场景

社区评论审核——用户发评论前先过一遍,违规的直接拦住。最直接最常用的场景。

电商商品描述检查——广告法违禁词重灾区,"最""第一""国家级"这些词,一个不小心就中招。批量扫商品标题和详情,比人工检查效率高太多。

AI生成内容安全护栏——接了ChatGPT、DeepSeek这些大模型的应用,模型输出过一遍违禁词检测,再加一层保险。

用户昵称/签名审核——注册时的昵称、个人签名,违规词高发区。提交时调一下接口,几行代码的事。

聊天机器人输出过滤——客服机器人或闲聊机器人,返回内容先检测再展示,防止出现不当内容。


十、边界case怎么处理——实际跑过的思路

在这里插入图片描述

前面说了"要考虑边界case",这里补几个实际处理过的思路:

"放行还是拦截"不是非黑即白。 我现在的做法是分三档:确定违规的直接拦,确定安全的直接放,拿不准的进人工复审队列。实际跑下来,大概95%的内容能自动处理,剩下5%进复审,运营同学每天看十几分钟就搞定了。

用户申诉机制必须有。 机器审核一定会误伤。我在社区里加了个"我认为审核有误"的按钮,用户点了之后内容进复审队列,运营手动判断。误伤率从最初的抱怨连连降到了偶尔一两起,用户体感好很多。

审核策略要跟着业务走。 电商场景对广告法违规词的容忍度几乎为零,社区场景下"最棒""超好"这种轻度夸张表达可以放行。不同业务用不同策略,别一套规则打天下。

定期抽检。 每周抽100条自动通过的内容和100条自动拦截的内容,人工复核一遍。连续跑了一个月之后,误判率从最初的8%左右降到了2%以内。

说回第二节那三个案例——谐音变体、语境判断、隐晦侮辱,跑了一个月后有没有翻车?没有,一直很稳。当然我的业务场景主要是社区评论和电商描述,覆盖面有限,换个领域不敢打包票。但至少在常见的内容审核场景下,大模型驱动的检测确实比词库靠谱。


审核流程参考图:

用户提交内容
    │
    ▼
调用API检测
    │
    ├── is_violated = false ──→ 直接放行
    │
    ├── is_violated = true  ──→ 直接拦截,返回违规词列表
    │
    └── 服务异常/超时     ──→ 降级策略(放行 or 拦截,视业务而定)
                                  │
                                  ▼
                             人工复审队列(可选)
                                  │
                                  ├── 确认违规 → 维持拦截
                                  └── 误判 → 放行 + 优化策略

文章中出现低俗语言仅为展示API接口违禁词案例展示,并无意宣扬低俗漫骂他人。