Share via


콘텐츠 필터링

Important

콘텐츠 필터링 시스템은 Azure OpenAI Service의 Whisper 모델에서 처리하는 프롬프트 및 완료에는 적용되지 않습니다. Azure OpenAI의 Whisper 모델에 대해 자세히 알아봅니다.

Azure OpenAI Service에는 DALL-E 이미지 생성 모델을 포함한 핵심 모델과 함께 작동하는 콘텐츠 필터링 시스템이 포함되어 있습니다. 이 시스템은 유해한 콘텐츠의 출력을 탐지하고 방지하기 위한 분류 모델의 앙상블을 통해 프롬프트와 완료를 모두 실행하여 작동합니다. 콘텐츠 필터링 시스템은 입력 프롬프트와 출력 완료 모두에서 잠재적으로 유해한 콘텐츠의 특정 범주를 탐지하고 조치를 취합니다. API 구성 및 애플리케이션 디자인의 변형은 완료 및 필터링 동작에 영향을 미칠 수 있습니다.

증오, 성적, 폭력 및 자해 범주에 대한 콘텐츠 필터링 모델은 영어, 독일어, 일본어, 스페인어, 프랑스어, 이탈리아어, 포르투갈어 및 중국어에서 특별히 학습되고 테스트되었습니다. 그러나 서비스는 다른 여러 언어로도 작동할 수 있지만 품질은 다를 수 있습니다. 모든 경우에 애플리케이션에 적합한지 확인하기 위해 자체 테스트를 수행해야 합니다.

콘텐츠 필터링 시스템 외에도 Azure OpenAI Service는 모니터링을 수행하여 해당 제품 조건을 위반할 수 있는 방식으로 서비스 사용을 제안하는 콘텐츠 및/또는 동작을 검색합니다. 애플리케이션과 관련된 위험을 이해하고 완화하는 방법에 대한 자세한 내용은 Azure OpenAI에 대한 투명성 참고 사항을 참조하세요. 콘텐츠 필터링 및 남용 모니터링을 위해 데이터가 처리되는 방식에 대한 자세한 내용은 Azure OpenAI Service의 데이터, 개인 정보 보호 및 보안을 참조하세요.

다음 섹션에서는 애플리케이션 설계 및 구현에서 고려해야 할 콘텐츠 필터링 범주, 필터링 심각도 수준 및 구성 가능성, API 시나리오에 대한 정보를 제공합니다.

콘텐츠 필터링 범주

Azure OpenAI Service에 통합된 콘텐츠 필터링 시스템에는 다음이 포함됩니다.

  • 유해한 콘텐츠를 검색하고 필터링하는 것을 목표로 하는 인공신경망 다중 클래스 분류 모델 모델은 4가지 심각도 수준(안전, 낮음, 중간, 높음)에 걸쳐 4가지 범주(증오, 성적, 폭력, 자해)를 다룹니다. '안전' 심각도 수준에서 탐지된 콘텐츠는 주석에 레이블이 지정되지만 필터링 대상이 아니며 구성할 수 없습니다.
  • 탈옥 위험과 알려진 텍스트 및 코드 콘텐츠를 검색하기 위한 기타 선택적 분류 모델, 이러한 모델은 사용자 또는 모델 동작이 탈옥 공격에 해당하는지 또는 알려진 텍스트 또는 소스 코드와 일치하는지 여부를 표시하는 이진 분류자입니다. 이러한 모델의 사용은 선택 사항이지만 고객 저작권 약정 적용 범위에는 보호된 자료 코드 모델을 사용해야 할 수 있습니다.

위험 범주

범주 설명
증오와 공정성 증오와 공정성 관련 피해는 인종, 민족, 국적, 성 정체성 그룹 및 표현, 성적 지향, 종교, 이민 신분, 능력 상태, 개인 외모 및 신체 크기를 포함하지만 이에 국한되지 않는 이러한 그룹의 특정 차별화 특성에 근거하여 개인 또는 ID 그룹을 참조하여 조롱적이거나 차별적인 언어를 사용하거나 공격하는 모든 콘텐츠를 가리킵니다. 

공정성은 AI 시스템이 기존의 사회적 불평등에 기여하지 않고 모든 집단의 사람들을 공평하게 대우하도록 보장하는 것과 관련이 있습니다. 불쾌한 표현과 마찬가지로 공정성 관련 피해는 ID 그룹의 이질적인 대우에 달려 있습니다.  
성적 성적 범주는 해부학적 기관 및 생식기와 관련된 언어, 낭만적인 관계, 에로틱하거나 애정 어린 용어로 묘사된 행위, 임신, 신체적 성행위(자신의 의지에 반하는 폭행 또는 강제 성폭력 행위로 묘사되는 행위 포함), 매춘, 음란물 및 학대를 의미합니다.  
폭력 폭력이란 누군가 또는 사물을 해치거나 손상시키거나 죽이려는 의도의 신체적 행동과 관련된 언어를 말합니다. 무기, 총기 및 관련 단체(제조업체, 협회, 법률 등)를 설명합니다.
자해 자해란 의도적으로 자신의 신체를 다치게 하거나 손상시키거나 자살하려는 의도를 지닌 신체적 행동과 관련된 언어를 말합니다.
텍스트용 보호 자료* 보호 자료 텍스트는 대규모 언어 모델에서 출력할 수 있는 알려진 텍스트 콘텐츠(예: 노래 가사, 문서, 조리법 및 선택한 웹 콘텐츠)를 설명합니다.
코드용 보호 자료 보호 자료 코드는 공용 리포지토리의 소스 코드 집합과 일치하는 소스 코드를 설명하며, 원본 리포지토리를 적절하게 인용하지 않고도 대규모 언어 모델로 출력할 수 있습니다.

* 사용자가 텍스트 자료의 소유자이고 보호를 위해 텍스트 콘텐츠를 제출하려면 요청을 제출하세요.

Prompt Shields

Type 설명
탈옥 공격에 대한 프롬프트 쉴드 탈옥 공격은 생성형 AI 모델이 시스템 메시지에 설정된 규칙을 피하거나 위반하도록 학습된 동작을 나타내도록 유도하도록 설계된 사용자 프롬프트입니다. 이러한 공격은 복잡한 역할극부터 안전 목표를 교묘하게 전복하는 것까지 다양합니다.
간접 공격에 대한 프롬프트 쉴드 간접 프롬프트 공격 또는 교차 도메인 프롬프트 주입 공격이라고도 하는 간접 공격은 제3자가 생성형 AI 시스템이 액세스하고 처리할 수 있는 문서 내부에 악의적인 지침을 기입하는 잠재적인 취약성입니다. 문서 포함 및 서식 지정이 필요합니다.

텍스트 콘텐츠

Warning

이 문서의 심각도 정의 탭에는 일부 읽기 권한자에게 불편을 줄 수 있는 유해 콘텐츠의 예가 포함되어 있습니다.

이미지 콘텐츠

Warning

이 문서의 심각도 정의 탭에는 일부 읽기 권한자에게 불편을 줄 수 있는 유해 콘텐츠의 예가 포함되어 있습니다.

구성 가능성(미리보기)

GPT 모델 시리즈의 기본 콘텐츠 필터링 구성은 4가지 콘텐츠 유해성 범주(혐오, 폭력, 성적인 내용, 자해) 모두에 대한 중간 심각도 임계값에서 필터링하도록 설정되며 프롬프트(텍스트, 다중 모달 텍스트/이미지) 및 완성(텍스트) 모두에 적용됩니다. 즉, 심각도 수준이 중간 또는 높음으로 탐지된 콘텐츠는 필터링되지만 심각도 수준이 낮음으로 탐지된 콘텐츠는 콘텐츠 필터로 필터링되지 않습니다. DALL-E의 경우 프롬프트(텍스트) 및 완성(이미지) 모두에 대해 기본 심각도 임계값이 낮게 설정되므로 심각도 수준이 낮음, 중간, 높음으로 감지된 콘텐츠가 필터링됩니다. 구성 기능은 미리 보기로 제공되며 고객은 프롬프트와 완성에 대해 별도로 설정을 조정하여 아래 표에 설명된 대로 다양한 심각도 수준에서 각 콘텐츠 범주에 대한 콘텐츠를 필터링할 수 있습니다.

심각도 필터링됨 프롬프트에 대해 구성 가능 완료를 위해 구성 가능 설명
낮음, 보통, 높음 가장 엄격한 필터링 구성. 심각도 수준 낮음, 중간, 높음에서 탐지된 콘텐츠는 필터링됩니다.
중간, 높음 심각도 수준이 낮음에서 검색된 콘텐츠는 필터링되지 않으며, 중간 및 높음의 콘텐츠는 필터링됩니다.
높음 승인된 경우1 승인된 경우1 심각도 수준 낮음 및 보통에서 탐지된 콘텐츠는 필터링되지 않습니다. 심각도 수준이 높은 콘텐츠만 필터링됩니다. 승인 필요1.
필터 없음 승인된 경우1 승인된 경우1 탐지된 심각도 수준에 관계없이 콘텐츠가 필터링되지 않습니다. 승인 필요1.

