ym88659208ym87991671
Предварительный анализ текста | Документация для разработчиков

Предварительный анализ текста

Обновлено 11 ноября 2026

Для анализа текстовых фрагментов и решения задач классификации, маршрутизации или ранжирования использование LLM может быть невыгодно. Чтобы снизить потребление ресурсов, повысить скорость и эффективность при решении таких задач в GigaChat API B2Bank доступна модель FRIDA-Decisions . Для работы с моделью нужно получить доступы .

Модель работает в пилотном режиме и доступна бесплатно только на стенде ИФТ. Количество одновременных потоков — не более двух на время пилота.

В отличие от LLM, эта модель не генерирует текст, а в структурированной форме отвечает на заранее заданные вопросы о переданном тексте: оценивает варианты ответа, возвращает вероятности и, в зависимости от задачи, выбранный вариант, оценку по шкале или ранжированный список. Ответ модели можно использовать, например, для маршрутизации обращений пользователей или оценки пригодности инструмента, выбранного LLM, для решения задачи агента.

Запрос пользователя

Вчера оплатил заказ №5512 картой, деньги списались дважды. Курьер привез заказ с опозданием на три дня, а поддержка двое суток не отвечала. Верните лишнее списание.

Ответ модели

{
"topic": {
"choice": "billing",
"probabilities": {
"account": 0.0000287,
"billing": 0.6600105,
"delivery": 0.3387572,
"product": 0.0012036
}
},
"urgency": {"score": 1.0214},
"complaint": {"probability": 0.9539}
}

Ниже вы узнаете как использовать модель с помощью методов API:

Как работает модель

При обращении к FRIDA Decisions используется генерация структурированных данных. В запросе, в поле response_format с типом json_schema нужно передать JSON-схему вопросов. Вопросы оцениваются независимо, поэтому результаты можно комбинировать: определить тему обращения, срочность и наличие жалобы за один запрос. Каждый вопрос передается в отдельном поле в schema.properties:

{
"model": "frida",
"messages": [
{"role": "user", "content": "Здравствуйте! Вчера оплатил заказ №5512 картой, деньги списались дважды. Курьер привез заказ с опозданием на три дня, а поддержка двое суток не отвечала. Верните, пожалуйста, лишнее списание."}
],
"response_format": {
"type": "json_schema",
"schema": {
"type": "object",
"properties": {
"q1": {"title": "noul", "description": "Клиент просит вернуть деньги?", "type": "object", "properties": {"probability": {"type": "number"}}},
"q2": {"title": "noul", "description": "Клиент упоминает доставку?", "type": "object", "properties": {"probability": {"type": "number"}}},
"q3": {"title": "noul", "description": "Клиент упоминает поддержку?", "type": "object", "properties": {"probability": {"type": "number"}}},
"q4": {"title": "noul", "description": "Клиент угрожает уйти?", "type": "object", "properties": {"probability": {"type": "number"}}},
}
}
}
}

Текст для оценки, должен быть короче 384 токенов. Модель не учитывает все, что выше этого ограничения. Поэтому передавайте важную информацию в начале сообщения.

Имя поля становится именем вопроса в ответе, title задает тип вопроса, а description — текст вопроса для модели. Поле title принимает одно из значений:

  • choice — выбрать один вариант из нескольких и получить вероятности всех вариантов;
  • score — расположить текст на шкале из нескольких уровней;
  • noul — проверить одно утверждение и получить вероятность ответа «да»;
  • ranking — упорядочить кандидатов от самого важного к наименее важному.

В ответ модель возвращает поле content — строку с JSON-объектом: по одному ключу на каждый вопрос схемы.

{
"choices": [
{
"message": {
"content": "{\"q1\":{\"probability\":0.8815209596207574},\"q2\":{\"probability\":0.7620943162745152},\"q3\":{\"probability\":0.38572241698282184},\"q4\":{\"probability\":0.038442224492629365},\"q5\":{\"probability\":0.9269841713935097},\"q6\":{\"probability\":0.38107537519940016}}",
"role": "assistant"
},
"index": 0,
"finish_reason": "stop"
}
],
"created": 1793974228,
"model": "frida:latest",
"object": "chat.completions",
"usage": {
"prompt_tokens": 369,
"completion_tokens": 0,
"total_tokens": 369,
"precached_prompt_tokens": 48
}
}

