게시일: 2025년 5월 13일
대규모 언어 모델 (LLM)은 때때로 긴 대답을 하는 것으로 악명이 높습니다. 모델에 'true' 또는 'false'로만 대답하라고 말하더라도 모델은 다음과 같이 친근한 출력과 요청한 것 이상의 대답을 할 수 있습니다. '물론입니다. 대답은 true입니다.'
이 문제를 해결하기 위해 Prompt API를 사용하면 LanguageModel.prompt()
및 LanguageModel.promptStreaming()
메서드에 JSON 스키마를 전달하여 모델 응답의 JSON 출력 형식을 지정할 수 있습니다. 구조화된 출력 지원은 Chrome 버전 137부터 제공됩니다.
JSON 스키마란 무엇인가요?
JSON 스키마는 대규모로 JSON 데이터 일관성, 유효성, 상호 운용성을 지원하는 어휘입니다. 데이터 교환과 관련하여 JSON 스키마는 JSON 데이터의 구조와 규칙을 정의하는 강력한 표준으로 돋보입니다. 키워드 집합을 사용하여 데이터의 속성을 정의합니다.
JSON 스키마는 구조화된 출력을 보장하는 업계 표준이며 OpenAI API 및 Gemini API 등에서 사용됩니다.
예를 들어 Mastodon과 같은 온라인 소셜 네트워크의 게시물에 최대 3개의 해시태그를 할당하도록 모델에 프롬프트를 표시합니다. 이상적인 출력은 다음 JSON과 비슷하게 표시될 수 있습니다.
{
"hashtags": [
"#pottery",
"#dyi"
]
}
이 요청된 출력 객체 모양에 해당하는 JSON 스키마는 다음과 같습니다.
{
"type": "object",
"properties": {
"hashtags": {
"type": "array",
"maxItems": 3,
"items": {
"type": "string",
"pattern": "^#[^\\s#]+$"
}
}
},
"required": ["hashtags"],
"additionalProperties": false
}
이 JSON 스키마는 다음 제약 조건이 있는 hashtags
필드를 포함해야 하는 객체의 구조를 정의합니다.
"type": "object"
: 루트 값은 JSON 객체여야 합니다."properties": { "hashtags": ... }
: 객체에hashtags
이라는 속성이 있을 수 있습니다 (이 경우 있어야 함)."hashtags":
"type": "array"
: 값은 배열이어야 합니다."maxItems": 3
: 배열에는 최대 3개의 항목이 포함될 수 있습니다."items": { "type": "string", "pattern": "^#[^\\s#]+$" }
: 배열의 각 항목은 지정된 정규 표현식 패턴과 일치하는 문자열이어야 합니다.^#[^\\s#]+$
:^#
→#
로 시작해야 합니다.[^\\s#]+
→ 공백 (\s
) 또는 다른#
이 아닌 하나 이상의 문자가 뒤에 나옵니다.$
→ 여기에서 끝나야 합니다.
"required": ["hashtags"]
: 객체에hashtags
속성이 포함되어야 합니다."additionalProperties": false
: 해시태그 외 다른 속성은 허용되지 않습니다.
형식의 기능에 관한 전체 설명은 JSON 스키마 기본사항 문서를 참고하세요.
실제로 LLM은 JSON 스키마를 만드는 데 매우 유용합니다. 프롬프트에 자연어로 제약 조건을 설명하고 유효한 JSON 객체 예시를 제공하면 절반은 완료된 것입니다. 그런 다음 생성된 JSON 스키마에 대해 JSON 스키마 유효성 검사기(예: 온라인 Newtonsoft JSON 스키마 유효성 검사기) 중 하나를 사용하여 JSON 객체의 유효성을 검사할 수 있습니다.
JSON 스키마를 프롬프트 API에 전달
모델이 요청된 JSON 스키마를 준수하도록 하려면 JSON 스키마를 prompt()
또는 promptStreaming()
메서드의 옵션 객체에 responseConstraint
필드의 값으로 전달해야 합니다.
다음은 모델이 true
또는 false
으로 응답하여 마스토돈 게시물과 같은 메시지가 도자기에 관한 것인지 분류하는 매우 기본적인 JSON 스키마 예시입니다.
const session = await LanguageModel.create();
const schema = {
"type": "boolean"
};
const post = "Mugs and ramen bowls, both a bit smaller than intended- but that's
how it goes with reclaim. Glaze crawled the first time around, but pretty happy
with it after refiring.";
const result = await session.prompt(
`Is this post about pottery?\n\n${post}`,
{
responseConstraint: schema,
}
);
console.log(JSON.parse(result));
// true
예측 가능한 출력 지원
프롬프트 API의 구조화된 출력 지원을 통해 LLM의 대답을 훨씬 더 예측할 수 있습니다. 이제 개발자는 마크다운 응답이나 기타 후처리에서 객체를 추출하는 대신 모델의 응답이 유효한 JSON이라고 가정할 수 있습니다.
이를 통해 로컬 클라이언트 측 AI 실행의 모든 이점을 누리면서 내장 AI가 클라우드 기반 API에 한층 더 가까워집니다.