1 Azure OpenAI 모델의 경우 수정된 콘텐츠 필터링이 승인된 고객만 심각도 수준이 높은 콘텐츠 필터만 구성하거나 콘텐츠 필터를 끄는 등 전체 콘텐츠 필터링 제어 권한을 갖습니다. 다음 양식을 통해 수정된 콘텐츠 필터를 신청하세요. Azure OpenAI 제한된 액세스 검토: 수정된 콘텐츠 필터 및 남용 모니터링(microsoft.com)

이 미리 보기 기능은 다음 Azure OpenAI 모델에 사용할 수 있습니다.

  • GPT 모델 시리즈(텍스트)
  • GPT-4 Turbo Vision 2024-04-09(다중 모드 텍스트/이미지)
  • DALL-E 2 및 3(이미지)

콘텐츠 필터링 구성은 Azure AI Studio의 리소스 내에서 생성되며 배포와 연결될 수 있습니다. 여기에서 구성 가능성에 대해 자세히 알아보세요.

고객은 Azure OpenAI를 통합하는 애플리케이션이 사용 규정을 준수하는지 확인할 책임이 있습니다.

시나리오 정보

콘텐츠 필터링 시스템이 유해한 콘텐츠를 탐지하면 프롬프트가 부적절하다고 간주되면 API 호출에 오류가 표시되거나 응답의 finish_reasoncontent_filter가 되어 일부 완료가 필터링되었음을 나타냅니다. 애플리케이션이나 시스템을 구축할 때 Completions API에서 반환된 콘텐츠가 필터링되어 콘텐츠가 불완전해질 수 있는 시나리오를 고려해야 합니다. 이 정보에 대한 조치는 애플리케이션에 따라 다릅니다. 동작은 다음과 같이 요약될 수 있습니다.

  • 필터링된 범주 및 심각도 수준에서 분류되는 프롬프트는 HTTP 400 오류를 반환합니다.
  • 비 스트리밍 완료 호출은 콘텐츠가 필터링될 때 콘텐츠를 반환하지 않습니다. finish_reason 값은 content_filter로 설정됩니다. 드물지만 긴 응답의 경우 부분적인 결과가 반환될 수 있습니다. 이러한 경우 finish_reason이 업데이트됩니다.
  • 스트리밍 완료 호출의 경우 세그먼트가 완료되면 사용자에게 다시 반환됩니다. 서비스는 중지 토큰, 길이에 도달하거나 필터링된 범주 및 심각도 수준으로 분류된 콘텐츠가 탐지될 때까지 스트리밍을 계속합니다.

시나리오: 여러 출력을 요청하는 비스트리밍 완료 호출을 보냅니다. 필터링된 범주 및 심각도 수준으로 분류된 콘텐츠가 없습니다.

아래 표에는 콘텐츠 필터링이 표시될 수 있는 다양한 방법이 요약되어 있습니다.

HTTP 응답 코드 응답 동작
200 모든 세대가 구성된 필터를 통과하는 경우 콘텐츠 조정 세부 정보가 응답에 추가되지 않습니다. 각 세대의 finish_reason은 중지 또는 길이입니다.

요청 페이로드 예:

{
    "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)을 요청하고 응답 중 하나 이상이 필터링됨

HTTP 응답 코드 응답 동작
200 필터링된 세대는 content_filterfinish_reason 값을 갖습니다.

요청 페이로드 예:

{
    "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은 '길이' 또는 '중지'가 됩니다.

요청 페이로드 예:

{
    "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_result 개체에서 오류 메시지를 찾아 필터링이 적용되지 않았음을 확인할 수 있습니다.

요청 페이로드 예:

{
    "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_result": {
                "error": {
                    "code": "content_filter_error",
                    "message": "The contents are not filtered"
                }
            }
        }
    ]
}

주석

콘텐츠 필터

아래 코드 조각과 같이 주석이 사용하도록 설정되면 범주(증오와 공정성, 성적, 폭력, 자해)에 대해 API를 통해 다음 정보가 반환됩니다.

  • 콘텐츠 필터링 범주(증오, 성적, 폭력, 자해)
  • 각 콘텐츠 범주 내 심각도 수준(안전, 낮음, 중간 또는 높음)
  • 필터링 상태(true 또는 false).

옵션 모델

선택적 모델은 주석(콘텐츠에 플래그가 지정되었지만 필터링되지 않은 경우 정보를 반환) 또는 필터 모드(콘텐츠에 플래그가 지정되고 필터링된 경우 정보 반환)에서 사용하도록 설정할 수 있습니다.

아래 코드 조각에 표시된 대로 주석이 사용하도록 설정되면 선택적 모델에 대한 API에서 다음 정보가 반환됩니다.

모델 출력
탈옥 검색됨(true 또는 false),
필터링됨(true 또는 false)
간접적인 공격 검색됨(true 또는 false),
필터링됨(true 또는 false)
보호 재질 텍스트 검색됨(true 또는 false),
필터링됨(true 또는 false)
보호 재질 코드 검색됨(true 또는 false),
필터링됨(true 또는 false),
코드 조각이 검색된 공용 GitHub 리포지토리 인용 예,
리포지토리 라이선스

애플리케이션에 코드를 표시할 때 애플리케이션이 주석의 예 인용도 표시하는 것이 좋습니다. 고객 저작권 약정 적용 범위에는 인용된 라이선스를 준수해야 할 수도 있습니다.

각 API 버전의 주석 가용성은 다음 표를 참조하세요.

범주 2024-02-01 GA 2024-04-01-preview 2023-10-01-preview 2023-06-01-preview
증오
폭력
성적
자신에게 피해
탈옥 공격에 대한 프롬프트 쉴드
간접 공격에 대한 프롬프트 쉴드
보호 재질 텍스트
보호 재질 코드
욕설 차단 목록
사용자 지정 차단 목록
# os.getenv() for the endpoint and key assumes that you are using environment variables.

import os
from openai import AzureOpenAI
client = AzureOpenAI(
    api_key=os.getenv("AZURE_OPENAI_API_KEY"),  
    api_version="2024-03-01-preview",
    azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT") 
    )

response = client.completions.create(
    model="gpt-35-turbo-instruct", # model = "deployment_name".
    prompt="{Example prompt where a severity level of low is detected}" 
    # Content that is detected at severity level medium or high is filtered, 
    # while content detected at severity level low isn't filtered by the content filters.
)

print(response.model_dump_json(indent=2))

출력

{ 
  "choices": [ 
    { 
      "content_filter_results": { 
        "hate": { 
          "filtered": false, 
          "severity": "safe" 
        }, 
        "protected_material_code": { 
          "citation": { 
            "URL": " https://github.com/username/repository-name/path/to/file-example.txt", 
            "license": "EXAMPLE-LICENSE" 
          }, 
          "detected": true,
          "filtered": false 
        }, 
        "protected_material_text": { 
          "detected": false, 
          "filtered": false 
        }, 
        "self_harm": { 
          "filtered": false, 
          "severity": "safe" 
        }, 
        "sexual": { 
          "filtered": false, 
          "severity": "safe" 
        }, 
        "violence": { 
          "filtered": false, 
          "severity": "safe" 
        } 
      }, 
      "finish_reason": "stop", 
      "index": 0, 
      "message": { 
        "content": "Example model response will be returned ", 
        "role": "assistant" 
      } 
    } 
  ], 
  "created": 1699386280, 
  "id": "chatcmpl-8IMI4HzcmcK6I77vpOJCPt0Vcf8zJ", 
  "model": "gpt-35-turbo-instruct", 
  "object": "text.completion",
  "usage": { 
    "completion_tokens": 40, 
    "prompt_tokens": 11, 
    "total_tokens": 417 
  },  
  "prompt_filter_results": [ 
    { 
      "content_filter_results": { 
        "hate": { 
          "filtered": false, 
          "severity": "safe" 
        }, 
        "jailbreak": { 
          "detected": false, 
          "filtered": false 
        }, 
        "profanity": { 
          "detected": false, 
          "filtered": false 
        }, 
        "self_harm": { 
          "filtered": false, 
          "severity": "safe" 
        }, 
        "sexual": { 
          "filtered": false, 
          "severity": "safe" 
        }, 
        "violence": { 
          "filtered": false, 
          "severity": "safe" 
        } 
      }, 
      "prompt_index": 0 
    } 
  ]
} 

Azure OpenAI용 추론 REST API 엔드포인트와 채팅 및 완성을 생성하는 방법에 대한 자세한 내용은 Azure OpenAI Service REST API 참조 지침을 따르세요. GA API 버전 2024-02-01뿐만 아니라 2023-06-01-preview부터 시작하는 미리 보기 API 버전을 사용하는 경우 모든 시나리오에 대해 주석이 반환됩니다.

예제 시나리오: 필터링된 범주 및 심각도 수준으로 분류된 콘텐츠가 포함된 입력 프롬프트가 완성 API로 전송됩니다.

{
    "error": {
        "message": "The response was filtered due to the prompt triggering Azure Content management policy. 
                   Please modify your prompt and retry. To learn more about our content filtering policies
                   please read our documentation: https://go.microsoft.com/fwlink/?linkid=21298766",
        "type": null,
        "param": "prompt",
        "code": "content_filter",
        "status": 400,
        "innererror": {
            "code": "ResponsibleAIPolicyViolation",
            "content_filter_result": {
                "hate": {
                    "filtered": true,
                    "severity": "high"
                },
                "self-harm": {
                    "filtered": true,
                    "severity": "high"
                },
                "sexual": {
                    "filtered": false,
                    "severity": "safe"
                },
                "violence": {
                    "filtered":true,
                    "severity": "medium"
                }
            }
        }
    }
}

프롬프트에 문서 포함

Azure OpenAI의 책임 있는 AI 측정값의 핵심 양상은 콘텐츠 보안 시스템입니다. 이 시스템은 핵심 GPT 모델과 함께 실행되어 모델 입력 및 출력의 불규칙성을 모니터링합니다. 시스템 입력, 사용자 입력, AI 도우미의 출력과 같은 프롬프트의 다양한 요소를 구별할 수 있으면 성능이 개선됩니다.

향상된 검색 기능을 위해서는 다음 권장 방법에 따라 프롬프트 형식을 지정해야 합니다.

채팅 완료 API

채팅 완료 API는 정의에 따라 구성됩니다. 이는 각각 할당된 역할이 있는 메시지 목록으로 구성됩니다.

보안 시스템은 이 구조화된 형식을 구문 분석하고 다음 동작을 적용합니다.

  • 최신 "사용자" 콘텐츠에서 다음과 같은 RAI 위험 범주가 검색됩니다.
    • 증오
    • 성적
    • 폭력
    • 자해
    • 탈옥(선택 사항)

다음은 메시지 배열의 예입니다.

{"role": "system", "content": "Provide some context and/or instructions to the model."}, 
{"role": "user", "content": "Example question goes here."}, 
{"role": "assistant", "content": "Example answer goes here."}, 
{"role": "user", "content": "First question/message for the model to actually respond to."} 

프롬프트에 문서 포함

Azure OpenAI는 마지막 사용자 콘텐츠 검색 외에도 Prompt Shields(간접 프롬프트 공격 검색)를 통해 컨텍스트 문서 내의 특정 위험 검색도 지원합니다. 다음 문서 구분 기호를 사용하여 문서(예: 검색된 웹 사이트, 이메일 등)인 입력 부분을 식별해야 합니다.

<documents> 
*insert your document content here* 
</documents>

그렇게 하면 태그가 지정된 문서를 검색하는 데 다음 옵션을 사용할 수 있습니다.

  • 태그가 지정된 각 "문서" 콘텐츠에서 다음 범주를 검색합니다.
    • 간접 공격(선택 사항)

다음은 채팅 완료 메시지 배열의 예입니다.

{"role": "system", "content": "Provide some context and/or instructions to the model, including document context. \"\"\" <documents>\n*insert your document content here*\n<\\documents> \"\"\""}, 

{"role": "user", "content": "First question/message for the model to actually respond to."} 

JSON 이스케이프

검색을 위해 검증되지 않은 문서에 태그를 지정하는 경우 Azure OpenAI 보안 시스템에서 성공적인 구문 분석을 보장하기 위해 문서 콘텐츠를 JSON으로 이스케이프해야 합니다.

예를 들어, 다음 이메일 본문을 참조하세요.

Hello Josè, 

I hope this email finds you well today.

JSON 이스케이프를 사용하면 다음과 같습니다.

Hello Jos\u00E9,\nI hope this email finds you well today. 

채팅 완료 컨텍스트에서 이스케이프된 텍스트는 다음과 같습니다.

{"role": "system", "content": "Provide some context and/or instructions to the model, including document context. \"\"\" <documents>\n Hello Jos\\u00E9,\\nI hope this email finds you well today. \n<\\documents> \"\"\""}, 

{"role": "user", "content": "First question/message for the model to actually respond to."}

콘텐츠 스트리밍

이 섹션에서는 Azure OpenAI 콘텐츠 스트리밍 환경 및 옵션에 대해 설명합니다. 고객은 확인된 콘텐츠 청크가 콘텐츠 필터를 통과할 때까지 기다리는 대신 생성된 API에서 콘텐츠를 받을 수 있는 옵션이 있습니다.

기본값

콘텐츠 필터링 시스템은 통합되어 있으며 모든 고객에 대해 기본적으로 사용하도록 설정되어 있습니다. 기본 스트리밍 시나리오에서는 완료 콘텐츠가 버퍼링되고, 콘텐츠 필터링 시스템이 버퍼링된 콘텐츠에서 실행되며, 콘텐츠 필터링 구성에 따라 콘텐츠가 콘텐츠 필터링 정책(Microsoft의 기본 또는 사용자 지정 사용자 구성)을 위반하지 않는 경우 사용자에게 반환됩니다. 또는 유해한 완료 콘텐츠를 반환하지 않고 즉시 차단되고 콘텐츠 필터링 오류를 반환합니다. 이 과정은 스트림이 끝날 때까지 반복됩니다. 콘텐츠는 사용자에게 반환되기 전에 콘텐츠 필터링 정책에 따라 완전히 검사됩니다. 이 경우 콘텐츠는 토큰별로 반환되지 않고 해당 버퍼 크기의 "콘텐츠 청크"로 반환됩니다.

비동기 필터

고객은 비동기 필터를 추가 옵션으로 선택하여 새로운 스트리밍 환경을 제공할 수 있습니다. 이 경우 콘텐츠 필터는 비동기식으로 실행되고 완료 콘텐츠는 원활한 토큰별 스트리밍 환경을 통해 즉시 반환됩니다. 콘텐츠가 버퍼링되지 않으므로 대기 시간이 없이 빠른 콘텐츠 보안 관련 스트리밍 환경이 가능합니다.

고객은 이 기능이 대기 시간을 개선하지만 모델 출력의 더 작은 섹션에 대한 안전 및 실시간 조사와 상충된다는 점을 알아야 합니다. 콘텐츠 필터는 비동기식으로 실행되기 때문에 콘텐츠 조정 메시지와 정책 위반 신호가 지연됩니다. 즉, 즉시 필터링되었을 유해 콘텐츠의 일부 섹션이 사용자에게 표시될 수 있습니다.

주석: 스트림 중에 주석과 콘텐츠 조정 메시지가 지속적으로 반환됩니다. 앱에서 주석을 사용하고 콘텐츠 수정 또는 사용자에게 추가 안전 정보 반환과 같은 추가 AI 콘텐츠 안전 메커니즘을 구현하는 것이 좋습니다.

콘텐츠 필터링 신호: 콘텐츠 필터링 오류 신호가 지연됩니다. 정책 위반의 경우 사용 가능한 즉시 반환되고 스트림이 중단됩니다. 콘텐츠 필터링 신호는 정책 위반 콘텐츠의 최대 1,000자 범위 내에서 보장됩니다.

고객 저작권 약속: 소급하여 보호 재질로 표시된 콘텐츠는 고객 저작권 약속을 받을 수 없습니다.

Azure OpenAI Studio에서 비동기 필터를 사용하도록 설정하려면 콘텐츠 필터 방법 가이드에 따라 새 콘텐츠 필터링 구성을 만들고 스트리밍 섹션에서 비동기 필터를 선택합니다.

콘텐츠 필터링 모드 비교

비교 스트리밍 - 기본값 스트리밍 - 비동기 필터
상태 GA 공개 미리 보기
자격 모든 고객 수정된 콘텐츠 필터링이 승인된 고객
사용 방법 기본적으로 사용하도록 설정되어 있으므로 작업이 필요하지 않습니다. 수정된 콘텐츠 필터링이 승인된 고객은 Azure OpenAI Studio에서 직접 구성할 수 있습니다(콘텐츠 필터링 구성의 일부로 배포 수준에서 적용됨).
양식 및 가용성 텍스트, 모든 GPT 모델 텍스트, gpt-4-vision을 제외한 모든 GPT 모델
스트리밍 환경 콘텐츠가 버퍼링되어 청크로 반환됩니다. 대기 시간 없음(버퍼링 없음, 필터가 비동기식으로 실행됨)
콘텐츠 필터링 신호 즉시 필터링 신호 지연 필터링 신호(최대 1,000자 단위)
콘텐츠 필터링 구성 기본 및 고객 정의 필터 설정 지원(옵션 모델 포함) 기본 및 고객 정의 필터 설정 지원(옵션 모델 포함)

주석 및 샘플 응답

프롬프트 주석 메시지

이는 기본 주석과 동일합니다.

data: { 
    "id": "", 
    "object": "", 
    "created": 0, 
    "model": "", 
    "prompt_filter_results": [ 
        { 
            "prompt_index": 0, 
            "content_filter_results": { ... } 
        } 
    ], 
    "choices": [], 
    "usage": null 
} 

완료 토큰 메시지

완료 메시지는 즉시 전달됩니다. 먼저 조정이 수행되지 않으며 처음에는 주석이 제공되지 않습니다.

data: { 
    "id": "chatcmpl-7rAJvsS1QQCDuZYDDdQuMJVMV3x3N", 
    "object": "chat.completion.chunk", 
    "created": 1692905411, 
    "model": "gpt-35-turbo", 
    "choices": [ 
        { 
            "index": 0, 
            "finish_reason": null, 
            "delta": { 
                "content": "Color" 
            } 
        } 
    ], 
    "usage": null 
} 

주석 메시지

텍스트 필드는 항상 새 토큰이 없음을 나타내는 빈 문자열입니다. 주석은 이미 전송된 토큰에만 관련됩니다. 동일한 토큰을 참조하는 주석 메시지가 여러 개 있을 수 있습니다.

"start_offset""end_offset"는 주석이 관련된 텍스트를 표시하기 위한 텍스트의 낮은 세분성 오프셋(프롬프트 시작 부분에 0 포함)입니다.

"check_offset"는 완전히 조정된 텍스트의 양을 나타냅니다. 이는 향후 주석의 "end_offset" 값에 대한 배타적인 하한입니다. 감소하지 않습니다.

data: { 
    "id": "", 
    "object": "", 
    "created": 0, 
    "model": "", 
    "choices": [ 
        { 
            "index": 0, 
            "finish_reason": null, 
            "content_filter_results": { ... }, 
            "content_filter_raw": [ ... ], 
            "content_filter_offsets": { 
                "check_offset": 44, 
                "start_offset": 44, 
                "end_offset": 198 
            } 
        } 
    ], 
    "usage": null 
} 

샘플 응답 스트림(필터 통과)

아래는 Asynchronous Filter를 사용한 실제 채팅 완료 응답입니다. 프롬프트 주석이 변경되지 않고, 완료 토큰이 주석 없이 전송되고, 새 주석 메시지가 토큰 없이 전송되는 방식에 유의해야 합니다. 대신 특정 콘텐츠 필터 오프셋과 연결됩니다.

{"temperature": 0, "frequency_penalty": 0, "presence_penalty": 1.0, "top_p": 1.0, "max_tokens": 800, "messages": [{"role": "user", "content": "What is color?"}], "stream": true}

data: {"id":"","object":"","created":0,"model":"","prompt_annotations":[{"prompt_index":0,"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}}}],"choices":[],"usage":null} 

data: {"id":"chatcmpl-7rCNsVeZy0PGnX3H6jK8STps5nZUY","object":"chat.completion.chunk","created":1692913344,"model":"gpt-35-turbo","choices":[{"index":0,"finish_reason":null,"delta":{"role":"assistant"}}],"usage":null} 

data: {"id":"chatcmpl-7rCNsVeZy0PGnX3H6jK8STps5nZUY","object":"chat.completion.chunk","created":1692913344,"model":"gpt-35-turbo","choices":[{"index":0,"finish_reason":null,"delta":{"content":"Color"}}],"usage":null} 

data: {"id":"chatcmpl-7rCNsVeZy0PGnX3H6jK8STps5nZUY","object":"chat.completion.chunk","created":1692913344,"model":"gpt-35-turbo","choices":[{"index":0,"finish_reason":null,"delta":{"content":" is"}}],"usage":null} 

data: {"id":"chatcmpl-7rCNsVeZy0PGnX3H6jK8STps5nZUY","object":"chat.completion.chunk","created":1692913344,"model":"gpt-35-turbo","choices":[{"index":0,"finish_reason":null,"delta":{"content":" a"}}],"usage":null} 

... 

data: {"id":"","object":"","created":0,"model":"","choices":[{"index":0,"finish_reason":null,"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"content_filter_offsets":{"check_offset":44,"start_offset":44,"end_offset":198}}],"usage":null} 

... 

data: {"id":"chatcmpl-7rCNsVeZy0PGnX3H6jK8STps5nZUY","object":"chat.completion.chunk","created":1692913344,"model":"gpt-35-turbo","choices":[{"index":0,"finish_reason":"stop","delta":{}}],"usage":null} 

data: {"id":"","object":"","created":0,"model":"","choices":[{"index":0,"finish_reason":null,"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"content_filter_offsets":{"check_offset":506,"start_offset":44,"end_offset":571}}],"usage":null} 

data: [DONE] 

샘플 응답 스트림(필터로 차단됨)

{"temperature": 0, "frequency_penalty": 0, "presence_penalty": 1.0, "top_p": 1.0, "max_tokens": 800, "messages": [{"role": "user", "content": "Tell me the lyrics to \"Hey Jude\"."}], "stream": true}

data: {"id":"","object":"","created":0,"model":"","prompt_filter_results":[{"prompt_index":0,"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}}}],"choices":[],"usage":null} 

data: {"id":"chatcmpl-8JCbt5d4luUIhYCI7YH4dQK7hnHx2","object":"chat.completion.chunk","created":1699587397,"model":"gpt-35-turbo","choices":[{"index":0,"finish_reason":null,"delta":{"role":"assistant"}}],"usage":null} 

data: {"id":"chatcmpl-8JCbt5d4luUIhYCI7YH4dQK7hnHx2","object":"chat.completion.chunk","created":1699587397,"model":"gpt-35-turbo","choices":[{"index":0,"finish_reason":null,"delta":{"content":"Hey"}}],"usage":null} 

data: {"id":"chatcmpl-8JCbt5d4luUIhYCI7YH4dQK7hnHx2","object":"chat.completion.chunk","created":1699587397,"model":"gpt-35-turbo","choices":[{"index":0,"finish_reason":null,"delta":{"content":" Jude"}}],"usage":null} 

data: {"id":"chatcmpl-8JCbt5d4luUIhYCI7YH4dQK7hnHx2","object":"chat.completion.chunk","created":1699587397,"model":"gpt-35-turbo","choices":[{"index":0,"finish_reason":null,"delta":{"content":","}}],"usage":null} 

... 

data: {"id":"chatcmpl-8JCbt5d4luUIhYCI7YH4dQK7hnHx2","object":"chat.completion.chunk","created":1699587397,"model":"gpt-35- 

turbo","choices":[{"index":0,"finish_reason":null,"delta":{"content":" better"}}],"usage":null} 

data: {"id":"","object":"","created":0,"model":"","choices":[{"index":0,"finish_reason":null,"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"content_filter_offsets":{"check_offset":65,"start_offset":65,"end_offset":1056}}],"usage":null} 

data: {"id":"","object":"","created":0,"model":"","choices":[{"index":0,"finish_reason":"content_filter","content_filter_results":{"protected_material_text":{"detected":true,"filtered":true}},"content_filter_offsets":{"check_offset":65,"start_offset":65,"end_offset":1056}}],"usage":null} 

data: [DONE] 

Important

프롬프트에 대해 콘텐츠 필터링이 트리거되고 응답의 일부로 "status": 400이 수신되면 서비스에서 프롬프트를 평가했기 때문에 이 요청에 대한 요금이 청구됩니다. "finish_reason": "content_filter"와 함께 "status":200이 수신되면 요금도 청구됩니다. 이 경우 프롬프트에는 문제가 없었지만 모델에서 생성된 완료가 콘텐츠 필터링 규칙을 위반한 것으로 검색되어 완료가 필터링되었습니다.

모범 사례

애플리케이션 설계의 일환으로 잠재적인 피해를 최소화하면서 애플리케이션에 대한 긍정적인 경험을 제공하려면 다음 모범 사례를 고려하세요.

  • 사용자가 필터링된 범주 및 심각도 수준으로 분류된 콘텐츠가 포함된 프롬프트를 보내거나 애플리케이션을 오용하는 시나리오를 어떻게 처리할지 결정하세요.
  • 완성이 필터링되었는지 확인하려면 finish_reason을 확인하세요.
  • content_filter_result에 오류 개체가 없는지 확인하세요(콘텐츠 필터가 실행되지 않았음을 나타냄).
  • 주석 모드에서 보호 자료 코드 모델을 사용하는 경우 애플리케이션에 코드를 표시할 때 인용 URL을 표시합니다.

다음 단계