OpenAI 偏离意图监控
偏离意图监控(misalignment monitoring)检查智能体在敏感数据传输、敏感数据访问、破坏性修改等后果较重的场景中,是否正确理解用户指令。系统异步检查模型推理与操作,发现潜在问题时可停止对话。
被标记表示相关操作需要审查,不证明用户违规或智能体违背指令。监控可能漏报,也可能标记合法活动,因此仍应采用应用保护措施,包括对重要操作要求人工批准。背景见帮助中心概览。
请求覆盖范围
对于此系统覆盖的模型,是否监控、能否自动停止,取决于 API 以及保存对话上下文的方式。
| 请求 | 行为 |
|---|---|
| 使用持久化推理、WebSockets 或 OpenAI 上下文压缩的 Responses 请求 | 会监控;可识别对话的后续请求并阻止继续执行。 |
| 不使用上述机制的 Responses 请求 | 会监控;配置的 webhook 可收到告警,但不会自动停止对话。 |
| Chat Completions 请求 | 不属于此监控系统的覆盖范围,其他安全检查仍适用。 |
上下文用法参见跨调用保留推理、WebSocket 模式和压缩。配置告警 webhook 不会启用自动停止。
处理已停止的请求
若在流开始前被拦截,API 返回 HTTP 403,错误类型为 invalid_request_error,代码为 misalignment_policy_violation。应匹配错误代码而非消息文本。流式应用还须处理读取流期间的错误,即使已经收到部分输出。
收到该错误后:
- 停止为受影响对话继续派发操作,不要自动重试被阻止的工作流。
- 按自己的数据处理政策保存请求与响应 ID、工具调用及应用记录。
- 向负责该任务的用户或操作人员展示可用错误信息,让其对照预期任务审查智能体行为以及已发生的变更。
API 没有通用的恢复此类已停止对话的方法。监控是异步的,发现问题前操作可能已经完成;停止请求不会撤销此前的操作。
接收项目安全告警
订阅 safety.alert.created,将 API 项目的监控告警送到团队自己的系统。接收告警不能替代 API 请求的错误处理。
为每个需要接收告警的项目创建 webhook 端点,并按 Webhooks 指南处理签名验证、确认接收、重试与重复投递。
Webhook 包含告警 ID,不包含告警详情:
来源示例 1(json):
中文说明:Webhook的data.id是告警ID,顶层id是事件ID;不包含完整告警详情。
{
"object": "event",
"id": "evt_123",
"type": "safety.alert.created",
"created_at": 1787659200,
"data": {
"id": "alert_0123456789abcdef0123456789abcdef"
}
}
验证并确认接收后,在后台检索告警。将示例 alert_0123456789abcdef0123456789abcdef 换成 webhook 的 data.id;事件的 id 是 webhook 事件 ID,不是告警 ID。API 密钥须获同一项目授权,并具有 api.safety.alerts.read 权限。
来源示例 2(bash):
## [中文] 以同一项目、具有api.safety.alerts.read权限的密钥,按webhook的data.id检索告警;request_paused不等于已撤销操作。
curl "https://api.openai.com/v1/safety/alerts/alert_0123456789abcdef0123456789abcdef" \
-H "Authorization: Bearer ${OPENAI_API_KEY}"
来源示例 3(javascript):
// [中文] 以同一项目、具有api.safety.alerts.read权限的密钥,按webhook的data.id检索告警;request_paused不等于已撤销操作。
// 把下方示例 ID 和 URL 换成你自己的资源值。
import OpenAI from "openai";
const client = new OpenAI();
const alertId = "alert_0123456789abcdef0123456789abcdef";
const alert = await client.safety.alerts.retrieve(alertId);
console.log(alert.error_type, alert.reason, alert.response_id);
来源示例 4(python):
## [中文] 以同一项目、具有api.safety.alerts.read权限的密钥,按webhook的data.id检索告警;request_paused不等于已撤销操作。
## 把下方示例 ID 和 URL 换成你自己的资源值。
from openai import OpenAI
client = OpenAI()
alert = client.safety.alerts.retrieve("alert_0123456789abcdef0123456789abcdef")
print(alert.error_type, alert.reason)
来源示例 5(go):
// [中文] 以同一项目、具有api.safety.alerts.read权限的密钥,按webhook的data.id检索告警;request_paused不等于已撤销操作。
// 把下方示例 ID 和 URL 换成你自己的资源值。
package main
import (
"context"
"fmt"
"github.com/openai/openai-go/v3"
)
func main() {
client := openai.NewClient()
alert, err := client.Safety.Alerts.Get(context.Background(), "alert_0123456789abcdef0123456789abcdef")
if err != nil {
panic(err)
}
fmt.Println(alert.ErrorType)
fmt.Println(alert.Reason)
fmt.Println(alert.RequestPaused)
}
来源示例 6(java):
// [中文] 以同一项目、具有api.safety.alerts.read权限的密钥,按webhook的data.id检索告警;request_paused不等于已撤销操作。
// 把下方示例 ID 和 URL 换成你自己的资源值。
import com.openai.models.safety.alerts.SafetyAlert;
SafetyAlert alert = client.safety().alerts().retrieve("alert_0123456789abcdef0123456789abcdef");
System.out.println(alert.errorType());
alert.reason().ifPresent(System.out::println);
System.out.println(alert.requestPaused());
来源示例 7(ruby):
## [中文] 以同一项目、具有api.safety.alerts.read权限的密钥,按webhook的data.id检索告警;request_paused不等于已撤销操作。
## 把下方示例 ID 和 URL 换成你自己的资源值。
require "openai"
client = OpenAI::Client.new
alert = client.safety.alerts.retrieve("alert_0123456789abcdef0123456789abcdef")
puts(alert.error_type)
puts(alert.reason)
puts(alert.request_paused)
通过返回的 request_id、response_id 在应用记录中定位任务。告警类别表示需要调查的问题。request_paused: true 仅表示成功登记安全阻止,不确认执行已经停止或先前操作已经撤销,仍须检查应用任务状态与工具记录。
reason 可以为 null,包括零数据保留(ZDR)请求。非空 reason 也是类别说明,不是对话记录或完整调查报告。按组织的数据政策保留所需记录;平台设置见数据控制。
若检索返回 404 safety_alert_not_found,检查告警 ID 和项目凭证。记录缺失、不可访问或不完整都可能产生该错误。告警投递和检索不构成完整审计历史。

TRAE-AI编程


更多建议: