简短回答
GPT 系列模型遇到违反原厂使用政策的请求时,不会报错。接口照常返回 HTTP 200,finish_reason 是 stop,正文是模型自己写的一句拒答,比如「I can’t help with that…」或「抱歉,我不能…」。
响应里没有错误码,也没有拒答类别或严重程度,结构与正常回答完全一样,并且按正常输出计费。所以只看状态码和 finish_reason,是判断不出「被拒答了」的。
拒答的输出体
下面是/v1/chat/completions 非流式拒答的实测返回(正文已替换为中性示例):
为什么没有分类
OpenAI 的对话接口对违规请求的处理方式,是让模型自己决定不回答,而不是由接口返回一个错误。它不会告诉你命中的是哪一类(例如成人向内容、血腥暴力、自我伤害等),也不给严重程度。 这和「报错」是两回事:报错时你拿到的是非 200 状态码和error 对象;拒答时你拿到的是一次成功的调用,只是内容不是你想要的。
翻译与结构化输出场景
批量翻译、信息抽取这类任务,通常要求模型按固定格式输出(比如一个 JSON 数组)。一旦某批内容触发拒答,模型返回的是一句普通文字,客户端按 JSON 解析就会失败,常见报错如Unrecognized token 'I'、Expecting value。
这不是接口格式问题,而是这一批内容本身被拒绝处理。同一批内容原样重试,结果通常也一样。
API易 已对非流式请求启用内容安全自动切换:某条官方线路在请求阶段或生成阶段触发内容过滤时,会自动切换到其他官方线路重新处理,无需客户端重试。切换后,大多数请求能拿到正常结果;极个别内容仍可能被模型本身拒答,这时就是本文描述的形态。
如何识别与处理
1
先校验输出格式
要求 JSON 就先按 JSON 解析,要求固定条数就核对条数。格式不符,就当作「未拿到结果」处理,不要直接把正文当译文使用。
2
再判断是否为拒答
格式不符时,看正文是否是一句以
I can't、Sorry、抱歉 等开头的短句。是的话基本可以判定为拒答,而不是模型输出格式跑偏。3
不要原样重试
同一内容原样重试,大概率得到同样的拒答,还会重复计费。
4
拆小批次,定位具体条目
把失败的批次拆成更小的批次重新提交,找出触发拒答的具体条目;其余条目通常可以正常完成。对触发的条目,可以调整表述后再试。
5
内部存档失败 Case,再决定是否换模型
把失败 Case 在你们内部存档(原文、请求时间、请求 ID、返回正文),定期分析拒答集中在哪类内容,再考虑对这部分内容改用其他模型重试。
流式请求的区别
流式请求一旦开始输出,就无法再切换线路,因此内容安全自动切换只对非流式请求生效。流式下你可能会看到:- 一句简短的拒答,最后一个事件的
finish_reason为content_filter; - 或者已经输出了一部分正文,最后以
finish_reason: "content_filter"结束。
常见问题
被拒答也会扣费吗?
被拒答也会扣费吗?
会。拒答是一次成功的调用,按实际输入、输出 tokens 正常计费,所以不建议对同一内容反复重试。
能关闭拒答吗?
能关闭拒答吗?
不能。拒答由原厂模型根据其使用政策决定,API易 无法关闭,也无法调整它的尺度。
同样的内容,为什么有时成功、有时被拒答?
同样的内容,为什么有时成功、有时被拒答?
模型的判断本身有一定随机性,不同官方线路的过滤尺度也不完全一致,所以边界附近的内容可能时而通过、时而被拒。明显违反使用政策的内容,基本会被稳定拒答。
怎样才能拿到拒答的类别?
怎样才能拿到拒答的类别?
OpenAI 的对话接口不返回类别。如果你的业务需要按类别处理,可以在请求前自行对内容做一次分类,或在失败 Case 存档后人工归类。
相关文档
响应数据处理
流式与非流式响应的统一解析方法
内容安全如何合规性?
平台内容安全与合规政策