분류 호출이 라벨 대신 확률을 돌려받는 OpenAI Decisions API

고객 문의 라우팅 호출을 OpenAI Decisions API로 옮길 때 바뀌는 요청·응답, 질문 셋을 함께 묻는 SDK 호출, 확률이 기준 아래면 other로 보내는 코드, Structured Outputs에 남길 호출을 고르는 기준을 보여 줍니다.

동딩
2026.10.12·4분 읽기·

라벨만 돌려주던 분류 호출

흔한 분류 코드는 Responses API에 Structured Outputs(출력을 내가 준 JSON 스키마에 맞추게 하는 기능)로 enum을 주고 라벨 하나를 받습니다. 모델은 확신이 없어도 enum 중 하나를 골라 적으니, 돌아온 "billing"이 거의 확실한 답인지 반반이었는지 코드는 알 수 없습니다. Decisions API는 이 일을 글을 생성하는 대신 선택지를 평가하는 호출로 바꿉니다.

"I was charged twice for my order." 문의를 부서로 보내는 호출을 옮기면 요청과 응답이 이렇게 달라집니다.

문의 라우팅 호출을 Decisions로 옮길 때 바뀌는 줄
요청·응답요청
POST /v1/responses
POST /v1/decisions
"model": "gpt-6-luna",
"input": "I was charged twice for my order.",
"text": {"format": {…enum…}}
"questions": [{
"type": "choice",
"name": "department",
"instructions": "Which department should handle this complaint?",
"choices": [ … ]
}]
"enum": ["billing", "technical",
"shipping", "other"]
"choices": [
{"value": "billing",
"description": "Payments, invoices, and refunds."},
{"value": "technical",
"description": "Problems using the product."},
{"value": "shipping",
"description": "Delivery and tracking."},
{"value": "other",
"description": "Requests outside these categories."}
]
{"department": "billing"}
"answers": [{
"type": "choice",
"name": "department",
"choice": "billing",
"probabilities": [
{"value": "billing", "probability": 0.95},
{"value": "technical", "probability": 0.02},
{"value": "shipping", "probability": 0.01},
{"value": "other", "probability": 0.02}
],
"confidence": 0.93
}]
요청

엔드포인트가 /v1/decisions로 바뀌고, 스키마 대신 questions 배열에 질문을 적습니다.

선택지

enum 문자열 목록이 value·description 객체로 바뀝니다. description에는 언제 그 선택지를 고르는지 적습니다.

응답

라벨 하나 대신 선택지마다 probability가 붙은 목록과 confidence가 옵니다.

system 프롬프트에 적어 두던 분류 기준은 질문의 instructions와 선택지의 description으로 옮깁니다. Decisions는 입력으로 문자열이나 user 메시지만 받기 때문입니다.

같은 문의에 질문 셋을 한 번에

질문은 답의 모양에 따라 셋으로 나뉩니다. 같은 문의에서 부서만이 아니라 환불을 요구하는지, 해지 의사가 얼마나 강한지도 함께 물을 수 있습니다.

predicate조건이 참인가환불을 요구하는가probability
choice하나를 고른다결제·기술·배송·기타 중 어느 부서로choice · probabilities
score등급에 맞춘다해지 의사가 없음·고민·해지 중 어디쯤score · probabilities
같은 문의에 던지는 질문 셋과 돌아오는 필드

서로 기대지 않는 질문은 한 요청의 questions에 넣고, 답은 질문 순서대로 옵니다. score는 등급 번호(0부터)의 확률 가중 평균이라 등급 사이 값으로 나옵니다.

ts
import OpenAI from "openai";
const client = new OpenAI();
const decision = await client.decisions.create({
model: "gpt-6-luna",
input: "I was charged twice for my order.",
questions: [
{
type: "choice",
name: "department",
instructions: "Which department should handle this complaint?",
choices: [
{ value: "billing", description: "Payments, invoices, and refunds." },
{ value: "technical", description: "Problems using the product." },
{ value: "shipping", description: "Delivery and tracking." },
{ value: "other", description: "Requests outside these categories." },
],
},
{
type: "predicate",
name: "wants_refund",
instructions: "Is the customer asking for a refund?",
},
{
type: "score",
name: "cancel_intent",
instructions: "How strongly does the customer intend to cancel?",
levels: [
{ label: "None", description: "No sign of leaving." },
{ label: "Considering", description: "Hints they might leave." },
{ label: "Cancelling", description: "Says they will cancel." },
],
},
],
});

환불 여부에 따라 다음 질문이 달라진다면(환불이면 사유를 묻기) 요청을 나눕니다.

확률이 기준 아래면 other로

위 문의는 billing에 확률이 몰려 바로 결제팀으로 가면 됩니다. 하지만 "두 번 결제됐는데 앱에서 환불 버튼이 안 눌린다"처럼 결제와 기술에 걸친 문의는 확률이 둘로 갈릴 수 있습니다. 가장 높은 확률이 기준보다 낮으면 other로 돌려 사람이 보게 합니다.

ts
const MIN_PROB = 0.8; // 라벨 붙인 지난 문의로 고른 값
const [dept] = decision.answers; // 답은 질문 순서대로 온다
let queue = "other"; // refusal도 여기로
if (dept.type === "choice") {
const top = Math.max(...dept.probabilities.map((p) => p.probability));
if (top >= MIN_PROB) queue = String(dept.choice);
}
// queue가 "other"면 사람이 보는 검토 큐로 보낸다

기준값은 라벨을 붙인 지난 문의로, 엉뚱한 팀에 배정할 때와 사람이 괜히 볼 때의 비용을 따져 정합니다. refusal(모델이 그 질문에 답하지 않음)은 질문 하나에만 붙어서, 부서 질문이 거절돼도 환불·해지 질문은 답을 받습니다.

옮길 호출과 남길 호출

Decisions는 입력 토큰에만 100만 개당 $0.10을 받고 출력·캐시 요금이 없습니다. 같은 모델을 Responses로 부르면 출력 요금이 따로 붙습니다.

  • 돌려받는 것스키마에 맞춘 JSON확률·선택·점수
  • 확신 정도없음probabilities·confidence
  • 값(gpt-6-luna)입력 $0.10, 출력 $0.50입력 $0.10만
  • 지시 넣는 곳system·developer 메시지질문의 instructions
  • 이미지URL·파일 ID도 됨base64만, 128장까지
  • 상태정식공개 베타
분류 호출을 Decisions로 옮기면 달라지는 것

옮길 호출은 답이 선택지 하나, 예·아니오, 등급으로 끝나고 그 답으로 코드가 갈라지는 곳입니다. 문의 라우팅이나 환불 요청 감지처럼 지금 enum 하나를 받아 switch로 나누는 호출이 여기에 듭니다. 답에서 주문 번호 같은 필드를 뽑거나 고객에게 보낼 답장을 써야 하면 Structured Outputs에 두고, 도구를 부를 인자가 필요하면 function calling에 둡니다. 옮길 때는 지난 문의에 라벨을 붙여 기준값부터 정하면, 기준 아래로 떨어지는 비율이 곧 사람이 볼 양이 됩니다.

Comments

댓글

powered by giscus ↗