Для повышения качества работы модели при составлении схемы придерживайтесь рекомендаций:

ПараметрРекомендуемое значение
Длина вопросадо 96 токенов
Длина описания вариантадо 256 токенов
Вопросов в запроседо 4
Вариантов ответадо 16

Потоковая передача

При обращении к модели в режиме потоковой генерации ("stream": true), JSON-ответ всегда возвращается в одном фрагменте.

Формат фрагмента зависит от метода.

Приходят событие response.message.delta с ответом модели и response.message.done:

event: response.message.delta
data: {"model":"frida:latest","created_at":1794226754,"messages":[{"role":"assistant","content":[{"text":"{\"complaint\":{\"probability\":0.9538661516142485}}"}]}]}

event: response.message.done
data: {"model":"frida:latest","created_at":1794226754,"messages":[{"role":"assistant","tool_state_id":"01a1c03f-9599-76f2-a69a-69e4ab8e832d"}],"finish_reason":"stop","usage":{"input_tokens":65,"input_tokens_details":{"prompt_tokens":65,"cached_tokens":48},"output_tokens":0,"total_tokens":65}}

Как составить схему

  • Укажите тип вопроса

    В поле title укажите один из типов:

    • choice — выбор одной из категорий;
    • score — оценка по шкале;
    • noul — вопрос «да/нет»;
    • ranking — упорядочивание кандидатов.

    Неизвестное значение приведет к ошибке с кодом 422, под которой приходит ошибка 400 Bad Request.

  • Сформулируйте вопрос

    В поле description вопроса коротко и однозначно опишите задачу. Например: «Какая тема обращения?». Именно здесь передается инструкция для модели.

  • Опишите варианты ответа

    Если тип вопроса предусматривает варианты, добавьте их в properties.probabilities.properties. В description каждого варианта поясните, какие случаи к нему относятся. Например: «Оплата, списания и возвраты денег».

    Для noul варианты задавать не нужно — объявите поле probability.

  • Задайте идентификаторы вариантов

    Используйте короткие нейтральные идентификаторы латиницей, без пробелов — например, billing или delivery. Для choice модель получает вариант в формате <id>: <описание>.

    Для score используйте последовательные числовые ключи: "0", "1", "2" и далее, без пропусков.

  • Укажите поля ответа

    Объявите в properties все поля, которые хотите получить в ответе: например, choice и confidence для выбора категории или ranking для ранжирования. Поля, не включенные в схему, в ответе отсутствуют.

Примеры запросов

Все примеры используют один текст обращения:

Вчера оплатил заказ №5512 картой, деньги списались дважды. Курьер привез заказ с опозданием на три дня, а поддержка двое суток не отвечала. Верните лишнее списание.

Выбор одного варианта

Вопрос типа choice выбирает один вариант из перечисленных. Вариантов должно быть не меньше двух. Модель видит вариант как <идентификатор>: <описание>.

В ответ приходят вероятности по всем вариантам. Поля choice и confidence возвращаются, только если объявлены в схеме. Без choice выбирать вариант с наибольшей вероятностью нужно на стороне приложения.

Поле confidence показывает оценку уверенности модели в выбранном варианте. Значение зависит от качества текста и описаний вариантов: короткий однозначный текст и подробные описания повышают уверенность, размытый текст и короткие ярлыки ее снижают. Использовать значение поля как порог автоматической маршрутизации можно только после проверки на ваших данных.

В V2 схема передается внутри model_options:

curl -X POST 'https://gigachat-ift.sberdevices.delta.sbrf.ru/v2/chat/completions' \
--cert <сертификат>.pem \
--key <ключ>.key \
-H 'Content-Type: application/json' \
-d '{
"model": "frida",
"messages": [
{"role": "user", "content": [{"text": "Вчера оплатил заказ №5512 картой, деньги списались дважды. Курьер привез заказ с опозданием на три дня, а поддержка двое суток не отвечала. Верните лишнее списание."}]}
],
"model_options": {
"response_format": {
"type": "json_schema",
"name": "topic_schema",
"schema": {
"type": "object",
"properties": {
"topic": {
"title": "choice",
"description": "Какая тема обращения?",
"type": "object",
"properties": {
"probabilities": {
"type": "object",
"properties": {
"account": {"type": "number", "description": "вход в аккаунт, пароль, личные данные"},
"billing": {"type": "number", "description": "оплата, списания, возвраты денег"},
"delivery": {"type": "number", "description": "доставка и сроки получения заказа"},
"product": {"type": "number", "description": "качество и характеристики товара"}
}
}
}
}
}
}
}
}
}'
Пример ответа
{
"model": "frida:latest",
"created_at": 1793967467,
"messages": [
{
"role": "assistant",
"tool_state_id": "01a1b0cb-2d1c-7a8e-aa64-442235decab8",
"content": [
{
"text": "{\"topic\":{\"probabilities\":{\"account\":2.866062815887005e-05,\"billing\":0.6600105120763486,\"delivery\":0.33875719165373497,\"product\":0.001203635641757451}}}"
}
]
}
],
"finish_reason": "stop",
"usage": {
"input_tokens": 102,
"input_tokens_details": {
"prompt_tokens": 102,
"cached_tokens": 48
},
"output_tokens": 0,
"total_tokens": 102
}
}

Положение на шкале

Вопрос типа score ставит текст на шкалу из нескольких уровней. Уровни задаются ключами "0"…"N-1" без пропусков: порядок определяют числа, а не порядок ключей. Подпись для уровня задается в поле description.

В ответ приходят вероятности уровней. Поле score — дробное положение на шкале, legend — подписи уровней по индексам. Оба поля возвращаются, только если объявлены в схеме.

curl -X POST 'https://gigachat-ift.sberdevices.delta.sbrf.ru/v2/chat/completions' \
--cert <сертификат>.pem \
--key <ключ>.key \
-H 'Content-Type: application/json' \
-d '{
"model": "frida",
"messages": [
{"role": "user", "content": [{"text": "Вчера оплатил заказ №5512 картой, деньги списались дважды. Курьер привез заказ с опозданием на три дня, а поддержка двое суток не отвечала. Верните лишнее списание."}]}
],
"model_options": {
"response_format": {
"type": "json_schema",
"name": "urgency_schema",
"schema": {
"type": "object",
"properties": {
"urgency": {
"title": "score",
"description": "Оцени срочность обращения от 0 (не срочно) до 2 (нужно решать немедленно).",
"type": "object",
"properties": {
"probabilities": {
"type": "object",
"properties": {
"0": {"type": "number", "description": "не срочно"},
"1": {"type": "number", "description": "срочно"},
"2": {"type": "number", "description": "нужно решать немедленно"}
}
},
"score": {"type": "number"},
"legend": {
"type": "object",
"properties": {
"0": {"type": "string"},
"1": {"type": "string"},
"2": {"type": "string"}
}
}
}
}
}
}
}
}
}'
Пример ответа
{
"model": "frida:latest",
"created_at": 1793967477,
"messages": [
{
"role": "assistant",
"tool_state_id": "01a1b0cb-52d4-7280-826b-d151a6ca5595",
"content": [
{
"text": "{\"urgency\":{\"legend\":{\"0\":\"не срочно\",\"1\":\"срочно\",\"2\":\"нужно решать немедленно\"},\"probabilities\":{\"0\":0.06872532109762787,\"1\":0.8411068541698615,\"2\":0.09016782473251068},\"score\":1.0214425036348829}}"
}
]
}
],
"finish_reason": "stop",
"usage": {
"input_tokens": 80,
"input_tokens_details": {
"prompt_tokens": 80,
"cached_tokens": 48
},
"output_tokens": 0,
"total_tokens": 80
}
}

Да или нет

Вопрос типа noul проверяет одно утверждение. В поле probability модель возвращает вероятность ответа «да». Порог вероятности нужно определять на стороне приложения.

Формулируйте вопрос так, чтобы «да» было однозначным: двойное отрицание дает нестабильный ответ.

