๊ฐ ๋๊ตฌ๊ฐ ํด๊ฒฐํ๋ ๋ฌธ์
Structured output์ ์ธ ๊ฐ์ง ์ํธ ์ฐ๊ด๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ผ ํฉ๋๋ค: ์คํค๋ง ์ ์, API ์ค์, ์ ํจ์ฑ ๊ฒ์ฌ. ์๋ก ๋ค๋ฅธ ๋๊ตฌ๋ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ๊ณต๊ฒฉํฉ๋๋ค. Instructor๋ ์ฌ์๋์ ํจ๊ป Python์์ ์ธ ๊ฐ์ง๋ฅผ ๋ชจ๋ ๊ด๋ฆฌํฉ๋๋ค. Outlines๋ constrained decoding์ ํตํด ์ ํจ์ฑ ๊ฒ์ฌ ๋จ๊ณ๋ฅผ ์ ๊ฑฐํฉ๋๋ค. Pydantic AI๋ ์์ด์ ํธ์ type safety๋ฅผ ์ถ๊ฐํฉ๋๋ค. LangChain์ ๊ณต๊ธ์ API๋ฅผ ๋ํํฉ๋๋ค. Marvin์ ๊ฐ๋ฐ์ ์๋๋ฅผ ์ฐ์ ์ํฉ๋๋ค. PromptQuorum์ ๋ชจ๋ ๋ชจ๋ธ์์ ์ผ๊ด์ฑ์ ๊ฒ์ฆํฉ๋๋ค.
| ๋ฌธ์ | Instructor | Outlines | Pydantic AI | LangChain | Marvin |
|---|---|---|---|---|---|
| ์คํค๋ง ์ ์ | Pydantic ๋ชจ๋ธ | JSON Schema / GBNF | Pydantic ๋ชจ๋ธ | ๋๊ตฌ ์ ์ | 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 ํธ์ถ ์ด์ธ์ ์ถ๊ฐ ๋น์ฉ ์์)
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 == 25Outlines: 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์ ํจ๊ป ์๋ํฉ๋๋ค
- ๋ฌด๋ฃ ํฐ์ด ์ ๊ณต, ๊ณ ์ฉ๋ ํ ์คํธ๋ฅผ ์ํ ์ํฐํ๋ผ์ด์ฆ ๊ฐ๊ฒฉ
๋๋ํ ๋น๊ต
| ๋๊ตฌ | ์ด์์ ์ธ ์ฌ์ฉ ์ฌ๋ก | ์คํค๋ง ํ์ | ์ธ์ด | ๋ก์ปฌ ๋ชจ๋ธ | ๊ฐ๊ฒฉ | ํ์ต ๊ณก์ |
|---|---|---|---|---|---|---|
| Instructor | Python API + ์ฌ์๋ | Pydantic ๋ชจ๋ธ | Python/TypeScript | ์ (Ollama) | ๋ฌด๋ฃ | ๋ฎ์ |
| Outlines | ๋ก์ปฌ ๋ชจ๋ธ ๋ฐฐํฌ | JSON Schema/GBNF | Python | ์ (๋ค์ดํฐ๋ธ) | ๋ฌด๋ฃ | ์ค๊ฐ |
| Pydantic AI | type-safe ์์ด์ ํธ | Pydantic ๋ชจ๋ธ | Python | ์ (Ollama) | ๋ฌด๋ฃ | ๋ฎ์ |
| LangChain | chains + ์์ด์ ํธ | ๋๊ตฌ ์ ์ | Python/JS | ์ | ๋ฌด๋ฃ | ์ค๊ฐ |
| Marvin | ๋น ๋ฅธ ํ๋กํ ํ์ ์ ์ | ํ์ ํํธ | Python | ์ | ๋ฌด๋ฃ | ๋งค์ฐ ๋ฎ์ |
| PromptQuorum | ๋ฉํฐ ๋ชจ๋ธ ํ ์คํธ | API ๋ถ๊ฐ์ง๋ก ์ | API-first | OpenAI ํ๋ก์๋ฅผ ํตํด | ๋ฌด๋ฃ + ์ํฐํ๋ผ์ด์ฆ | ๋ฎ์ |
์ฌ๋ฐ๋ฅธ ๋๊ตฌ ์ ํ
์ธ ๊ฐ์ง ์ง๋ฌธ์ ๋ตํ๋ ๊ฒ์ผ๋ก ์์ํ์ญ์์ค: (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์ถ๋ ฅ ์คํค๋ง ์ ์ โ LLM์ด ๋ฐํํ๊ธฐ๋ฅผ ์ํ๋ ํ๋, ์ ํ ๋ฐ ์ ์ฝ ์กฐ๊ฑด์ ์ค๋ช ํ๋ Pydantic ๋ชจ๋ธ(Python), TypeScript ์ธํฐํ์ด์ค ๋๋ JSON Schema๋ฅผ ๋ง๋์ญ์์ค.
- 2๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ํ โ Python API์๋ Instructor, ๋ก์ปฌ ๋ชจ๋ธ์๋ Outlines, ์์ด์ ํธ์๋ Pydantic AI, ์ด๋ฏธ ์ฌ์ฉ ์ค์ด๋ฉด LangChain, ๋น ๋ฅธ ์๋์๋ Marvin.
- 3LLM ํธ์ถ ์ค์น ๋ฐ ๋ํ โ `pip install instructor` (Python), ๊ทธ๋ฐ ๋ค์ ์คํค๋ง๋ฅผ API ํธ์ถ์ ์ ๋ฌํ์ญ์์ค. Instructor๊ฐ ์ ํจ์ฑ ๊ฒ์ฌ์ ์ฌ์๋๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.
- 4PromptQuorum์ผ๋ก ํ ์คํธ โ PromptQuorum์ ๋ฐฐํฌํ๊ณ GPT, Claude, Gemini์์ ํ๋กฌํํธ๋ฅผ ์คํํ์ญ์์ค. ๋ชจ๋ธ๋ณ ์คํค๋ง ์ค์์จ์ ์ธก์ ํ์ญ์์ค.
- 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๋ฐฐ ์ค์ ๋๋ค.
๊ด๋ จ ์๋ฃ
- Structured Output ๋ฐ JSON Mode โ OpenAI, Anthropic, Google API์์ JSON ๋ชจ๋ ์๋ ๋ฐฉ์; ํ์ ์ค์ ๋ ์คํค๋ง ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์ฌ์ฉํ๋ ์์ .
- ํ๋กฌํํธ ์ธ์ ์ ๋ฐ ๋ณด์ โ ๊ตฌ์กฐํ๋ ํ๋กฌํํธ์์ ์ฌ์ฉ์ ์ ๋ ฅ์ ์๋ฝํ ๋์ ์ํ; ์๋ํ์ด์ ์ด์ ์ ๋ต.
- ํ๋กฌํํธ ํ์ง ํ๊ฐ ๋ฐฉ๋ฒ โ structured output ์คํค๋ง์์ ์ ํ๋, ์ผ๊ด์ฑ ๋ฐ ์ง์ ์ฌํญ ์ค์๋ฅผ ์ธก์ ํ์ญ์์ค.
- ๋ชจ๋ธ ๊ฐ ํ๋กฌํํธ ํ ์คํธ ๋ฐฉ๋ฒ โ GPT, Claude, Gemini์์ ๋์ผํ ํ ์คํธ ์ธํธ๋ฅผ ์คํํ๊ณ ํต๊ณผ์จ์ ๋น๊ตํ์ญ์์ค.
- ํ๋กฌํํธ ์์ง๋์ด๋ง vs. ํ์ธํ๋ โ ๊ตฌ์กฐํ๋ ํ๋กฌํํ ์ผ๋ก ์ถฉ๋ถํ ์๊ธฐ vs. ๋ชจ๋ธ ํ์ธํ๋์ด ํ์ํ ์๊ธฐ.
- ์๊ท๋ชจ ํ์ ์ํ ํ๋กฌํํธ ์์ง๋์ด๋ง ์ค์ โ 2-15๋ช ํ์ ์ํ ๊ตฌ์กฐํ๋ ๋ฐ์ดํฐ ์ถ๋ ฅ ์ํฌํ๋ก์ฐ ๊ตฌ์ถ.
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 ์ถ์ถ ํ๋ ์์ํฌ