Форматирование ответов моделей

По умолчанию модель возвращает ответ, отформатированный с помощью разметки Markdown. Используйте текст промпта, чтобы получить ответ с дополнительным форматированием (например с эмодзи) или в другом формате (JSON, XML и т.п.)

Пример:

{
          "modelUri": "gpt://<идентификатор_каталога>/yandexgpt/latest",
          "completionOptions": {
            "stream": false,
            "temperature": 0.6,
            "maxTokens": "2000",
            "reasoningOptions": {
              "mode": "DISABLED"
            }
          },
          "messages": [
            {
              "role": "system",
              "text": "Ты — умный ассистент."
            },
            {
              "role": "user",
              "text": "Назови любые три группы товаров в продовольственном магазине. Для каждой группы приведи три любые подгруппы, входящие в группу. Представь результат в форме объекта JSON, где каждая группа товаров представлена в виде ключа в объекте JSON, а значениями являются массивы из соответствующих подгрупп. Нужны только данные без вводных фраз и объяснений. Не используй разметку Markdown!"
            }
          ]
        }
        

Результат:

{
          "result": {
            "alternatives": [
              {
                "message": {
                  "role": "assistant",
                  "text": "{\n    \"мясо\": [\"говядина\", \"свинина\", \"баранина\"],\n    \"молочные продукты\": [\"молоко\", \"творог\", \"сметана\"],\n    \"фрукты\": [\"яблоки\", \"бананы\", \"апельсины\"]\n}"
                },
                "status": "ALTERNATIVE_STATUS_FINAL"
              }
            ],
            "usage": {
              "inputTextTokens": "87",
              "completionTokens": "58",
              "totalTokens": "145"
            },
            "modelVersion": "07.03.2024"
          }
        }
        

Модель вернула ответ в формате JSON, где перенос строки заменен на \n, а кавычки экранированы.

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

Параметры API для сохранения структуры ответа

Некоторые модели генерации текста поддерживают дополнительное управление форматом ответа не только промптом, но и с помощью параметров запроса. Так вы можете использовать параметры форматирования ответа, чтобы указать, что ответ необходимо вернуть в формате JSON. На выбор доступны два варианта:

  1. JSON с произвольной структурой:

    #!/usr/bin/env python3
            
            from __future__ import annotations
            
            import json
            
            import pydantic
            
            from yandex_ai_studio_sdk import AIStudio
            
            text = """
            Назови любые три группы товаров в продовольственном магазине. 
            Для каждой группы приведи три любые подгруппы, входящие в группу. 
            Представь результат в формате JSON.
            """
            
            
            def main() -> None:
                sdk = AIStudio(
                    folder_id="<идентификатор_каталога>",
                    auth="<API-ключ>",
                )
            
                model = sdk.models.completions("yandexgpt", model_version="rc")
            
                model = model.configure(response_format="json")
                result = model.run(
                    [
                        {"role": "user", "text": text},
                    ]
                )
                print("JSON result:", result[0].text)
            
            
            if __name__ == "__main__":
                main()
            
    {
              "modelUri": "gpt://<идентификатор_каталога>/yandexgpt/rc",
              "completionOptions": {
                "stream": false
              },
              "messages": [
                {
                  "role": "user",
                  "text": "Назови любые три группы товаров в продовольственном магазине. Для каждой группы приведи три любые подгруппы, входящие в группу. Представь результат в формате JSON."
                }
              ],
              "json_object": true
            }
            

    Совет

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

  2. JSON, строго соответствующий заданной схеме:

    #!/usr/bin/env python3
            
            from __future__ import annotations
            
            import json
            
            import pydantic
            
            from yandex_ai_studio_sdk import AIStudio
            
            text = "Назови дату первого полета Гагарина."
            
            
            def main() -> None:
                sdk = AIStudio(
                    folder_id="<идентификатор_каталога>",
                    auth="<API-ключ>",
                )
            
                model = sdk.models.completions("yandexgpt", model_version="rc")
            
                model = model.configure(
                    response_format={
                        "json_schema": {
                            "properties": {
                                "day": {
                                    "title": "Day",
                                    "description": "День месяца",
                                    "type": "integer",
                                },
                                "month": {
                                    "title": "Month",
                                    "description": "Месяц, словом",
                                    "type": "string",
                                },
                                "year": {
                                    "title": "Year",
                                    "description": "Год",
                                    "type": "integer",
                                },
                            },
                            "required": ["day", "month", "year"],
                            "type": "object",
                        }
                    }
                )
                result = model.run(
                    [
                        {"role": "user", "text": text},
                    ]
                )
                print("JSON result:", result[0].text)
            
            
            if __name__ == "__main__":
                main()
            
    {
              "modelUri": "gpt://<идентификатор_каталога>/yandexgpt/rc",
              "completionOptions": {
                "stream": false
              },
              "messages": [
                {
                  "role": "user",
                  "text": "Назови дату первого полета Гагарина."
                }
              ],
              "json_schema": {
                "schema": {
                  "properties": {
                    "day": {
                      "title": "Day",
                      "description": "День месяца",
                      "type": "integer"
                    },
                    "month": {
                      "title": "Month",
                      "description": "Месяц, словом",
                      "type": "string"
                    },
                    "year": {
                      "title": "Year",
                      "description": "Год",
                      "type": "integer"
                    }
                  },
                  "required": [
                    "day",
                    "month",
                    "year"
                  ],
                  "type": "object"
                }
              }
            }
            

Строгая структура ответа необходима при работе с внешними инструментами с помощью вызова функций.