Skip to main content
PromptQuorumPromptQuorum
Home/Prompt Engineering/Structured Output ๋ฐ JSON Mode ์ตœ๊ณ ์˜ ๋„๊ตฌ (2026)
Tools & Platforms

Structured Output ๋ฐ JSON Mode ์ตœ๊ณ ์˜ ๋„๊ตฌ (2026)

ยท10๋ถ„ ๋ถ„๋Ÿ‰ยทBy Hans Kuepper ยท Founder of PromptQuorum, multi-model AI dispatch tool ยท PromptQuorum

2026๋…„ 6๊ฐ€์ง€ ๋„๊ตฌ๊ฐ€ structured output์„ ์ง€๋ฐฐํ•ฉ๋‹ˆ๋‹ค: Pydantic ์ถ”์ถœ์„ ์œ„ํ•œ Instructor, constrained decoding์„ ์œ„ํ•œ Outlines, type-safe ์—์ด์ „ํŠธ๋ฅผ ์œ„ํ•œ Pydantic AI, ํ†ตํ•ฉ API๋ฅผ ์œ„ํ•œ LangChain, ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ๊ธฐ๋ฐ˜ ์ถ”์ถœ์„ ์œ„ํ•œ Marvin, ๋ฉ€ํ‹ฐ ๋ชจ๋ธ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ PromptQuorum. ๊ฐ ๋„๊ตฌ๋Š” ์›Œํฌํ”Œ๋กœ์šฐ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋ธ์ด ์‹คํ–‰๋˜๋Š” ์œ„์น˜์— ๋”ฐ๋ผ ์„ ํƒํ•˜์‹ญ์‹œ์˜ค: ์žฌ์‹œ๋„ ๋ฐ type safety๊ฐ€ ์žˆ๋Š” API-first ์›Œํฌํ”Œ๋กœ์šฐ์—๋Š” Instructor์™€ Pydantic AI; ๋กœ์ปฌ ๋ชจ๋ธ์—์„œ ๋ณด์žฅ๋œ ์Šคํ‚ค๋งˆ ์ค€์ˆ˜์—๋Š” Outlines; ์ด๋ฏธ chains ๋˜๋Š” ์—์ด์ „ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํŒ€์—๋Š” LangChain; ๋น ๋ฅธ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ๊ธฐ๋ฐ˜ ํ”„๋กœํ† ํƒ€์ž… ์ œ์ž‘์—๋Š” Marvin; ํ”„๋กœ๋•์…˜ ์ „ GPT, Claude, Gemini์—์„œ ์ผ๊ด€์„ฑ ํ…Œ์ŠคํŠธ์—๋Š” PromptQuorum.

Key Takeaways

  • Instructor ๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๋Š” Python ์˜ต์…˜ โ€” Pydantic ์Šคํ‚ค๋งˆ, ์ž๋™ ์žฌ์‹œ๋„, ๋ชจ๋“  LLM API ์ง€์›
  • Outlines constrained decoding์„ ํ†ตํ•ด ๋กœ์ปฌ ๋ชจ๋ธ์—์„œ ์Šคํ‚ค๋งˆ ์ค€์ˆ˜๋ฅผ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค โ€” ํ™˜๊ฐ ์œ„ํ—˜ ์ œ๋กœ
  • Pydantic AI ์ผ๋ฅ˜ structured output์œผ๋กœ ๋ฉ€ํ‹ฐ ํ„ด ์—์ด์ „ํŠธ ๋Œ€ํ™”์— type safety๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค
  • LangChain์˜ with_structured_output() OpenAI, Anthropic, Google API์—์„œ structured output์„ ํ†ตํ•ฉํ•ฉ๋‹ˆ๋‹ค
  • Marvin ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น ๋ฅธ ํ”„๋กœํ† ํƒ€์ž… ์ œ์ž‘ โ€” Python ํ•จ์ˆ˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ํƒ€์ž…์ด ์žˆ๋Š” LLM ํ˜ธ์ถœ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค
  • PromptQuorum ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ ์ „ ๋ชจ๋“  ๋ชจ๋ธ์—์„œ structured output ์ผ๊ด€์„ฑ์„ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค

๐Ÿ’ก TL;DR

์žฌ์‹œ๋„์™€ ํ•จ๊ป˜ Python ์ถ”์ถœ์—๋Š” Instructor๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. ๋กœ์ปฌ ๋ชจ๋ธ์—์„œ ๋ณด์žฅ๋œ ์Šคํ‚ค๋งˆ ์ค€์ˆ˜์—๋Š” Outlines๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. type-safe ๋ฉ€ํ‹ฐ ํ„ด ์—์ด์ „ํŠธ์—๋Š” Pydantic AI๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. ์ด๋ฏธ ํ•ด๋‹น ์ƒํƒœ๊ณ„์— ์žˆ๋‹ค๋ฉด LangChain์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. ๋น ๋ฅธ ํ”„๋กœํ† ํƒ€์ž… ์ œ์ž‘์—๋Š” Marvin์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. ํ”„๋กœ๋•์…˜ ์ „ ๋ชจ๋“  ๋ชจ๋ธ์—์„œ structured output ์ผ๊ด€์„ฑ์„ ํ…Œ์ŠคํŠธํ•˜๋ ค๋ฉด PromptQuorum์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

โšก Quick Facts

  • ยทInstructor๋Š” 20๊ฐœ ์ด์ƒ์˜ LLM ๊ณต๊ธ‰์ž๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค (OpenAI, Anthropic, Google, Ollama, vLLM)
  • ยทOutlines๋Š” ํ† ํฐ ์ƒ์„ฑ ์‹œ ์Šคํ‚ค๋งˆ ์ค€์ˆ˜๋ฅผ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค (ํ™˜๊ฐ 0%)
  • ยทPydantic AI๋Š” ์™„์ „ํ•œ async๋กœ ์‹คํ–‰๋˜๋ฉฐ ๋ฉ€ํ‹ฐ ํ„ด ๋Œ€ํ™” ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค
  • ยทLangChain์˜ with_structured_output()์€ 6๊ฐœ ์ด์ƒ์˜ ์ฃผ์š” ๊ณต๊ธ‰์ž API๋ฅผ ๊ท ์ผํ•˜๊ฒŒ ๋ž˜ํ•‘ํ•ฉ๋‹ˆ๋‹ค
  • ยทMarvin ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ๊ตฌ๋ฌธ: @marvin.fn ์‹œ๊ทธ๋‹ˆ์ฒ˜ โ†’ ์ž๋™ LLM ํ˜ธ์ถœ ๋ฐ”์ธ๋”ฉ
  • ยทPromptQuorum์€ ์ผ๊ด€์„ฑ์„ ์œ„ํ•ด 25๊ฐœ ์ด์ƒ์˜ ๋ชจ๋ธ์—์„œ ๋™์ผํ•œ ํ”„๋กฌํ”„ํŠธ๋ฅผ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค

๊ฐ ๋„๊ตฌ๊ฐ€ ํ•ด๊ฒฐํ•˜๋Š” ๋ฌธ์ œ

Structured output์€ ์„ธ ๊ฐ€์ง€ ์ƒํ˜ธ ์—ฐ๊ด€๋œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค: ์Šคํ‚ค๋งˆ ์ •์˜, API ์ค€์ˆ˜, ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ. ์„œ๋กœ ๋‹ค๋ฅธ ๋„๊ตฌ๋Š” ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ๊ณต๊ฒฉํ•ฉ๋‹ˆ๋‹ค. Instructor๋Š” ์žฌ์‹œ๋„์™€ ํ•จ๊ป˜ Python์—์„œ ์„ธ ๊ฐ€์ง€๋ฅผ ๋ชจ๋‘ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. Outlines๋Š” constrained decoding์„ ํ†ตํ•ด ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋‹จ๊ณ„๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. Pydantic AI๋Š” ์—์ด์ „ํŠธ์— type safety๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. LangChain์€ ๊ณต๊ธ‰์ž API๋ฅผ ๋ž˜ํ•‘ํ•ฉ๋‹ˆ๋‹ค. Marvin์€ ๊ฐœ๋ฐœ์ž ์†๋„๋ฅผ ์šฐ์„ ์‹œํ•ฉ๋‹ˆ๋‹ค. PromptQuorum์€ ๋ชจ๋“  ๋ชจ๋ธ์—์„œ ์ผ๊ด€์„ฑ์„ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œInstructorOutlinesPydantic AILangChainMarvin
์Šคํ‚ค๋งˆ ์ •์˜Pydantic ๋ชจ๋ธJSON Schema / GBNFPydantic ๋ชจ๋ธ๋„๊ตฌ ์ •์˜Python ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ
API ํ˜ธ์ถœ์—์„œ ๊ฐ•์ œ์žฌ์‹œ๋„ + ์œ ํšจ์„ฑ ๊ฒ€์‚ฌํ† ํฐ ์ˆ˜์ค€ ์ œ์•ฝAPI + ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ณต๊ธ‰์ž JSON ๋ชจ๋“œํ”„๋กฌํ”„ํŠธ ์ฃผ์ž…
์‘๋‹ต ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ์ž๋™์ƒ์„ฑ ์‹œ ๋ณด์žฅ์œ ํ˜• ๊ฒ€์ฆ๋จ์ˆ˜๋™์ž๋™

Instructor: Pydantic ์ถ”์ถœ

Instructor๋Š” ๊ฐ€์žฅ ๋งŽ์ด ์ฑ„ํƒ๋œ structured output ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  LLM API โ€” OpenAI GPT-4.5, Claude 4.8, Gemini, Ollama, vLLM โ€” ์„ ๋ž˜ํ•‘ํ•˜๊ณ  ์ผ๋ฐ˜ ํ…์ŠคํŠธ ๋Œ€์‹  ๊ฒ€์ฆ๋œ Pydantic ๋ชจ๋ธ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. Instructor๋Š” ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ฐ€ ์‹คํŒจํ•  ๋•Œ ์ž๋™์œผ๋กœ ์žฌ์‹œ๋„๋ฅผ ๊ด€๋ฆฌํ•˜์—ฌ ์ถ”๊ฐ€์ ์ธ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์—†์ด ํ”„๋กœ๋•์…˜์— ์ ํ•ฉํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

  • 20๊ฐœ ์ด์ƒ์˜ LLM ๊ณต๊ธ‰์ž์™€ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค (OpenAI, Anthropic, Google, Ollama/vLLM์„ ํ†ตํ•œ ๋กœ์ปฌ ๋ชจ๋ธ)
  • Pydantic v2 ์Šคํ‚ค๋งˆ: ์Šคํ‚ค๋งˆ์— ํ†ตํ•ฉ๋œ ํƒ€์ž… ํžŒํŠธ, ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๊ทœ์น™, docstring ์„ค๋ช…
  • ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์‹คํŒจ ์‹œ backoff์™€ ํ•จ๊ป˜ ์ž๋™ ์žฌ์‹œ๋„ โ€” ์ˆ˜๋™ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๋ถˆํ•„์š”
  • Python๊ณผ TypeScript์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค (Node.js ์–ด๋Œ‘ํ„ฐ๋ฅผ ํ†ตํ•ด)
  • Open-source Apache 2.0, ํ™œ๋ฐœํžˆ ์œ ์ง€ ๊ด€๋ฆฌ๋จ
  • ๊ฐ€๊ฒฉ: ๋ฌด๋ฃŒ (LLM API ํ˜ธ์ถœ ์ด์™ธ์˜ ์ถ”๊ฐ€ ๋น„์šฉ ์—†์Œ)
python
import instructor
from pydantic import BaseModel
from openai import OpenAI

class User(BaseModel):
    name: str
    age: int

client = instructor.from_openai(OpenAI())
user = client.chat.completions.create(
    model="gpt-4o",
    response_model=User,
    messages=[{"role": "user", "content": "Extract: John is 25 years old"}]
)
# user.name == "John", user.age == 25

Outlines: constrained decoding