curl -X POST 'https://gigachat-ift.sberdevices.delta.sbrf.ru/v2/chat/completions' \
--cert <сертификат>.pem \
--key <ключ>.key \
-H 'Content-Type: application/json' \
-d '{
"model": "frida",
"messages": [
{"role": "user", "content": [{"text": "Вчера оплатил заказ №5512 картой, деньги списались дважды. Курьер привез заказ с опозданием на три дня, а поддержка двое суток не отвечала. Верните лишнее списание."}]}
],
"model_options": {
"response_format": {
"type": "json_schema",
"name": "complaint_schema",
"schema": {
"type": "object",
"properties": {
"complaint": {
"title": "noul",
"description": "Это жалоба?",
"type": "object",
"properties": {
"probability": {"type": "number"}
}
}
}
}
}
}
}'
Пример ответа
{
"model": "frida:latest",
"created_at": 1793967478,
"messages": [
{
"role": "assistant",
"tool_state_id": "01a1b0cb-559a-7b71-b5e1-0430efaca2e6",
"content": [
{
"text": "{\"complaint\":{\"probability\":0.9538661516142485}}"
}
]
}
],
"finish_reason": "stop",
"usage": {
"input_tokens": 65,
"input_tokens_details": {
"prompt_tokens": 65,
"cached_tokens": 48
},
"output_tokens": 0,
"total_tokens": 65
}
}

Упорядочивание кандидатов

Вопрос типа ranking расставляет кандидатов от наиболее вероятного к наименее вероятному. Элементы для ранжирования перечисляются в probabilities.properties: ключ — идентификатор, description — текст элемента. Модель видит только текст, идентификаторы ей не показываются.

В ответ приходят вероятности элементов и массив ranking, если он объявлен в схеме.

curl -X POST 'https://gigachat-ift.sberdevices.delta.sbrf.ru/v2/chat/completions' \
--cert <сертификат>.pem \
--key <ключ>.key \
-H 'Content-Type: application/json' \
-d '{
"model": "frida",
"messages": [
{"role": "user", "content": [{"text": "Вчера оплатил заказ №5512 картой, деньги списались дважды. Курьер привез заказ с опозданием на три дня, а поддержка двое суток не отвечала. Верните лишнее списание."}]}
],
"model_options": {
"response_format": {
"type": "json_schema",
"name": "severity_schema",
"schema": {
"type": "object",
"properties": {
"severity": {
"title": "ranking",
"description": "Расставь причины недовольства от самой важной к наименее важной.",
"type": "object",
"properties": {
"probabilities": {
"type": "object",
"properties": {
"late": {"type": "number", "description": "задержка доставки"},
"silent": {"type": "number", "description": "молчание поддержки"},
"refund": {"type": "number", "description": "поздний возврат денег"}
}
},
"ranking": {
"type": "array",
"items": {"type": "string", "enum": ["late", "silent", "refund"]}
}
}
}
}
}
}
}
}'
Пример ответа
{
"model": "frida:latest",
"created_at": 1793967478,
"messages": [
{
"role": "assistant",
"tool_state_id": "01a1b0cb-58c5-7ea4-a66c-8441d4f02953",
"content": [
{
"text": "{\"severity\":{\"probabilities\":{\"late\":0.14378174434655974,\"refund\":0.41619399712398913,\"silent\":0.4400242585294512},\"ranking\":[\"silent\",\"refund\",\"late\"]}}"
}
]
}
],
"finish_reason": "stop",
"usage": {
"input_tokens": 83,
"input_tokens_details": {
"prompt_tokens": 83,
"cached_tokens": 48
},
"output_tokens": 0,
"total_tokens": 83
}
}

Разбор ответа

Путь до ответа модели зависит от метода, которым вы отправили запрос:

МетодПуть до content
v1/chat/completionschoices[0].message.content
v2/chat/completionsmessages[0].content[0].text
openai/v1/chat/completionschoices[0].message.content

Во всех случаях content — строка с JSON, которую нужно разобрать.

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

import json

# Для v2/chat/completions замените строку на:
# content = response["messages"][0]["content"][0]["text"]
# Для openai/v1/chat/completions путь тот же, что в V1.
content = response["choices"][0]["message"]["content"]
answer = json.loads(content)

probabilities = answer["topic"]["probabilities"]
topic = max(probabilities, key=probabilities.get)

if probabilities[topic] < 0.5:
# Передать на дополнительную проверку
pass
else:
# Обработать обращение по выбранной теме
pass
Заметили ошибку?
Выделите текст и нажмите
Ctrl
+
Enter
, чтобы сообщить нам об ошибке