Краткое руководство. Обнаружение заземления (предварительная версия)

Следуйте этому руководству, чтобы использовать обнаружение безопасности содержимого ИИ Azure, чтобы проверить, соответствуют ли текстовые ответы больших языковых моделей (LLM) в исходных материалах, предоставляемых пользователями.

Дополнительные сведения об обнаружении наземления см. на странице концепции обнаружения заземления. Сведения о ограничениях ввода API см. в разделе "Требования к входным данным" в разделе "Обзор".

Необходимые компоненты

  • подписка Azure — создайте бесплатную учетную запись.
  • После получения подписки Azure создайте ресурс безопасности содержимого в портал Azure, чтобы получить ключ и конечную точку. Введите уникальное имя ресурса, выберите подписку и выберите группу ресурсов, поддерживаемый регион и поддерживаемую ценовую категорию. Затем выберите Создать.
  • Развертывание ресурса занимает несколько минут. Когда оно завершится, перейдите к новому ресурсу. В области слева в разделе "Управление ресурсами" выберите ключи API и конечные точки. Скопируйте одно из значений ключа подписки и конечной точки в временное расположение для последующего использования.
  • (Необязательно) Если вы хотите использовать функцию аргументирования , создайте ресурс службы Azure OpenAI с развернутой моделью GPT.
  • cURL или Python установлен.

Проверка заземления без рассуждений

В простом случае без функции рассудка API обнаружения заземления классифицирует незапланированность отправленного содержимого как true или false.

В этом разделе описывается пример запроса с cURL. Вставьте приведенную ниже команду в текстовый редактор и внесите следующие изменения.

  1. Замените <endpoint> URL-адрес конечной точки, связанный с ресурсом.

  2. Замените <your_subscription_key> одним из ключей своего ресурса.

  3. При необходимости замените "query" "text" поля в тексте собственным текстом, который вы хотите проанализировать.

    curl --location --request POST '<endpoint>/contentsafety/text:detectGroundedness?api-version=2024-02-15-preview' \
    --header 'Ocp-Apim-Subscription-Key: <your_subscription_key>' \
    --header 'Content-Type: application/json' \
    --data-raw '{
      "domain": "Generic",
      "task": "QnA",
      "qna": {
        "query": "How much does she currently get paid per hour at the bank?"
      },
      "text": "12/hour",
      "groundingSources": [
        "I'm 21 years old and I need to make a decision about the next two years of my life. Within a week. I currently work for a bank that requires strict sales goals to meet. IF they aren't met three times (three months) you're canned. They pay me 10/hour and it's not unheard of to get a raise in 6ish months. The issue is, **I'm not a salesperson**. That's not my personality. I'm amazing at customer service, I have the most positive customer service \"reports\" done about me in the short time I've worked here. A coworker asked \"do you ask for people to fill these out? you have a ton\". That being said, I have a job opportunity at Chase Bank as a part time teller. What makes this decision so hard is that at my current job, I get 40 hours and Chase could only offer me 20 hours/week. Drive time to my current job is also 21 miles **one way** while Chase is literally 1.8 miles from my house, allowing me to go home for lunch. I do have an apartment and an awesome roommate that I know wont be late on his portion of rent, so paying bills with 20hours a week isn't the issue. It's the spending money and being broke all the time.\n\nI previously worked at Wal-Mart and took home just about 400 dollars every other week. So I know i can survive on this income. I just don't know whether I should go for Chase as I could definitely see myself having a career there. I'm a math major likely going to become an actuary, so Chase could provide excellent opportunities for me **eventually**."
      ],
      "reasoning": false
    }'
    

Откройте командную строку и выполните команду cURL.

Чтобы протестировать задачу сводки вместо задачи ответа на вопросы (QnA), используйте следующий пример текста JSON:

{
  "domain": "Medical",
  "task": "Summarization",
  "text": "Ms Johnson has been in the hospital after experiencing a stroke.",
  "groundingSources": [
    "Our patient, Ms. Johnson, presented with persistent fatigue, unexplained weight loss, and frequent night sweats. After a series of tests, she was diagnosed with Hodgkin’s lymphoma, a type of cancer that affects the lymphatic system. The diagnosis was confirmed through a lymph node biopsy revealing the presence of Reed-Sternberg cells, a characteristic of this disease. She was further staged using PET-CT scans. Her treatment plan includes chemotherapy and possibly radiation therapy, depending on her response to treatment. The medical team remains optimistic about her prognosis given the high cure rate of Hodgkin’s lymphoma."
  ],
  "reasoning": false
}

Следующие поля должны быть включены в URL-адрес:

имени Обязательно Описание Тип
Версия API Обязательное поле Это используемая версия API. Текущая версия: api-version=2024-02-15-preview. Пример: <endpoint>/contentsafety/text:detectGroundedness?api-version=2024-02-15-preview Строка

Параметры в тексте запроса определяются в этой таблице:

Имя Описание Тип
домен (Необязательно) MEDICAL или GENERIC. Значение по умолчанию: GENERIC. Перечисление
задача (Необязательно) Тип задачи: QnA, Summarization. Значение по умолчанию: Summarization. Перечисление
qna (Необязательно) Хранит данные QnA при использовании типа QnAзадачи. Строка
- query (Необязательно) Это представляет вопрос в задаче QnA. Ограничение символов: 7500. Строка
text (обязательно) Проверяемый текст выходных данных LLM. Ограничение символов: 7500. Строка
groundingSources (обязательно) Использует массив источников приземления для проверки текста, созданного ИИ. Сведения о требованиях к входным данным см. в разделе "Требования к входным данным". Массив строк
рассуждение (Необязательно) Указывает, следует ли использовать функцию аргументирования. Значение по умолчанию — false. Если trueвам нужно предоставить собственные ресурсы Azure OpenAI GPT-4 Turbo (1106-preview). Будьте осторожны: использование причин увеличивает время обработки. Логический

Интерпретация ответа API

После отправки запроса вы получите ответ JSON, отражающий выполненный анализ заземления. Вот как выглядит типичный результат:

{
  "ungroundedDetected": true,
  "ungroundedPercentage": 1,
  "ungroundedDetails": [
    {
      "text": "12/hour."
    }
  ]
}

Объекты JSON в выходных данных определяются здесь:

Имя Описание Тип
ungroundedDetected Указывает, отображается ли текст незамеченностью. Логический
ungroundedPercentage Указывает пропорцию текста, определяемого как неплановый, выраженный как число от 0 до 1, где 0 указывает, что не отображается незапланированное содержимое, а 1 — полностью незапланированное содержимое. Тип с плавающей запятой
ungroundedDetails Предоставляет аналитические сведения о незапланированного содержимом с конкретными примерами и процентными значениями. Массив
-text Конкретный текст, который находится на переднем плане. Строка

Проверка заземления с помощью причин

API обнаружения заземления предоставляет возможность включить причину в ответ API. При включенной настройке ответ включает в себя "reasoning" поле, в которое подробно описаны конкретные экземпляры и объяснения для любой обнаруженной нераспределенности.

Создание собственного развертывания GPT

Совет

На данный момент мы поддерживаем только ресурсы Azure OpenAI GPT-4 Turbo (1106-preview) и не поддерживают другие типы GPT. Вы можете развернуть ресурсы GPT-4 Turbo (1106-preview) в любом регионе. Однако, чтобы свести к минимуму потенциальную задержку и избежать каких-либо проблем с конфиденциальностью и рисками географических границ, рекомендуется установить их в том же регионе, что и ресурсы безопасности содержимого. Подробные сведения о конфиденциальности данных см . в рекомендациях по защите данных, конфиденциальности и безопасности azure OpenAI Service и Data, конфиденциальности и безопасности для безопасности содержимого ИИ Azure.