Outlines๋Š” constrained decoding์„ ํ†ตํ•ด ํ† ํฐ ์ƒ์„ฑ ์‹œ ์Šคํ‚ค๋งˆ ์ค€์ˆ˜๋ฅผ ๊ฐ•์ œํ•ฉ๋‹ˆ๋‹ค. ํ† ํฐ์„ ์ƒ์„ฑํ•œ ๋‹ค์Œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌํ•˜๋Š” ๋Œ€์‹ , Outlines๋Š” ๊ฐ ๋‹จ๊ณ„์—์„œ ์œ ํšจํ•œ ํ† ํฐ์„ ์Šคํ‚ค๋งˆ์™€ ์ผ์น˜ํ•˜๋„๋ก ์ œํ•œํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํ™˜๊ฐ ์œ„ํ—˜ ์ œ๋กœ๋กœ 100% ์Šคํ‚ค๋งˆ ์ค€์ˆ˜๋ฅผ ๋ณด์žฅํ•˜์—ฌ ๋กœ์ปฌ ๋ชจ๋ธ์— ์ด์ƒ์ ์ž…๋‹ˆ๋‹ค.

  • llama.cpp, vLLM, transformers, NVIDIA NIM ๋ฐ ๋ชจ๋“  HuggingFace ๋ชจ๋ธ๊ณผ ํ•จ๊ป˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค
  • JSON Schema ๋˜๋Š” GBNF (GGML BNF) ํ˜•์‹์˜ ์Šคํ‚ค๋งˆ ์ •์˜
  • ๋ณด์žฅ๋œ ์Šคํ‚ค๋งˆ ์ค€์ˆ˜ โ€” ์ƒ์„ฑ ํ›„ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋˜๋Š” ์žฌ์‹œ๋„ ๋ถˆํ•„์š”
  • ์žฌ์‹œ๋„ ๊ธฐ๋ฐ˜ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ณด๋‹ค ๋น ๋ฆ…๋‹ˆ๋‹ค (๋‚ญ๋น„๋˜๋Š” ํ† ํฐ ๊ฐ์†Œ)
  • ๋ฌด๋ฃŒ ๋ฐ open-source (Apache 2.0)
  • ๋กœ์ปฌ ๋ฐฐํฌ ๋ฐ ๋น„์šฉ์— ๋ฏผ๊ฐํ•œ ์›Œํฌํ”Œ๋กœ์šฐ์— ์ด์ƒ์ 

Pydantic AI: type-safe ์—์ด์ „ํŠธ

Pydantic AI๋Š” Pydantic ๋ชจ๋ธ์„ ๋ฉ€ํ‹ฐ ํ„ด ์—์ด์ „ํŠธ ๋Œ€ํ™”์— ๋Œ€ํ•œ ์ผ๋ฅ˜ ์ง€์›๊ณผ ๊ฒฐํ•ฉํ•˜๋Š” ์ƒˆ๋กœ์šด ํ”„๋ ˆ์ž„์›Œํฌ(2025)์ž…๋‹ˆ๋‹ค. ๊ฐ ํ„ด์—์„œ structured output์„ ๊ฐ•์ œํ•˜๋ฉด์„œ ์—์ด์ „ํŠธ ๋ฃจํ”„์— ์™„์ „ํ•œ type safety๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. Python async ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์œ„ํ•ด ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

  • Pydantic v2 ํƒ€์ž… ์‹œ์Šคํ…œ โ€” ์™„์ „ํ•œ IDE ์ง€์› ๋ฐ ํƒ€์ž… ๊ฒ€์‚ฌ
  • ๊ฐ ์—์ด์ „ํŠธ ๋‹จ๊ณ„์— ๋‚ด์žฅ๋œ Structured output
  • ๊ณ ์„ฑ๋Šฅ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•œ async-first ์„ค๊ณ„
  • OpenAI GPT, Anthropic Claude, Google Gemini ๋ฐ Ollama๋ฅผ ํ†ตํ•œ ๋กœ์ปฌ ๋ชจ๋ธ ์ง€์›
  • ํ†ตํ•ฉ ๋„๊ตฌ ํ˜ธ์ถœ โ€” ํƒ€์ž… ํžŒํŠธ๊ฐ€ ์žˆ๋Š” Python ํ•จ์ˆ˜๋กœ ๋„๊ตฌ ์ •์˜
  • ๋ฌด๋ฃŒ (LLM API ํ˜ธ์ถœ ์ด์™ธ์˜ ์ถ”๊ฐ€ ๋น„์šฉ ์—†์Œ)

LangChain: ํ†ตํ•ฉ API

LangChain 0.1+์€ ๋ชจ๋“  ์ฃผ์š” ์ฑ„ํŒ… ๋ชจ๋ธ์— with_structured_output()์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋‹จ์ผ API ๋’ค์—์„œ OpenAI, Anthropic, Google ๋ฐ ๋กœ์ปฌ ๋ชจ๋ธ์—์„œ structured output์„ ํ†ตํ•ฉํ•ฉ๋‹ˆ๋‹ค. ํŒ€์ด ์ด๋ฏธ LangChain chains ๋˜๋Š” ์—์ด์ „ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, ์ด๊ฒƒ์ด structured output์œผ๋กœ ๊ฐ€๋Š” ๊ฐ€์žฅ ์‰ฌ์šด ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค.

  • ํ†ตํ•ฉ API: ํ•˜๋‚˜์˜ .with_structured_output() ๋ฉ”์„œ๋“œ๊ฐ€ ๋ชจ๋“  ๊ณต๊ธ‰์ž์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค
  • LangChain ๋„๊ตฌ ์ •์˜๋ฅผ ๊ณต๊ธ‰์ž๋ณ„ ์Šคํ‚ค๋งˆ ํ˜•์‹์œผ๋กœ ์ž๋™ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค
  • chains, ์—์ด์ „ํŠธ ๋ฐ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์›Œํฌํ”Œ๋กœ์šฐ์™€ ์™„๋ฒฝํ•˜๊ฒŒ ํ†ตํ•ฉ๋ฉ๋‹ˆ๋‹ค
  • Pydantic ๋ชจ๋ธ, TypedDict ๋ฐ OpenAI ์Šคํ‚ค๋งˆ ์ •์˜๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค
  • LangChain ์ƒํƒœ๊ณ„์˜ ์ผ๋ถ€ (์ถ”๊ฐ€ ์ข…์†์„ฑ ์—†์Œ)
  • ์ด๋ฏธ LangChain์— ํˆฌ์žํ•œ ํŒ€์— ์ด์ƒ์ 

