跳到正文
土土金API

文本与图片内容审核

用大模型做内容审核,是让模型按平台定好的标签(通过、拒绝、待复核和违规类型)给文本和图片分类,程序据此放行、拦截或送人工复核,申诉始终由人处理。模型只是辅助工具,审核标准和最终处理由平台自己负责。按每月 30 万条文本、5 万张图片估算,用各模型最低价分组的实时价格计算,模型费用每月约 ¥189。

价格更新于 2026年11月13日 17:58

月成本估算

假设:每月 30 万条文本(评论、私信、帖子),每条输入约 1,000 tokens(审核标准和示例约 900、内容约 100),输出约 50 tokens;5 万张图片,每张输入约 1,500 tokens(图片约 1,000、标准约 500),输出约 60 tokens;约 1.5 万条待复核内容和申诉交给主力模型整理,每条输入约 3,000 tokens、输出约 300 tokens。

¥188.64/ 月

  • 文本分类¥72
  • 图片审核¥36
  • 复核与申诉辅助¥80.64
看用量假设

业务问题

评论、私信、帖子、商品描述、头像和配图,用户每天发布的内容都要审核。全靠人工,量一大就跟不上,夜间和节假日更容易出现空档;只靠关键词规则,又容易误伤正常内容,换个写法就漏过去。

大模型能结合上下文理解文字的意思,也能看懂图片内容,适合做第一道筛选。但它会判断失误,同一条内容两次判断的结果也可能不同;遇到违规内容时,模型服务自身的安全策略有时会直接拒绝处理。审核结论关系到用户的账号和发言,不能完全交给模型。

常见做法是:规则先拦截明显的广告和黑名单内容,模型按明确的标签分类并给出理由,高风险和拿不准的进入人工复核队列,处罚决定和申诉由人负责。审核标准、处理结果和所在地法律法规规定的义务,都由平台自己承担。

推荐模型组合

推荐模型按实时目录自动选取,价格取各模型最低价分组,更新于 2026年11月13日 17:58。点模型名可查看全部分组价格。

参考架构

  1. 1

    写清审核标准

    把平台规则拆成明确的标签:通过、拒绝、待复核,以及广告引流、辱骂骚扰、色情、暴力、违法信息、泄露隐私等违规类型。每个标签写清定义、正例和反例,由运营和法务确定。

  2. 2

    规则预过滤

    先用关键词、黑名单、链接和图片哈希等规则,拦截明显违规和重复的内容,减少送给模型的量,这部分也不产生模型费用。

  3. 3

    模型分类

    文本交给小模型、图片交给识图模型,要求按 JSON 返回标签、违规类型和一句理由。模型拒绝处理、finish_reason 为 content_filter、返回为空或解析失败时,一律按“待复核”处理,不能当作通过。

  4. 4

    按风险分流

    明确通过的直接发布,明确违规的拦截并告知用户原因,待复核的和涉及封号等重处罚的进入人工复核队列。自动处理的范围先保守,再根据人工复核的结果逐步调整。

  5. 5

    人工复核与申诉

    审核员在队列里看到原文或原图、模型给的标签和理由,以及复核模型整理的上下文,然后做出决定。用户申诉一律由人处理,模型只帮审核员整理材料。

  6. 6

    记录与校准

    保存每条内容的模型结果、审核员结论和处理时间;定期抽查自动放行和自动拦截的内容,统计误判,把典型误判补进审核标准和示例。

成本估算

假设:每月 30 万条文本(评论、私信、帖子),每条输入约 1,000 tokens(审核标准和示例约 900、内容约 100),输出约 50 tokens;5 万张图片,每张输入约 1,500 tokens(图片约 1,000、标准约 500),输出约 60 tokens;约 1.5 万条待复核内容和申诉交给主力模型整理,每条输入约 3,000 tokens、输出约 300 tokens。

项目模型用量假设费用
文本分类gemini-2.5-flash-lite300,000 次 × 输入 1,000 + 输出 50 tokens¥72
图片审核Claude Haiku 5.550,000 次 × 输入 1,500 + 输出 60 tokens¥36
复核与申诉辅助qwen3.5-plus15,000 次 × 输入 3,000 + 输出 300 tokens¥80.64
合计(每月)¥188.64

按各模型最低价分组的实时价格计算,价格更新于 2026年11月13日 17:58。

只含模型调用费用,不含人工审核、存储和服务器成本。图片换算成多少 tokens 因模型和分辨率而异,表中按每张约 1,000 tokens 估算,实际以响应里的 usage 为准;重复上传的图片按哈希去重,只审一次。审核标准写在系统提示词开头且固定不变,模型支持上下文缓存时命中部分按缓存读取价计费;被规则预过滤拦下的内容不产生模型费用。

