不要把“分数大于某个固定值”当成完整内容安全方案。默认先用官方 flagged 做第一层判断,再按类别、输入类型和业务风险分流;高风险动作在审核完成前不要执行。自定义阈值要用代表性评测集校准,并在模型或策略变化后重新验证。
官方资料(2026-10-31 核对):Moderation guide · Create moderation reference · omni-moderation-latest model · Deprecations
Moderation API 能审核什么?
OpenAI 当前把 Moderation 定位为有害内容分类能力。你可以单独把文本或图片提交到 Moderation 端点,也可以在生成请求中附带审核配置,取得输入与完整输出的审核信号。当前 omni-moderation-latest 支持文本和图片,不支持音频;Moderation 端点当前免费,图片文件上限为 20 MB。
| 输入 | 支持情况 | 注意 |
|---|---|---|
| 文本 | 支持 | 可传字符串、字符串数组或 text 对象 |
| 图片 | 支持 | 使用 image_url,可传远程 URL 或 Base64 Data URL;当前上限 20 MB |
| 音频 | 不支持 | 不要把语音文件直接交给 Moderation 模型 |
| 流式增量 | 不逐 delta 返回审核结果 | 生成请求附带的审核分数要等完整输出可用 |
若是已知或疑似 CSAM,不要发送给 Moderation API。官方明确说明它不是 CSAM 检测或处置系统,也不能替代专门的儿童安全保障与报告流程。
最小可用调用:先在服务端审核文本
API Key 必须保存在服务端环境变量中。下面示例把用户文本提交给官方 SDK,读取第一条结果;生产代码还要补充鉴权、超时、日志脱敏和错误策略。
import OpenAI from "openai";
const openai = new OpenAI({
apiKey: process.env.OPENAI_API_KEY
});
const moderation = await openai.moderations.create({
model: "omni-moderation-latest",
input: userText
});
const result = moderation.results[0];
if (result.flagged) {
return {
action: "review",
categories: result.categories
};
}
return { action: "allow" };
端点是 POST /v1/moderations。API Reference 当前仍列出旧的 text-moderation-* 名称,但官方弃用页显示这些旧模型已在 2025-10-27 停用;新实现应使用 omni-moderation-latest,若需要稳定行为可评估官方列出的快照。
文本和图片怎样一起审核?
多模态 input 是一个对象数组。文本项使用 type: "text",图片项使用 type: "image_url"。远程图片地址必须能被服务读取;Base64 图片使用 Data URL。不要只看总的 flagged,还要确认每个类别实际应用到 text、image 还是两者。
const moderation = await openai.moderations.create({
model: "omni-moderation-latest",
input: [
{
type: "text",
text: userCaption
},
{
type: "image_url",
image_url: {
url: "https://example.com/upload.png"
}
}
]
});
const result = moderation.results[0];
console.log({
flagged: result.flagged,
categories: result.categories,
scores: result.category_scores,
appliedTo: result.category_applied_input_types
});
四个结果字段应该怎样读?
| 字段 | 含义 | 推荐用途 | 不要误解为 |
|---|---|---|---|
flagged | 至少一个类别被模型标记 | 第一层分流 | 你的最终法律或业务结论 |
categories | 每个类别的布尔判断 | 决定阻断、复核或提示类型 | 所有类别都适用于所有输入 |
category_scores | 0 到 1 的类别置信分数 | 评测、分级路由和人工队列排序 | 可永久通用的概率或固定阈值 |
category_applied_input_types | 该类别分数适用于 text、image 或两者 | 解释多模态结果 | 每个类别都支持图片 |
当前类别包括 harassment、hate、illicit、self-harm、sexual、violence 及部分细分类别。harassment、hate、illicit 与 sexual/minors 等类别是文本限定;self-harm、sexual、violence 及其部分细分类别支持文本和图片。纯图片输入遇到文本限定类别时,官方说明会返回 0 分。
怎样设计阈值和人工复核?
- 先定义动作,不先拍脑袋定数字:区分允许、提示、限制功能、人工复核、拒绝与紧急处置。
- 按类别与场景拆开:公开发布、私聊、搜索、工具执行和支付动作的容错成本不同。
- 准备代表性评测集:包含正常内容、边界内容、明确违规内容与常见语言变体,并记录人工标签。
- 计算误报与漏报:按类别查看 precision、recall 和业务损失,不用一个阈值覆盖全部类别。
- 记录模型标识:若依赖分数阈值,升级模型或切换快照后重新跑评测。
- 保留复核和申诉:尤其是高影响账户动作,不应只凭一次自动分类直接永久处罚。
官方说明 Moderation 端点的底层模型会持续升级,因此依赖 category_scores 的自定义策略可能需要随时间重新校准。若你必须保持稳定阈值,应结合官方快照、变更管理和回归测试。
输入审核、输出审核和工具调用怎样排顺序?
| 阶段 | 推荐位置 | 主要目的 |
|---|---|---|
| 用户输入 | 模型调用或工具执行之前 | 避免明显高风险请求进入后续链路 |
| 模型完整输出 | 向用户展示或持久发布之前 | 处理生成内容中的风险 |
| 工具参数 | 工具执行之前 | 审核不能替代 Schema、权限与业务规则校验 |
| 工具结果 | 回传模型或展示之前 | 减少外部内容直接暴露的风险 |
生成 API 的内联审核会给输入和完整输出返回审核容器,但模型仍会正常生成;应用必须在展示或执行下游动作前读取结果。工具调用场景中,官方说明对话内容里的工具参数与工具输出可以被覆盖,但工具名、描述、Schema 和 response-format Schema 不在审核范围内。因此 Function Calling 仍需参数校验、最小权限和显式授权。
流式输出尤其要谨慎:审核分数在完整输出后才到达,不会随每个 partial delta 返回。如果界面立即展示每个增量,用户可能先看到尚未审核的内容;可按风险选择短缓冲、完整输出后展示或使用其他分层策略。具体流式状态机见 OpenAI API Streaming 指南。
审核失败时怎样降级?
以下是应用设计建议,不是 OpenAI 为所有业务规定的统一规则:
- 高风险写操作:审核超时或返回错误时停止动作、限制能力或转人工,不把“没有结果”当作“安全”。
- 低风险只读场景:可根据风险承受能力提供受限降级,但要明确哪些内容和功能仍被禁止。
- 统一错误模型:为超时、429、5xx、无效输入和图片抓取失败分别记录状态,不在日志中保存完整敏感正文。
- 监控:跟踪审核调用成功率、延迟、flagged 比例、各类别分布、人工推翻率和模型版本。
- 演练:模拟 Moderation 服务不可用、图片过大、远程 URL 失效和模型行为变化。
API 请求本身的 429、500、503 和超时仍按 429 速率限制与 5xx/超时指南处理;不要无限重试,也不要在浏览器暴露 Key。
上线前检查清单
- 服务端调用
/v1/moderations,API Key 未进入前端、Git 或日志。 - 使用
omni-moderation-latest或经过评测的官方快照,不再依赖已停用的 text-moderation 模型。 - 文本、图片和混合输入均有真实样本测试;图片大小与抓取失败有明确错误。
- 代码同时读取 flagged、categories、category_scores 与 category_applied_input_types。
- 每个类别都有允许、复核、拒绝或降级动作,且动作与风险相称。
- 自定义阈值有版本化评测集、误报/漏报指标和重新校准计划。
- 输入、输出、工具参数与工具结果的检查位置清楚,审核不替代权限和 Schema 校验。
- Streaming 不会在完整审核结果到达前无条件展示高风险增量。
- 超时、429、5xx 和审核错误有 fail-closed、受限降级或人工路径。
- 高影响决定保留人工复核、申诉、审计与隐私最小化。
常见问题
OpenAI Moderation API 是做什么的?
它用于识别文本或图片中可能有害的内容。应用可以把结果用于拦截、路由人工复核或账户干预,但结果只是策略信号,不等于你的业务规则,也不能替代人工申诉和高风险场景的专门保障。
OpenAI Moderation API 怎么调用?
服务端使用 API Key 向 POST /v1/moderations 发送 model 和 input。当前官方推荐 omni-moderation-latest;input 可以是字符串、字符串数组,或由 text 与 image_url 对象组成的多模态数组。
flagged、categories 和 category_scores 分别是什么意思?
flagged 表示是否至少有一个类别被标记;categories 给出每个类别的布尔判断;category_scores 是 0 到 1 的模型置信分数。先用 flagged 做第一层判断,再按业务风险读取类别、分数和适用输入类型。
Moderation API 支持图片和音频吗?
omni-moderation-latest 支持文本和图片,不支持音频。官方当前说明图片文件上限为 20 MB;某些类别只支持文本,纯图片输入在这些类别上会返回 0 分,应同时查看 category_applied_input_types。
可以把 category_scores 设成固定阈值长期使用吗?
不建议把一次设定的阈值永久不变。OpenAI 会升级底层审核模型,官方提醒依赖 category_scores 的自定义策略可能需要重新校准。应使用代表性评测集、按类别设置策略、记录模型版本并定期复测。
应该审核用户输入还是模型输出?
高风险产品通常同时考虑输入和输出:输入审核可在模型调用或工具执行前阻断明显风险,输出审核可在展示前处理生成内容。具体是否拦截、复核或允许,应根据场景、法规和误判成本制定,不能只照搬统一规则。
Moderation 请求失败时应该放行还是拒绝?
没有适用于所有产品的统一答案。高风险动作更适合停止、降级或转人工;低风险只读场景可根据风险承受能力设计受限降级。无论选择哪种路径,都要设置超时、记录不含敏感正文的错误、监控失败率,并通过故障演练验证。
本文核对日期为 2026-10-31。模型、类别、费率、限制和字段可能调整,上线前请再次读取官方 Moderation 指南、模型页与 API Reference。
音频应用应先按专用工作流转录,再决定如何审核文本与业务操作;转录、实时字幕和 TTS 边界见 OpenAI Audio API 教程。
生成或编辑图片仍需检查参考图授权、提示遵循、品牌与安全边界;Images 端点、模型和评测见 OpenAI Images API 教程。