Marvin: ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ๊ธฐ๋ฐ˜ ์ถ”์ถœ

Marvin์€ Python ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•จ์ˆ˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ํƒ€์ž…์ด ์žˆ๋Š” LLM ํ˜ธ์ถœ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ํƒ€์ž… ํžŒํŠธ๊ฐ€ ์žˆ๋Š” ํ•จ์ˆ˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ์ •์˜ํ•˜๊ณ , @marvin.fn์œผ๋กœ ๋ฐ์ฝ”๋ ˆ์ดํŒ…ํ•˜๋ฉด Marvin์ด ์ž๋™์œผ๋กœ ํ”„๋กฌํ”„ํŠธ ์ƒ์„ฑ ๋ฐ structured output ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์•„์ด๋””์–ด์—์„œ ์ž‘๋™ํ•˜๋Š” ์ฝ”๋“œ๊นŒ์ง€ ๊ฐ€์žฅ ๋น ๋ฅธ ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค.

  • ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ๊ตฌ๋ฌธ: @marvin.fn์ด Python ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ LLM ํ”„๋กฌํ”„ํŠธ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค
  • OpenAI, Anthropic, Google ๋ฐ ๋กœ์ปฌ ๋ชจ๋ธ๊ณผ ํ•จ๊ป˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค
  • ํƒ€์ž… ํžŒํŠธ๊ฐ€ ์Šคํ‚ค๋งˆ๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค โ€” ์ตœ์†Œํ•œ์˜ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ
  • ํ†ตํ•ฉ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋ฐ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ
  • ํ”„๋กœํ† ํƒ€์ž… ์ œ์ž‘ ๋ฐ ์†Œ๊ทœ๋ชจ์—์„œ ์ค‘๊ทœ๋ชจ ์›Œํฌํ”Œ๋กœ์šฐ์— ์ ํ•ฉ
  • ๋ฌด๋ฃŒ (2026๋…„ 4์›” ๊ธฐ์ค€ ๊ฐ€๊ฒฉ ๋ฏธํ™•์ •)

PromptQuorum: ๋ฉ€ํ‹ฐ ๋ชจ๋ธ ํ…Œ์ŠคํŠธ

PromptQuorum ์ž์ฒด๋Š” structured output ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์•„๋‹ˆ๋ผ ๋ชจ๋ธ ๊ฐ„ structured output ์ผ๊ด€์„ฑ์„ ๊ฒ€์ฆํ•˜๋Š” ํ…Œ์ŠคํŠธ ํ”Œ๋žซํผ์ž…๋‹ˆ๋‹ค. ๋™์ผํ•œ ํ”„๋กฌํ”„ํŠธ๋ฅผ GPT-4.5, Claude 4.8 Opus, Gemini 3.1 Pro ๋ฐ 20๊ฐœ ์ด์ƒ์˜ ๋ชจ๋ธ์— ๋™์‹œ์— ์‹คํ–‰ํ•˜์‹ญ์‹œ์˜ค. ๋ชจ๋ธ๋ณ„ ์Šคํ‚ค๋งˆ ์ค€์ˆ˜์œจ, ์ง€์—ฐ ์‹œ๊ฐ„ ๋ฐ ๋น„์šฉ์„ ์ธก์ •ํ•ฉ๋‹ˆ๋‹ค.

  • ๋‹จ์ผ API ํ˜ธ์ถœ๋กœ ๋ฉ€ํ‹ฐ ๋ชจ๋ธ ๋””์ŠคํŒจ์น˜ โ€” 25๊ฐœ ์ด์ƒ์˜ ๋ชจ๋ธ์—์„œ ํ”„๋กฌํ”„ํŠธ๋ฅผ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค
  • Structured output ์ค€์ˆ˜ ๋ฉ”ํŠธ๋ฆญ โ€” ํ†ต๊ณผ์œจ, ์ง€์—ฐ ์‹œ๊ฐ„, ๋ชจ๋ธ๋ณ„ ๋น„์šฉ
  • ๊ท€ํ•˜์˜ ์Šคํ‚ค๋งˆ๋กœ ํ™˜๊ฐ์„ ์œ ๋ฐœํ•˜๋Š” ๋ชจ๋ธ ์‹๋ณ„ โ€” ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ๋ชจ๋ธ์— ๋ฐฐํฌํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค
  • ํ•ฉ์˜ ๋ชจ๋“œ โ€” ๋…๋ฆฝ์ ์ธ ๋ชจ๋ธ ์‹คํ–‰ ๊ฐ„์˜ ํ•ฉ์˜๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค
  • Instructor, Outlines, Pydantic AI, LangChain ๋˜๋Š” ์›์‹œ LLM API์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค
  • ๋ฌด๋ฃŒ ํ‹ฐ์–ด ์ œ๊ณต, ๊ณ ์šฉ๋Ÿ‰ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ๊ฐ€๊ฒฉ

๋‚˜๋ž€ํžˆ ๋น„๊ต

