메인 콘텐츠로 건너뛰기
Venice는 이제 API의 사용 가능한 필드로 “response_format”을 통한 구조화된 출력을 포함합니다. 이 필드를 사용하면 특정 사전 정의된 형식을 따르는 프롬프트에 대한 응답을 생성할 수 있습니다. 이 새로운 방법을 사용하면 시스템 프롬프트 조작이나 function calling을 통해 시도할 때 더 흔하게 발생했던, 모델이 응답 내에서 잘못된 키나 값을 환각하는 경우가 줄어듭니다. 구조화된 출력 “response_format” 필드는 OpenAI API 형식을 활용하며, OpenAI 가이드 여기에 더 자세히 설명되어 있습니다. OpenAI는 또한 API에서 구조화된 출력 사용에 대한 소개 문서를 여기에 게시했습니다. 이는 고급 기능이므로 이 페이지 하단에 따라야 할 몇 가지 “주의 사항”이 있습니다. 이 기능은 모든 모델에서 기본적으로 사용할 수 있는 것은 아닙니다. 적용 가능한 모델은 여기 모델 섹션을 참조하여 “supportsResponseSchema”를 찾으세요.
    {
      "id": "venice-uncensored",
      "type": "text",
      "object": "model",
      "created": 1726869022,
      "owned_by": "venice.ai",
      "model_spec": {
        "availableContextTokens": 32768,
        "capabilities": {
          "supportsFunctionCalling": true,
          "supportsResponseSchema": true,
          "supportsWebSearch": true
        },

구조화된 응답 사용 방법

“response_format”을 올바르게 사용하려면 출력 카테고리를 나타내는 다양한 “properties”로 스키마를 정의할 수 있으며, 각각 개별적으로 구성된 데이터 유형을 가집니다. 이러한 객체는 더 고급 출력 구조를 만들기 위해 중첩될 수 있습니다. 다음은 수학 방정식 풀이의 단계별 프로세스를 설명하기 위해 response_format을 사용한 API 호출의 예입니다. response 내에서 “steps”와 “final_answer” 모두 필요하도록 properties가 구성된 것을 볼 수 있습니다. 중첩 내에서 steps 카테고리는 각각 string으로 된 “explanation”과 “output”으로 구성됩니다.
curl --request POST \
  --url https://api.venice.ai/api/v1/chat/completions \
  --header 'Authorization: Bearer <api-key>' \
  --header 'Content-Type: application/json' \
  --data '{
  "model": "venice-uncensored",
  "messages": [
    {
      "role": "system",
      "content": "You are a helpful math tutor."
    },
    {
      "role": "user",
      "content": "solve 8x + 31 = 2"
    }
  ],
  "response_format": {
    "type": "json_schema",
    "json_schema": {
      "name": "math_response",
      "strict": true,
      "schema": {
        "type": "object",
        "properties": {
          "steps": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "explanation": {
                  "type": "string"
                },
                "output": {
                  "type": "string"
                }
              },
              "required": ["explanation", "output"],
              "additionalProperties": false
            }
          },
          "final_answer": {
            "type": "string"
          }
        },
        "required": ["steps", "final_answer"],
        "additionalProperties": false
      }
    }
  }
}

다음은 모델에서 받은 응답입니다. 구조가 먼저 각 단계의 “explanation”과 “output”이 포함된 “steps”를 제공한 다음 “final answer”를 제공함으로써 요구 사항을 따랐음을 볼 수 있습니다.
{
  "steps": [
    {
      "explanation": "Subtract 31 from both sides to isolate the term with x.",
      "output": "8x + 31 - 31 = 2 - 31"
    },
    {
      "explanation": "This simplifies to 8x = -29.",
      "output": "8x = -29"
    },
    {
      "explanation": "Divide both sides by 8 to solve for x.",
      "output": "x = -29 / 8"
    }
  ],
  "final_answer": "x = -29 / 8"
}

이것은 간단한 예이지만, 이를 데이터 추출, Chain of Thought 연습, UI 생성, 데이터 분류 등과 같은 보다 고급 사용 사례로 확장할 수 있습니다.

주의 사항

response_format을 통해 구조화된 출력을 사용할 때 염두에 두어야 할 몇 가지 주요 요구 사항은 다음과 같습니다:
  • response_format을 사용하는 초기 요청은 응답 생성에 시간이 더 걸릴 수 있습니다. 후속 요청은 초기 요청과 동일한 지연 시간이 발생하지 않습니다.
  • 더 큰 쿼리의 경우, max_tokens 또는 모델 시간 초과에 도달하거나 속도 제한을 위반하면 모델이 완료에 실패할 수 있습니다
  • 잘못된 스키마 형식은 일반적으로 시간 초과로 인해 완료 시 오류를 발생시킵니다
  • response_format은 모델이 특정 방식으로 출력할 것을 보장하지만, 모델이 그 내에서 올바른 정보를 제공한다는 것을 보장하지는 않습니다. 콘텐츠는 프롬프트와 모델 성능에 의해 결정됩니다.
  • response_format을 통한 구조화된 출력은 병렬 function call과 호환되지 않습니다
  • 중요: 모든 필드 또는 매개변수에는 required 태그가 포함되어야 합니다. 필드를 선택적으로 만들려면 다음과 같이 필드의 type 내에 null 옵션을 추가해야 합니다: "type": ["string", "null"]
  • required 필드 내에 null 옵션을 제공하여 빈 응답을 허용함으로써 필드를 선택적으로 만들 수 있습니다.
  • 중요: response_format이 올바르게 작동하려면 additionalProperties를 false로 설정해야 합니다
  • 중요: response_format이 올바르게 작동하려면 strict를 true로 설정해야 합니다