示例代码

文本和图片用同一套标签、同一个函数,模型按 JSON 返回结论。请求出错、模型拒绝处理、被内容安全策略拦截或结果无法解析时,一律进入人工复核队列,不会被当作通过。

示例代码(Python,文本与图片审核)
import base64
import json
import os
from openai import APIError, OpenAI

client = OpenAI(base_url="https://www.tutujin.com/v1", api_key=os.environ["TUTUJIN_API_KEY"])

POLICY = """You moderate posts in a community app. Reply with one JSON object only:
{"decision": "allow" | "block" | "review", "category": "none" | "spam" | "abuse" | "sexual" | "violence" | "illegal" | "privacy", "reason": "one short sentence"}
spam: ads, or contact details to move a deal off the platform. abuse: insults or threats aimed at a person.
privacy: someone else's phone number, address or ID number. Judge only by these rules. If you are not sure, answer "review"."""
REVIEW = {"decision": "review", "category": "unknown"}
review_queue = []


def moderate(content, model):
    """Anything other than a clear, parseable answer goes to a person, never to "allow"."""
    try:
        resp = client.chat.completions.create(
            model=model,
            messages=[{"role": "system", "content": POLICY}, {"role": "user", "content": content}],
        )
    except APIError as e:  # refused or blocked by the model provider
        return {**REVIEW, "reason": "request failed: " + type(e).__name__}
    choice = resp.choices[0]
    text = choice.message.content or ""
    if choice.finish_reason == "content_filter" or "{" not in text:
        return {**REVIEW, "reason": "model declined"}
    try:
        result = json.loads(text[text.find("{"): text.rfind("}") + 1])
    except json.JSONDecodeError:
        return {**REVIEW, "reason": "unparseable answer"}
    if result.get("decision") not in ("allow", "block", "review"):
        return {**REVIEW, "reason": "unknown label"}
    return result


def moderate_text(text):
    return moderate(text, "gemini-2.5-flash-lite")


def moderate_image(path):
    with open(path, "rb") as f:  # scale images down before this: fewer tokens
        url = "data:image/jpeg;base64," + base64.b64encode(f.read()).decode()
    content = [
        {"type": "text", "text": "Moderate this image, including any text in it."},
        {"type": "image_url", "image_url": {"url": url}},
    ]
    return moderate(content, "claude-haiku-5-5")


for item_id, result in [
    ("post-1", moderate_text("DM me on another app for cheap followers!!")),
    ("avatar-7", moderate_image("avatar.jpg")),
]:
    if result["decision"] == "review":
        # a person decides; qwen3.5-plus can gather the context for the reviewer
        review_queue.append({"id": item_id, **result})
    print(item_id, result)

用一把 Key 试试这个方案

注册后在控制台创建 API Key,把上面代码里的 base_url 和 Key 换成你的就能运行。企业采购、开发票可以加客服微信 JsnonoChat。

土土金客服微信二维码
微信JsnonoChat

扫码或搜索微信号添加客服

常见问题

内容审核每月要花多少钱?

按每月 30 万条文本、5 万张图片、约 1.5 万条复核和申诉辅助估算,用最低价分组计算约 ¥189。规则预过滤拦下的越多、图片压得越小,费用越低。

模型的审核结果可以直接作为处罚依据吗?

不建议。模型会误判,同一条内容多次判断的结果也可能不同。模型结论适合用来放行明显正常的内容、拦下明显违规的内容、给待复核内容排优先级;封号、删帖等重处罚和全部申诉,应由审核员确认。审核标准和处理结果由平台自己负责。

模型拒绝处理或者返回空结果怎么办?

有的模型服务遇到违规内容会拒绝回答、返回 finish_reason 为 content_filter,或者直接报错。这些情况都要按“待复核”送人工,不能当作通过。上线前用真实样本测一测所选模型遇到各类违规内容时的表现。

用了大模型审核,能满足监管要求吗?

不能保证。本方案只是技术上的辅助手段,不构成任何合规承诺。平台需要按所在地的法律法规自己履行内容管理义务;面向中国境内公众提供生成式 AI 服务的,还涉及算法备案、安全评估和生成内容标识等要求,见本站的《使用规范》。

图片审核的费用怎么算?

图片按换算后的输入 tokens 计费,分辨率越高 tokens 越多,具体以响应里的 usage 为准。先把图片缩小到能看清内容的尺寸,重复上传的图片用哈希去重,只审一次。

严重违法的内容也交给模型判断吗?

疑似涉及未成年人的性内容等严重违法信息,规则或模型一旦识别出来,应按所在地法律规定的流程处置和报告;已经确认的内容不要作为普通样本反复提交给模型,也不要拿来测试。