๋„๊ตฌ์ด์ƒ์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€์Šคํ‚ค๋งˆ ํ˜•์‹์–ธ์–ด๋กœ์ปฌ ๋ชจ๋ธ๊ฐ€๊ฒฉํ•™์Šต ๊ณก์„ 
InstructorPython API + ์žฌ์‹œ๋„Pydantic ๋ชจ๋ธPython/TypeScript์˜ˆ (Ollama)๋ฌด๋ฃŒ๋‚ฎ์Œ
Outlines๋กœ์ปฌ ๋ชจ๋ธ ๋ฐฐํฌJSON Schema/GBNFPython์˜ˆ (๋„ค์ดํ‹ฐ๋ธŒ)๋ฌด๋ฃŒ์ค‘๊ฐ„
Pydantic AItype-safe ์—์ด์ „ํŠธPydantic ๋ชจ๋ธPython์˜ˆ (Ollama)๋ฌด๋ฃŒ๋‚ฎ์Œ
LangChainchains + ์—์ด์ „ํŠธ๋„๊ตฌ ์ •์˜Python/JS์˜ˆ๋ฌด๋ฃŒ์ค‘๊ฐ„
Marvin๋น ๋ฅธ ํ”„๋กœํ† ํƒ€์ž… ์ œ์ž‘ํƒ€์ž… ํžŒํŠธPython์˜ˆ๋ฌด๋ฃŒ๋งค์šฐ ๋‚ฎ์Œ
PromptQuorum๋ฉ€ํ‹ฐ ๋ชจ๋ธ ํ…Œ์ŠคํŠธAPI ๋ถˆ๊ฐ€์ง€๋ก ์ API-firstOpenAI ํ”„๋ก์‹œ๋ฅผ ํ†ตํ•ด๋ฌด๋ฃŒ + ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ๋‚ฎ์Œ

์˜ฌ๋ฐ”๋ฅธ ๋„๊ตฌ ์„ ํƒ

์„ธ ๊ฐ€์ง€ ์งˆ๋ฌธ์— ๋‹ตํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์‹œ์ž‘ํ•˜์‹ญ์‹œ์˜ค: (1) ์ด๋ฏธ LangChain์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? (2) ๋กœ์ปฌ ๋ชจ๋ธ ์ง€์›์ด ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ? (3) ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋ณต์žก๋„๋Š” ์–ผ๋งˆ๋‚˜ ๋ฉ๋‹ˆ๊นŒ?

  • Instructor๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค: Python API๋ฅผ ๊ตฌ์ถ•ํ•˜๊ณ  ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์‹คํŒจ ์‹œ ์ž๋™ ์žฌ์‹œ๋„๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ. ๊ฐ€์žฅ ์ข‹์€ ๋ฒ”์šฉ ์˜ต์…˜์ž…๋‹ˆ๋‹ค.
  • Outlines๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค: ๋กœ์ปฌ ๋ชจ๋ธ(llama.cpp, vLLM)์„ ๋ฐฐํฌํ•˜๊ณ  ์ƒ์„ฑ ์‹œ ๋ณด์žฅ๋œ ์Šคํ‚ค๋งˆ ์ค€์ˆ˜๋ฅผ ์›ํ•˜๋Š” ๊ฒฝ์šฐ.
  • Pydantic AI๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค: ๋ชจ๋“  ๋‹จ๊ณ„์—์„œ type safety์™€ ํ•จ๊ป˜ ๋ฉ€ํ‹ฐ ํ„ด ์—์ด์ „ํŠธ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒฝ์šฐ.
  • LangChain์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค: ์ด๋ฏธ LangChain chains ๋˜๋Š” ์—์ด์ „ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด โ€” with_structured_output()์ด ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ์ถ”๊ฐ€์ž…๋‹ˆ๋‹ค.
  • Marvin์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค: ๋น ๋ฅด๊ฒŒ ํ”„๋กœํ† ํƒ€์ž…์„ ๋งŒ๋“ค๊ณ  ๋ณต์žกํ•œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ โ€” ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๊ฐ€ ๊ฐ€์žฅ ๋น ๋ฅธ ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค.
  • PromptQuorum์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค: ํ”„๋กœ๋•์…˜ ์ „ GPT, Claude, Gemini์—์„œ structured output ์ผ๊ด€์„ฑ์„ ํ…Œ์ŠคํŠธํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ.

Structured output ๋‹จ๊ณ„๋ณ„ ์ถ”๊ฐ€

  1. 1
    ์ถœ๋ ฅ ์Šคํ‚ค๋งˆ ์ •์˜ โ€” LLM์ด ๋ฐ˜ํ™˜ํ•˜๊ธฐ๋ฅผ ์›ํ•˜๋Š” ํ•„๋“œ, ์œ ํ˜• ๋ฐ ์ œ์•ฝ ์กฐ๊ฑด์„ ์„ค๋ช…ํ•˜๋Š” Pydantic ๋ชจ๋ธ(Python), TypeScript ์ธํ„ฐํŽ˜์ด์Šค ๋˜๋Š” JSON Schema๋ฅผ ๋งŒ๋“œ์‹ญ์‹œ์˜ค.
  2. 2
    ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ ํƒ โ€” Python API์—๋Š” Instructor, ๋กœ์ปฌ ๋ชจ๋ธ์—๋Š” Outlines, ์—์ด์ „ํŠธ์—๋Š” Pydantic AI, ์ด๋ฏธ ์‚ฌ์šฉ ์ค‘์ด๋ฉด LangChain, ๋น ๋ฅธ ์†๋„์—๋Š” Marvin.
  3. 3
    LLM ํ˜ธ์ถœ ์„ค์น˜ ๋ฐ ๋ž˜ํ•‘ โ€” `pip install instructor` (Python), ๊ทธ๋Ÿฐ ๋‹ค์Œ ์Šคํ‚ค๋งˆ๋ฅผ API ํ˜ธ์ถœ์— ์ „๋‹ฌํ•˜์‹ญ์‹œ์˜ค. Instructor๊ฐ€ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ์™€ ์žฌ์‹œ๋„๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  4. 4
    PromptQuorum์œผ๋กœ ํ…Œ์ŠคํŠธ โ€” PromptQuorum์— ๋ฐฐํฌํ•˜๊ณ  GPT, Claude, Gemini์—์„œ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์‹คํ–‰ํ•˜์‹ญ์‹œ์˜ค. ๋ชจ๋ธ๋ณ„ ์Šคํ‚ค๋งˆ ์ค€์ˆ˜์œจ์„ ์ธก์ •ํ•˜์‹ญ์‹œ์˜ค.
  5. 5
    ์‹คํŒจ์— ๋”ฐ๋ผ ์Šคํ‚ค๋งˆ ๊ฐœ์„  โ€” ๋ชจ๋ธ์ด ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ์— ์‹คํŒจํ•˜๋ฉด ํ”„๋กฌํ”„ํŠธ์— ์˜ˆ์‹œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์Šคํ‚ค๋งˆ ์ œ์•ฝ ์กฐ๊ฑด์„ ์กฐ์ •ํ•˜์‹ญ์‹œ์˜ค. ๋ชจ๋“  ๋ชจ๋ธ์ด ํ†ต๊ณผํ•  ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜์‹ญ์‹œ์˜ค.

