你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

内容筛选概述

Azure OpenAI 包括与核心模型一起使用的内容筛选系统,包括图像生成模型。 此系统通过一组分类模型运行提示和完成工作,旨在检测和防止有害内容的输出。 内容筛选系统会在输入提示和输出补全中检测特定类别的潜在有害内容并对其采取措施。 API 配置和应用程序设计的变化可能会影响补全,从而影响筛选行为。

重要

内容过滤系统不应用于 Azure AI Foundry 模型中 Azure OpenAI 中的 Whisper 等音频模型处理的提示和补全。 详细了解 Azure OpenAI 中的音频模型

除了内容筛选系统外,Azure OpenAI 还会执行监视,以检测建议以违反适用产品条款的方式使用服务的内容和/或行为。 有关了解和缓解与应用程序相关的风险的详细信息,请参阅 Azure OpenAI 的透明度说明。 有关如何处理内容筛选和滥用监视的数据的详细信息,请参阅 Azure OpenAI 的数据、隐私和安全性

本节中的文章提供有关内容筛选类别、筛选严重性级别及其可配置性以及应用程序设计和实现中要考虑的 API 方案的信息。

注意

出于内容筛选的目的,不会存储任何提示或补全。 在未经你同意的情况下,不会使用任何提示或补全来训练、重新训练或改进内容筛选系统。 有关详细信息,请参阅 数据、隐私和安全性

内容筛选器类型

Azure OpenAI 中集成的内容筛选系统包含:

  • 用于检测和筛选有害内容的神经多类分类模型;这些模型涵盖了四个类别(仇恨、性、暴力和自残)的四个严重性级别(安全、低、中等、高)。 检测到的“安全”严重级别内容在注释中进行了标记,但不受筛选,也不可配置。
  • 其他可选分类模型,旨在检测越狱风险以及文本和代码的已知内容;这些模型是二进制分类器,用于标记用户或模型行为是否限定为越狱攻击或者与已知文本或源代码匹配。 这些模型的使用是可选的,但客户版权承诺范围可能需要使用受保护的材料代码模型。

筛选类别

下表汇总了 Azure OpenAI 的内容筛选系统支持的风险类别。

类别 说明
仇恨和公平性 与仇恨和公平相关的伤害是指任何基于个人或身份群体的某些区别性属性攻击或使用歧视性语言的内容。

这些属性包括但不限于:
  • 种族、民族、国籍
  • 性别认同群体和表现
  • 性取向
  • 宗教
  • 个人外貌和体型
  • 残疾状况
  • 骚扰和欺凌
性指的是与以下方面相关的语言:解剖器官和生殖器、恋爱关系与性行为、以色情或情爱用语描述的行为(包括被描述为攻击或违背个人意愿的强迫性暴力行为的情况)。 

 包括但不限于:
  • 粗俗内容
  • 卖淫
  • 裸体和色情
  • 滥用
  • 儿童剥削、儿童虐待、儿童色诱
暴力 暴力是指与旨在伤害、损伤、损害或杀害某人或某物的肢体动作相关的语言,以及与武器、枪支和相关实体相关的语言。

这包括但不限于:
  • 武器
  • 欺凌和恐吓
  • 恐怖主义和暴力极端主义
  • 跟踪
自我伤害 自残指的是与故意伤害、损伤、损害某人身体或自杀的身体行为相关的语言。

这包括但不限于:
  • 饮食障碍
  • 欺凌和恐吓
用户指令攻击行为 用户提示攻击是一种用户提示,目的是诱使生成式 AI 模型表现出其训练时要避免的行为,或者打破系统消息中所设定规则。 这种攻击涵盖从复杂的角色扮演到对安全目标的微妙破坏等各种形式。
间接攻击 间接攻击(也称为间接提示攻击或跨域提示注入攻击)是一种潜在的漏洞,其中第三方会将恶意指令置于生成式 AI 系统可以访问和处理的文档中。 需要文档嵌入和格式设置
有据性2 有据性检测指示大型语言模型 (LLM) 的文本响应是否以用户提供的源材料为依据。 无据性材料是指 LLM 生成的信息与源材料中的信息不符或不准确。 需要文档嵌入和格式设置
受保护的文本材料1 受保护的材料文本描述可由大型语言模型输出的已知文本内容(例如,歌词、文章、食谱和选定的网络内容)。
代码保护材料 受保护的材料代码描述与公共存储库中的一组源代码相匹配的源代码,这些源代码可由大型语言模型输出,而无需适当引用源存储库。

1 如果你是文本材料的所有者,并且想要提交文本内容以进行保护, 请提交请求

2 在非流式处理方案中不可用;仅适用于流式处理方案。 以下区域支持有据性检测:美国中部、美国东部、法国中部和加拿大东部

方案详细信息