Чтобы использовать ресурс Azure OpenAI GPT4-Turbo (1106-preview), чтобы включить функцию рассуждений, используйте управляемое удостоверение, чтобы разрешить ресурсу Безопасности контента доступ к ресурсу Azure OpenAI:

  1. Включите управляемое удостоверение для безопасности содержимого ИИ Azure.

    Перейдите к экземпляру Безопасности содержимого ИИ Azure в портал Azure. Найдите раздел "Удостоверение" в категории "Параметры". Включите управляемое удостоверение, назначаемое системой. Это действие предоставляет экземпляр безопасности содержимого ИИ Azure удостоверение, которое можно распознать и использовать в Azure для доступа к другим ресурсам.

    Снимок экрана: ресурс удостоверений безопасности содержимого в портал Azure.

  2. Назначение роли управляемому удостоверению.

    Перейдите к экземпляру Azure OpenAI, выберите "Добавить назначение ролей", чтобы начать процесс назначения роли Azure OpenAI идентификатору безопасности содержимого Azure.

    Снимок экрана: добавление назначения ролей в портал Azure.

    Выберите роль пользователя или участника.

    Снимок экрана: портал Azure с ролями участника и пользователя, отображаемыми в списке.

Создание запроса API

В запросе к API обнаружения заземления задайте "reasoning" для параметра truebody значение и укажите другие необходимые параметры:

{
  "reasoning": true,
  "llmResource": {
    "resourceType": "AzureOpenAI",
    "azureOpenAIEndpoint": "<your_OpenAI_endpoint>",
    "azureOpenAIDeploymentName": "<your_deployment_name>"
  }
}

В этом разделе описывается пример запроса с cURL. Вставьте приведенную ниже команду в текстовый редактор и внесите следующие изменения.

  1. Замените <endpoint> URL-адрес конечной точки, связанный с ресурсом.

  2. Замените <your_subscription_key> одним из ключей своего ресурса.

  3. При необходимости замените "query" "text" поля в тексте собственным текстом, который вы хотите проанализировать.

    curl --location --request POST '<endpoint>/contentsafety/text:detectGroundedness?api-version=2024-02-15-preview' \
    --header 'Ocp-Apim-Subscription-Key: <your_subscription_key>' \
    --header 'Content-Type: application/json' \
    --data-raw '{
      "domain": "Generic",
      "task": "QnA",
      "qna": {
        "query": "How much does she currently get paid per hour at the bank?"
      },
      "text": "12/hour",
      "groundingSources": [
        "I'm 21 years old and I need to make a decision about the next two years of my life. Within a week. I currently work for a bank that requires strict sales goals to meet. IF they aren't met three times (three months) you're canned. They pay me 10/hour and it's not unheard of to get a raise in 6ish months. The issue is, **I'm not a salesperson**. That's not my personality. I'm amazing at customer service, I have the most positive customer service \"reports\" done about me in the short time I've worked here. A coworker asked \"do you ask for people to fill these out? you have a ton\". That being said, I have a job opportunity at Chase Bank as a part time teller. What makes this decision so hard is that at my current job, I get 40 hours and Chase could only offer me 20 hours/week. Drive time to my current job is also 21 miles **one way** while Chase is literally 1.8 miles from my house, allowing me to go home for lunch. I do have an apartment and an awesome roommate that I know wont be late on his portion of rent, so paying bills with 20hours a week isn't the issue. It's the spending money and being broke all the time.\n\nI previously worked at Wal-Mart and took home just about 400 dollars every other week. So I know i can survive on this income. I just don't know whether I should go for Chase as I could definitely see myself having a career there. I'm a math major likely going to become an actuary, so Chase could provide excellent opportunities for me **eventually**."
      ],
      "reasoning": true,
      "llmResource": {
            "resourceType": "AzureOpenAI",
            "azureOpenAIEndpoint": "<your_OpenAI_endpoint>",
            "azureOpenAIDeploymentName": "<your_deployment_name>"
    }'
    
  4. Откройте командную строку и выполните команду cURL.