Structured output ์ผ๋ฐ˜์ ์ธ ์‹ค์ˆ˜

โŒ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์—†์ด JSON ๋ชจ๋“œ ์‚ฌ์šฉ

Why it hurts: API JSON ๋ชจ๋“œ(OpenAI response_format, Anthropic JSON ์ œ์–ด)๋Š” JSON ๊ตฌ์กฐ๋ฅผ ์ œ์•ˆํ•  ๋ฟ์ž…๋‹ˆ๋‹ค โ€” ์Šคํ‚ค๋งˆ๊ฐ€ ์ค€์ˆ˜๋  ๊ฒƒ์„ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ชจ๋ธ์€ ์—ฌ์ „ํžˆ ํ•„๋“œ ์ด๋ฆ„๊ณผ ์œ ํ˜•์„ ํ™˜๊ฐํ•ฉ๋‹ˆ๋‹ค.

Fix: ํ•ญ์ƒ ์ƒ์œ„์— ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค: Instructor, Outlines ๋˜๋Š” Pydantic AI๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. JSON ๋ชจ๋“œ๋งŒ ์‹ ๋ขฐํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. PromptQuorum์œผ๋กœ ํ…Œ์ŠคํŠธํ•˜์—ฌ ์ค€์ˆ˜ ์‹คํŒจ๋ฅผ ๊ฐ์ง€ํ•˜์‹ญ์‹œ์˜ค.

โŒ ๋„ˆ๋ฌด ์—„๊ฒฉํ•œ ์Šคํ‚ค๋งˆ ์„ค๊ณ„

Why it hurts: ๋„ˆ๋ฌด ์ œํ•œ์ ์ธ ์Šคํ‚ค๋งˆ(์ž‘์€ ์—ด๊ฑฐํ˜• ๋ชฉ๋ก, ๋งค์šฐ ๊ตฌ์ฒด์ ์ธ regex ํŒจํ„ด)๋Š” LLM์ด ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ์— ์ž์ฃผ ์‹คํŒจํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ๋†’์€ ์žฌ์‹œ๋„ ํšŸ์ˆ˜๋Š” ํ† ํฐ๊ณผ ๋น„์šฉ์„ ๋‚ญ๋น„ํ•ฉ๋‹ˆ๋‹ค.

Fix: PromptQuorum์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋ธ ๊ฐ„ ์Šคํ‚ค๋งˆ ์—„๊ฒฉ๋„๋ฅผ ํ…Œ์ŠคํŠธํ•˜์‹ญ์‹œ์˜ค. 95% ์ด์ƒ์˜ ์ค€์ˆ˜์œจ์„ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์ œ์•ฝ ์กฐ๊ฑด์„ ์™„ํ™”ํ•˜์‹ญ์‹œ์˜ค. ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ํ•„์ˆ˜ ํ•„๋“œ ๋Œ€์‹  ์„ ํƒ์  ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

โŒ ๋กœ์ปฌ ๋ชจ๋ธ๊ณผ API ๋ชจ๋ธ ๊ฐ„์˜ ์ฐจ์ด๋ฅผ ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š์Œ

Why it hurts: llama.cpp์˜ Outlines๋Š” GPT-4.5์˜ Instructor์™€ ๋‹ค๋ฅด๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์Šคํ‚ค๋งˆ ์ค€์ˆ˜์œจ์€ ๋ชจ๋ธ๋งˆ๋‹ค ๋‹ค๋ฆ…๋‹ˆ๋‹ค. GPT๋งŒ์„ ์œ„ํ•ด ๊ตฌ์ถ•ํ•œ ๋‹ค์Œ ๋กœ์ปฌ๋กœ ๋ฐฐํฌํ•˜๋ฉด ํ”„๋กœ๋•์…˜ ์‹คํŒจ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

Fix: ์˜ˆ์ƒํ•˜๋Š” ๋ชจ๋“  ๋ชจ๋ธ ๋ฐฑ์—”๋“œ๋ฅผ ์ผ์ฐ ํ…Œ์ŠคํŠธํ•˜์‹ญ์‹œ์˜ค. PromptQuorum์„ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ์ปฌ ๋ชจ๋ธ(vLLM), API(OpenAI, Anthropic) ๋ฐ ์˜คํ”ˆ ์†Œ์Šค(Gemini)์—์„œ ๋™์ผํ•œ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์‹คํ–‰ํ•˜์‹ญ์‹œ์˜ค.

โŒ ์ง€์—ฐ ์‹œ๊ฐ„ ๋ฐ ํ† ํฐ ๋น„์šฉ ์˜ํ–ฅ ๋ฌด์‹œ

Why it hurts: ์žฌ์‹œ๋„๊ฐ€ ์žˆ๋Š” structured output์€ ๋” ๋งŽ์€ ํ† ํฐ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. Instructor๋Š” ์‹คํŒจ ์‹œ ์žฌ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. Outlines์˜ constrained decoding์€ ์ž์œ  ์ƒ์„ฑ๋ณด๋‹ค ๋А๋ฆฝ๋‹ˆ๋‹ค. ๋ชจ๋ธ๋ณ„ ๋น„์šฉ์„ ์ธก์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Fix: PromptQuorum์˜ ๋น„์šฉ ์ถ”์ ์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. ๋ชจ๋ธ ๊ฐ„ ์ง€์—ฐ ์‹œ๊ฐ„์„ ๋น„๊ตํ•˜์‹ญ์‹œ์˜ค. ์˜ˆ์‚ฐ์— ๋ฏผ๊ฐํ•œ ์›Œํฌํ”Œ๋กœ์šฐ์—๋Š” Outlines(์žฌ์‹œ๋„ ์—†์Œ)๋ฅผ ์„ ํ˜ธํ•˜์‹ญ์‹œ์˜ค. ์ •ํ™•๋„๋ฅผ ์œ„ํ•ด์„œ๋Š” Instructor์˜ ์žฌ์‹œ๋„ ๋น„์šฉ์„ ๋ฐ›์•„๋“ค์ด์‹ญ์‹œ์˜ค.

