Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этом руководстве описывается опыт потоковой передачи содержимого и возможности Azure OpenAI. Клиенты могут получать содержимое из API сразу после его создания, а не ожидать фрагментов содержимого, которые проверяются на соответствие фильтрам содержимого.
Примечание
Для настройки асинхронного фильтра требуется разрешение на изменение политик фильтрации содержимого на портале Foundry.
Выбор правильного режима потоковой передачи
Используйте потоковую передачу по умолчанию, если:
- Требуется максимальная безопасность и соответствие требованиям
- Перед отображением содержимого требуется немедленное фильтрация
- Приложение не может обрабатывать удаление ретроактивного содержимого
- Пример: чат-боты с клиентом в регулируемых отраслях
Используйте асинхронный фильтр, если:
- Низкая задержка важна для взаимодействия с пользователем
- Вы можете реализовать редактирование содержимого на стороне клиента
- Приложение имеет дополнительные элементы управления безопасностью
- Вы готовы обрабатывать отложенные сигналы фильтрации
- Пример: внутренние средства разработки, творческие помощники по написанию
Поведение фильтрации по умолчанию
Система защиты содержимого интегрирована и включена по умолчанию для всех клиентов. В сценарии потоковой передачи по умолчанию буферы завершения содержимого, система направляющих содержимого работает с буферизованным содержимым, и в зависимости от конфигурации направляющих содержимое возвращается пользователю, если оно не нарушает политику направляющих (по умолчанию от Microsoft или настраиваемую пользователем конфигурацию), или немедленно блокируется, и возвращается ошибка направляющих. Этот процесс повторяется до конца потока. Содержимое полностью проверено в соответствии с ограничительной политикой, прежде чем оно возвращается пользователю. Содержимое в данном случае не возвращается поштучно, а передаётся пакетами данных соответствующего размера буфера.
Асинхронная фильтрация
Клиенты могут выбрать асинхронный фильтр в качестве дополнительного варианта, предоставляя новый интерфейс потоковой передачи. В этом случае фильтры содержимого выполняются асинхронно, а содержимое завершения возвращается немедленно с плавной построчной потоковой передачей. Содержимое не буферичено, что позволяет быстро выполнять потоковую передачу с нулевой задержкой, связанной с фильтрацией содержимого.
Клиенты должны понимать, что в то время как функция повышает задержку, это компромисс с безопасностью и проверкой в режиме реального времени небольших разделов выходных данных модели. Так как фильтры содержимого выполняются асинхронно, сообщения модерации содержимого и сигналы о нарушении политики задерживаются, что означает, что некоторые разделы вредного содержимого, которые в противном случае были бы отфильтрованы немедленно, могут отображаться пользователю.
Примечания и сообщения модерации содержимого постоянно возвращаются во время потока данных. Настоятельно рекомендуется интегрировать аннотации в вашем приложении и внедрять другие руководства и механизмы контроля ИИ, такие как редактирование содержимого или предоставление другой информации о безопасности пользователю.
Сигнал фильтрации содержимого: отложен сигнал об ошибке фильтрации содержимого. Если происходит нарушение политики, данные возвращаются, как только они становятся доступными, и поток прерывается. Сигнал фильтрации содержимого гарантируется в окне примерно 1000 символов для содержания, нарушающего политику.
Обязательство по авторским правам клиента: содержимое, которое ретроактивно помечено как защищенный материал, может не иметь права на покрытие обязательств по защите авторских прав клиента.
Рекомендации по затратам
Важно
Выставление счетов за фильтрацию содержимого в потоковой передаче
При активации фильтрации контента во время потоковой передачи плата взимается как за токены запроса, так и за токены завершения.
- Состояние 400 (отфильтрованный запрос): плата за оценку запроса
- Состояние 200 с finish_reason: "content_filter": взимается плата за токены запроса и завершения, созданные перед фильтрацией
Это относится как к режимам фильтрации по умолчанию, так и к асинхронным фильтрам. Дополнительные сведения см. в разделе цены на Azure OpenAI.
Чтобы включить Асинхронный фильтр в портале Microsoft Foundry, следуйте руководству по фильтрации контента, чтобы создать новую конфигурацию фильтрации контента, и выберите Асинхронный фильтр в секции стриминга.
Примечание
Асинхронный фильтр доступен в API версии 2024-02-01 и более поздних версий. Используйте пакет SDK OpenAI Python версии 1.0 или Azure OpenAI SDK с совместимыми версиями API.
Сравнение режимов фильтрации содержимого
| Сравнить | Потоковая передача — по умолчанию | Потоковая передача, асинхронный фильтр |
|---|---|---|
| Статус | GA | GA |
| Условия допустимости | Все клиенты | Все клиенты |
| Как включить | Включено по умолчанию, действие не требуется | Клиенты могут настроить его непосредственно на портале Foundry (в рамках конфигурации фильтрации содержимого, примененной на уровне развертывания). |
| Модальность и доступность | Текст; все модели GPT | Текст; все модели GPT |
| Потоковая передача | Содержимое буферичено и возвращается в блоках | Нулевая задержка (без буферизации, фильтры выполняются асинхронно) |
| Сигнал фильтрации содержимого | Немедленная фильтрация сигнала | Задержанный сигнал фильтрации (с шагом до ~1000 символов) |
| Конфигурации фильтрации содержимого | Поддерживает значение по умолчанию и любой определяемый клиентом параметр фильтра (включая необязательные модели) | Поддерживает значение по умолчанию и любой определяемый клиентом параметр фильтра (включая необязательные модели) |
Заметки и примеры ответов
Сообщение аннотации запроса
Это сообщение совпадает с заметками по умолчанию.
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
}
Основные поля описаны:
-
check_offset: положение символа, до которого содержимое было полностью модерировано (никогда не уменьшается) -
start_offset: начальная позиция символа, в которой запускается этот пакет заметки -
end_offset: Последняя позиция символа, где заканчивается этот пакет аннотаций
Все смещения считаются от 0 в начале исходного текста запроса.
Пример потока ответа (проходит через фильтры)
В следующем примере показан реальный ответ завершения чата, использующий асинхронный фильтр. Аннотации подсказок не изменяются, токены завершения отправляются без аннотаций, а новые сообщения с аннотациями отправляются без токенов. Вместо этого эти новые аннотации ссылаются на определенные смещения фильтров содержимого.
{"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]
Устранение неполадок
Поток останавливается по причине окончания действия фильтра контента (content_filter)
Симптом: поток неожиданно заканчивается finish_reason: "content_filter".
Причина. Содержимое, созданное моделью, нарушило политику фильтрации содержимого. В режиме асинхронного фильтра этот сигнал может поступать после отображения содержимого.
Разрешение:
-
content_filter_resultsПроверьте последний фрагмент, чтобы определить, какая категория спровоцировала фильтрацию (ненависть, насилие, сексуальное, самоповреждение, защищённый_материал_текст). - При использовании асинхронного фильтра реализуйте изменение содержимого в приложении, чтобы удалить уже отображаемое содержимое
- Проверьте конфигурацию фильтрации содержимого на портале Foundry, чтобы настроить пороговые значения серьезности при необходимости
- Рассмотрите возможность переформулировки запроса, чтобы избежать срабатывания фильтров.
Аннотации не отображаются в потоке
Симптом: поток завершается успешно, но content_filter_results всегда пустой или null.
Причина: Аннотации фильтрации содержимого могут быть не активированы для вашего развертывания, либо вы используете версию API, которая не поддерживает аннотации.
Разрешение:
- Убедитесь, что вы используете API версии 2024-02-01 или более поздней
- Проверка конфигурации фильтрации содержимого на портале Foundry
- Убедитесь, что заметки включены для выбранных фильтров
- Ознакомьтесь с документацией по аннотациям Guardrail для шагов настройки
Отложенные сигналы фильтрации в режиме асинхронного фильтра
Симптом: содержимое, которое должно быть отфильтровано, сначала появляется, прежде чем быть отмечено задним числом.
Причина. Это ожидаемое поведение в режиме асинхронного фильтра. Фильтрация выполняется асинхронно с гарантированным сигналом в пределах ~1000 символов.
Разрешение:
- Это работает как задумано в режиме асинхронного фильтра.
- Реализация редактирования содержимого на стороне клиента в случае получения отложенных сигналов фильтра
- Отслеживание значений
check_offsetдля контроля прогресса модерации - Рекомендуется использовать режим потоковой передачи по умолчанию, если для вашего варианта использования требуется немедленная фильтрация
Основные сведения о content_filter_offsets
Симптом: неясно, как интерпретировать check_offsetstart_offsetи end_offset значения.
Объяснение:
-
check_offset: положение символа, до которого содержимое было полностью модерировано (никогда не уменьшается) -
start_offset: начало текстового диапазона, к который относится эта заметка -
end_offset: конец текстового диапазона, к который применяется эта заметка
Все смещения — это позиции символов, начиная с 0 в начале строки.
Дальнейшие действия
- Настройка фильтров содержимого — настройка асинхронного фильтра на портале Foundry
- Справочник по аннотациям Guardrail — подробные схемы аннотаций и уровни серьезности
- Фильтрация содержимого — общие сведения о функциях безопасности содержимого