Параметры в тексте запроса определяются в этой таблице:

Имя Описание Тип
домен (Необязательно) MEDICAL или GENERIC. Значение по умолчанию: GENERIC. Перечисление
задача (Необязательно) Тип задачи: QnA, Summarization. Значение по умолчанию: Summarization. Перечисление
qna (Необязательно) Хранит данные QnA при использовании типа QnAзадачи. Строка
- query (Необязательно) Это представляет вопрос в задаче QnA. Ограничение символов: 7500. Строка
text (обязательно) Проверяемый текст выходных данных LLM. Ограничение символов: 7500. Строка
groundingSources (обязательно) Использует массив источников приземления для проверки текста, созданного ИИ. Дополнительные сведения см. в разделе "Требования к входным данным" Массив строк
рассуждение (Необязательно) trueДля предоставления объяснения служба использует ресурсы Azure OpenAI. Будьте осторожны: использование причин увеличивает время обработки и вызывает дополнительные сборы. Логический
llmResource (обязательно) Если вы хотите использовать собственный ресурс Azure OpenAI GPT4-Turbo (1106-preview), чтобы включить причину, добавьте это поле и включите подфилды для используемых ресурсов. Строка
- resourceType Указывает тип используемого ресурса. В настоящее время он разрешает AzureOpenAIтолько . Мы поддерживаем только ресурсы Azure OpenAI GPT-4 Turbo (1106-preview) и не поддерживаем другие типы GPT. Перечисление
- azureOpenAIEndpoint URL-адрес конечной точки для службы Azure OpenAI. Строка
- azureOpenAIDeploymentName Имя используемого развертывания GPT. Строка

Интерпретация ответа API

После отправки запроса вы получите ответ JSON, отражающий выполненный анализ заземления. Вот как выглядит типичный результат:

{
  "ungroundedDetected": true,
  "ungroundedPercentage": 1,
  "ungroundedDetails": [
    {
      "text": "12/hour.",
      "offset": {
        "utf8": 0,
        "utf16": 0,
        "codePoint": 0
      },
      "length": {
        "utf8": 8,
        "utf16": 8,
        "codePoint": 8
      },
      "reason": "None. The premise mentions a pay of \"10/hour\" but does not mention \"12/hour.\" It's neutral. "
    }
  ]
}

Объекты JSON в выходных данных определяются здесь:

Имя Описание Тип
ungroundedDetected Указывает, отображается ли текст незамеченностью. Логический
ungroundedPercentage Указывает пропорцию текста, определяемого как неплановый, выраженный как число от 0 до 1, где 0 указывает, что не отображается незапланированное содержимое, а 1 — полностью незапланированное содержимое. Тип с плавающей запятой
ungroundedDetails Предоставляет аналитические сведения о незапланированного содержимом с конкретными примерами и процентными значениями. Массив
-text Конкретный текст, который находится на переднем плане. Строка
-offset Объект, описывающий положение незапланированного текста в различных кодировках. Строка
- offset > utf8 Положение смещения нераспределенного текста в кодировке UTF-8. Целое
- offset > utf16 Положение смещения нераспределенного текста в кодировке UTF-16. Целое
- offset > codePoint Позиция смещения нераспределенного текста с точки зрения точек кода Юникода. Целое
-length Объект, описывающий длину незапланированного текста в различных кодировках. (utf8, utf16, codePoint), аналогично смещение. Object
- length > utf8 Длина незапланированного текста в кодировке UTF-8. Целое
- length > utf16 Длина незапланированного текста в кодировке UTF-16. Целое
- length > codePoint Длина незапланированного текста с точки зрения кодовых точек Юникода. Целое
-reason Предлагает объяснения обнаруженной непреднадобности. Строка

Очистка ресурсов

Если вы хотите очистить и удалить подписку на службы искусственного интеллекта Azure, можно удалить ресурс или группу ресурсов. При удалении группы ресурсов также удаляются все связанные с ней ресурсы.