โŒ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋ฐฉ๋ฒ• ํ˜ผํ•ฉ (์ผ๊ด€์„ฑ ์—†์Œ)

Why it hurts: ์ผ๋ถ€ ์š”์ฒญ์€ Instructor๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ๋‹ค๋ฅธ ์š”์ฒญ์€ ์›์‹œ JSON ํŒŒ์‹ฑ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ถ€ ๋ชจ๋ธ์€ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋˜๊ณ , ๋‹ค๋ฅธ ๋ชจ๋ธ์€ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํ”„๋กœ๋•์…˜์—์„œ ์ผ๊ด€์„ฑ ์—†๋Š” ์˜ค๋ฅ˜๋ฅผ ์ดˆ๋ž˜ํ•ฉ๋‹ˆ๋‹ค.

Fix: ์ฝ”๋“œ๋ฒ ์ด์Šค๋‹น ํ•˜๋‚˜์˜ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์ ‘๊ทผ ๋ฐฉ์‹์œผ๋กœ ํ‘œ์ค€ํ™”ํ•˜์‹ญ์‹œ์˜ค. ๋ชจ๋“  ์š”์ฒญ์ด Instructor๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, ๋ชจ๋‘ Outlines๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ผ๊ด€์„ฑ์€ ๋””๋ฒ„๊น… ์‹œ๊ฐ„์„ 10๋ฐฐ ์ค„์ž…๋‹ˆ๋‹ค.

๊ด€๋ จ ์ž๋ฃŒ

LLM์—์„œ structured output์ด๋ž€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

Structured output์€ LLM ์‘๋‹ต์„ ํŠน์ • ์Šคํ‚ค๋งˆ(JSON ํ˜•์‹, ์ •์˜๋œ ํ•„๋“œ, ์œ ํ˜• ์ œ์•ฝ ์กฐ๊ฑด)๋กœ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค. ์ž์œ  ํ˜•์‹ ํ…์ŠคํŠธ ์‘๋‹ต ๋Œ€์‹ , structured output์€ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์—†์ด ์ฝ”๋“œ๊ฐ€ ์ง์ ‘ ํŒŒ์‹ฑํ•˜๊ณ  ์œ ํšจ์„ฑ ๊ฒ€์‚ฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

Python ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์–ด๋–ค ๋„๊ตฌ๊ฐ€ ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๊นŒ?

Instructor๋Š” ๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๋Š” Python ์˜ต์…˜์ž…๋‹ˆ๋‹ค. Pydantic ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์Šคํ‚ค๋งˆ๋ฅผ ์ •์˜ํ•˜๊ณ , ์ž๋™์œผ๋กœ ์žฌ์‹œ๋„์™€ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ฉฐ, ๋ชจ๋“  LLM API(OpenAI, Anthropic, Google, Ollama)๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. type-safe ์—์ด์ „ํŠธ์™€ ํ•จ๊ป˜ ๋ฉ€ํ‹ฐ ํ„ด ๋Œ€ํ™”๋„ ์›ํ•˜๋Š” ๊ฒฝ์šฐ Pydantic AI๊ฐ€ ๋Œ€์•ˆ์ž…๋‹ˆ๋‹ค.

Llama์™€ ๊ฐ™์€ ๋กœ์ปฌ ๋ชจ๋ธ์—์„œ structured output์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์˜ˆ. Outlines๋Š” ๋กœ์ปฌ ๋ชจ๋ธ์„ ์œ„ํ•œ constrained decoding์— ํŠนํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค โ€” llama.cpp, vLLM ๋ฐ transformers ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. Outlines๋Š” ํ™˜๊ฐ ์œ„ํ—˜ ์ œ๋กœ๋กœ ํ† ํฐ ์ƒ์„ฑ ์‹œ ์Šคํ‚ค๋งˆ ์ค€์ˆ˜๋ฅผ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. Instructor๋Š” API๋กœ ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ Ollama๋„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

Instructor์™€ Marvin์˜ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

Instructor๋Š” Pydantic ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์Šคํ‚ค๋งˆ๋ฅผ ์ •์˜ํ•˜๊ณ  ์˜ค๋ฅ˜ ๋ณต๊ตฌ์™€ ํ•จ๊ป˜ ์ถ”์ถœ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. Marvin์€ Python ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค โ€” ํ•จ์ˆ˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ๋ฐ์ฝ”๋ ˆ์ดํŒ…ํ•˜๋ฉด Marvin์ด ์ž๋™์œผ๋กœ LLM ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. Instructor๋Š” ๋” ๋ช…์‹œ์ ์ž…๋‹ˆ๋‹ค(๋ณต์žกํ•œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ์— ๋” ์ข‹์Œ), Marvin์€ ๋” ๊ฐ„๊ฒฐํ•ฉ๋‹ˆ๋‹ค(๋น ๋ฅธ ํ”„๋กœํ† ํƒ€์ž… ์ œ์ž‘์— ๋” ์ข‹์Œ).

LangChain์€ structured output์„ ์ง€์›ํ•ฉ๋‹ˆ๊นŒ?

์˜ˆ. LangChain 0.1+์€ ChatOpenAI, ChatAnthropic, ChatGoogle ๋“ฑ์— with_structured_output() ๋ฉ”์„œ๋“œ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. LangChain ๋„๊ตฌ๋ฅผ structured output ์Šคํ‚ค๋งˆ๋กœ ์ž๋™ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ LangChain ์—์ด์ „ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ์Šคํ‚ค๋งˆ ์ค€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