当内容筛选系统检测到有害内容时,你将在 API 调用中收到错误消息(如果提示内容被视为不当内容);或者响应中的 finish_reason 将为 content_filter,以表示筛选掉了部分补全内容。 生成应用程序或系统时,你需要考虑到这些会对 Completions API 返回的内容进行筛选的情况,这种筛选可能会导致内容不完整。 如何处理这些信息将取决于具体的应用程序。 该行为可以概括为以下几点:

  • 分类为某个筛选类别和严重性级别的提示将返回 HTTP 400 错误。
  • 筛选内容时,非流式传输完成调用不会返回任何内容。 finish_reason 值设置为“content_filter”。 在极少数响应时间较长的情况下,可能会返回部分结果。 在这些情况下,会更新 finish_reason
  • 对于流式传输补全调用,段会在补全后返回给用户。 服务会继续进行流式处理,直到达到停止令牌、长度,或者检测到分类为某个筛选类别和严重性级别的内容。

场景:你发送了非流式处理补全调用,要求提供多个输出;没有分类为某个筛选类别和严重性级别的内容

下表概述了内容筛选可能出现的各种方式:

HTTP 响应代码 响应行为
200 在所有生成都通过配置的筛选器的情况下,不会将内容审核详细信息添加到响应中。 每个生成的 finish_reason 都将是 stop 或 length。

请求负载示例:

{
    "prompt":"Text example", 
    "n": 3,
    "stream": false
}

示例响应 JSON:

{
    "id": "example-id",
    "object": "text_completion",
    "created": 1653666286,
    "model": "davinci",
    "choices": [
        {
            "text": "Response generated text",
            "index": 0,
            "finish_reason": "stop",
            "logprobs": null
        }
    ]
}

场景:你的 API 调用请求多个响应 (N>1) 并至少有 1 个响应进行了筛选

HTTP 响应代码 响应行为
200 被筛选的生成将具有 finish_reasoncontent_filter

请求负载示例:

{
    "prompt":"Text example",
    "n": 3,
    "stream": false
}

示例响应 JSON:

{
    "id": "example",
    "object": "text_completion",
    "created": 1653666831,
    "model": "ada",
    "choices": [
        {
            "text": "returned text 1",
            "index": 0,
            "finish_reason": "length",
            "logprobs": null
        },
        {
            "text": "returned text 2",
            "index": 1,
            "finish_reason": "content_filter",
            "logprobs": null
        }
    ]
}

场景:将不恰当的输入提示发送到完成 API(用于流式传输或非流式传输)

HTTP 响应代码 响应行为
400 当提示按配置触发内容筛选器时,API 调用将失败。 修改提示,然后重试。

请求负载示例:

{
    "prompt":"Content that triggered the filtering model"
}

示例响应 JSON:

"error": {
    "message": "The response was filtered",
    "type": null,
    "param": "prompt",
    "code": "content_filter",
    "status": 400
}

场景:你进行了流式处理补全调用;没有分类为某个筛选类别和严重性级别的输出内容

HTTP 响应代码 响应行为
200 在这种情况下,调用以流式传输的方式返回整个生成,并且对于每个生成的响应,finish_reason 将是“length”或“stop”。

请求负载示例:

{
    "prompt":"Text example",
    "n": 3,
    "stream": true
}

示例响应 JSON:

{
    "id": "cmpl-example",
    "object": "text_completion",
    "created": 1653670914,
    "model": "ada",
    "choices": [
        {
            "text": "last part of generation",
            "index": 2,
            "finish_reason": "stop",
            "logprobs": null
        }
    ]
}

场景:你进行了流式处理补全调用,要求提供多份补全内容,并且至少筛选掉了部分输出内容

HTTP 响应代码 响应行为
200 对于给定的生成索引,生成的最后一个区块会包含一个非 null 的 finish_reason 值。 筛选生成时,该值为 content_filter

请求负载示例:

{
    "prompt":"Text example",
    "n": 3,
    "stream": true
}

示例响应 JSON:

 {
    "id": "cmpl-example",
    "object": "text_completion",
    "created": 1653670515,
    "model": "ada",
    "choices": [
        {
            "text": "Last part of generated text streamed back",
            "index": 2,
            "finish_reason": "content_filter",
            "logprobs": null
        }
    ]
}

场景:内容筛选系统未在补全内容上运行

HTTP 响应代码 响应行为
200 如果内容筛选系统出现故障或无法及时完成操作,请求仍将在不经过内容筛选的情况下完成。 可以通过在 content_filter_results 对象中查找错误消息,来确认筛选是否未被应用。

请求负载示例:

{
    "prompt":"Text example",
    "n": 1,
    "stream": false
}

示例响应 JSON:

{
    "id": "cmpl-example",
    "object": "text_completion",
    "created": 1652294703,
    "model": "ada",
    "choices": [
        {
            "text": "generated text",
            "index": 0,
            "finish_reason": "length",
            "logprobs": null,
            "content_filter_results": {
                "error": {
                    "code": "content_filter_error",
                    "message": "The contents are not filtered"
                }
            }
        }
    ]
}

最佳实践

在应用程序的设计中,请考虑以下最佳做法,以提供积极的应用程序体验,同时最大程度地减少潜在危害:

  • 确定您希望如何处理用户发送的提示中包含被过滤的类别和严重性级别的内容或以其他方式滥用应用程序的情形。
  • 检查 finish_reason 以查看是否已完成筛选。
  • 检查 content_filter_results 中是否没有错误对象(表示未运行内容筛选)。
  • 如果在注释模式下使用受保护的材料代码模型,请在应用程序中显示代码时显示引文 URL。