Structured output์˜ ์‹ ๋ขฐ์„ฑ์„ ์–ด๋–ป๊ฒŒ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๊นŒ?

PromptQuorum์„ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ๋ชจ๋ธ์—์„œ ๋™์ผํ•œ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์Šคํ‚ค๋งˆ ์ค€์ˆ˜์œจ์„ ์ธก์ •ํ•˜์‹ญ์‹œ์˜ค. ์„œ๋กœ ๋‹ค๋ฅธ ๋ชจ๋ธ(GPT-4.5, Claude 4.8, Gemini 3.1)์€ structured output ์‹ ๋ขฐ์„ฑ ์ˆ˜์ค€์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ํ”„๋กœ๋•์…˜์— ๋ฐฐํฌํ•˜๊ธฐ ์ „์— ํ…Œ์ŠคํŠธํ•˜์‹ญ์‹œ์˜ค.

"constrained decoding"์ด๋ž€ ๋ฌด์—‡์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?

Constrained decoding์€ ํ† ํฐ ์ƒ์„ฑ์„ ์Šคํ‚ค๋งˆ์— ๋”ฐ๋ผ ์œ ํšจํ•œ ๊ฐ’๋งŒ์œผ๋กœ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค. Outlines๋Š” ๊ฐ ๋‹จ๊ณ„์—์„œ ๋‹ค์Œ์— ์œ ํšจํ•œ ํ† ํฐ ์ง‘ํ•ฉ์„ ๊ณ„์‚ฐํ•˜์—ฌ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ƒ์„ฑ ํ›„ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋˜๋Š” ์žฌ์‹œ๋„ ์—†์ด ์Šคํ‚ค๋งˆ ์ค€์ˆ˜๋ฅผ ๋ณด์žฅํ•˜์—ฌ API ์ˆ˜์ค€ JSON ๋ชจ๋“œ๋ณด๋‹ค ๋” ๋น ๋ฅด๊ณ  ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์—†์ด structured output์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๊ธฐ์ˆ ์ ์œผ๋กœ ์˜ˆ โ€” ๋ชจ๋ธ์ด JSON์„ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ํ•œ ๋‹ค์Œ ์ง์ ‘ ํŒŒ์‹ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ™˜๊ฐ์—์„œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ฐ€ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. 6๊ฐ€์ง€ ๋„๊ตฌ๋Š” ์žฌ์‹œ๋„์™€ ํ•จ๊ป˜ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ(Instructor, Marvin), ๋””์ฝ”๋”ฉ ์‹œ ๊ฐ•์ œ(Outlines) ๋˜๋Š” ๊ณต๊ธ‰์ž API ๋ž˜ํ•‘(LangChain, Pydantic AI)์„ ํ†ตํ•ด ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

์–ด๋–ค ๋„๊ตฌ๊ฐ€ ์ตœ๊ณ ์˜ ๋ฌธ์„œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

LangChain๊ณผ Pydantic AI๋Š” ๊ธฐ์—… ์ง€์›์œผ๋กœ ์ธํ•ด ๊ฐ€์žฅ ํฌ๊ด„์ ์ธ ๋ฌธ์„œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Instructor๋Š” ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ์œ ์ง€ ๊ด€๋ฆฌํ•จ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ํ›Œ๋ฅญํ•œ ํŠœํ† ๋ฆฌ์–ผ๊ณผ ์˜ˆ์‹œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Outlines ๋ฌธ์„œ๋Š” ๊ธฐ์ˆ ์ ์ด์ง€๋งŒ ํฌ๊ด„์ ์ž…๋‹ˆ๋‹ค. Marvin์—๋Š” ๋น ๋ฅธ ์‹œ์ž‘ ๊ฐ€์ด๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

6๊ฐ€์ง€ ๋„๊ตฌ๊ฐ€ ๋ชจ๋‘ ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ํ•˜๋‚˜๋งŒ ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ?

ํ•˜๋‚˜๋กœ ์‹œ์ž‘ํ•˜์‹ญ์‹œ์˜ค. Python ๊ฐœ๋ฐœ์ž๋Š” Instructor ๋˜๋Š” Pydantic AI๋ฅผ ์‹œ๋„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋กœ์ปฌ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜๋Š” ํŒ€์€ Outlines๋ฅผ ์‹œ๋„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. LangChain ์‚ฌ์šฉ์ž๋Š” with_structured_output()์„ ์‹œ๋„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. PromptQuorum์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ๋ชจ๋ธ์—์„œ ์ผ๊ด€์„ฑ์„ ๊ฒ€์ฆํ•˜์‹ญ์‹œ์˜ค. ๋Œ€๋ถ€๋ถ„์˜ ํŒ€์€ ํ•˜๋‚˜์˜ ๋„๊ตฌ + ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ PromptQuorum์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ  ์ž๋ฃŒ

  • Instructor GitHub ์ €์žฅ์†Œ โ€” Instructor ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๊ณต์‹ ์ €์žฅ์†Œ ๋ฐ ๋ฌธ์„œ
  • Outlines ๋ฌธ์„œ โ€” ๋ณด์žฅ๋œ ์Šคํ‚ค๋งˆ ์ค€์ˆ˜๋ฅผ ์œ„ํ•œ constrained decoding
  • Pydantic AI โ€” structured output์ด ์žˆ๋Š” type-safe ์—์ด์ „ํŠธ ํ”„๋ ˆ์ž„์›Œํฌ
  • LangChain์˜ with_structured_output() โ€” LangChain์˜ ํ†ตํ•ฉ structured output API
  • Marvin ๋ฌธ์„œ โ€” ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ๊ธฐ๋ฐ˜ LLM ์ถ”์ถœ ํ”„๋ ˆ์ž„์›Œํฌ

Apply these techniques with a local LLM or your own API keys โ€” PromptQuorum works with any backend.

Try PromptQuorum free โ†’

โ† Back to Prompt Engineering

2026๋…„ Structured Output JSON Mode ์ตœ๊ณ ์˜ ํ•œ๊ตญ์–ด ๋„๊ตฌ | PromptQuorum