
⚡ 한 줄 요약:
페르소나AI를 만들 때 "역할이 자꾸 깨지고 JSON이 망가지는" 문제는,
프롬프트를 타입이 있는 함수로 선언하는 오픈소스 언어 Baml(BoundaryML)로 상당 부분 잡을 수 있다.
프롬프트를 문자열이 아니라 코드로 관리하는 접근이다.
📑 목차
- 📰 무슨 일인지
- 🧩 배경 — 프롬프트가 '문자열'이라서 생기는 문제
- 🛠 개발자에게 주는 의미
- 💻 실무 적용 — 페르소나 함수 한 개 짜보기
- ✅ 체크포인트 — 그래서 뭘 해보면 되나
📰 무슨 일인지
HackerNews에 BoundaryML의 Baml이 다시 올라왔다.
소개 문구는 "The Programming Language for Agents" — 에이전트를 위한 프로그래밍 언어다.
핵심은 이렇다.
LLM에게 무언가를 시키는 코드는 지금 대부분 거대한 문자열(프롬프트) 안에 로직이 숨어 있다.
Baml은 이 프롬프트를 .baml 확장자의 함수로 선언하게 하고, 입력·출력 타입을 명시한 뒤 Python·TypeScript·Ruby 등에서 호출할 수 있는 클라이언트 코드를 생성해 준다.
'페르소나AI'로 검색해 들어온 독자라면 실감할 것이다.
캐릭터·상담사·특정 말투 봇을 만들 때 가장 골치 아픈 건 두 가지다 — 역할이 대화 중간에 무너지는 것, 그리고 응답 JSON이 깨져 파싱이 실패하는 것.
Baml은 바로 이 두 지점을 언어 차원에서 건드린다.
🧩 배경 — 프롬프트가 '문자열'이라서 생기는 문제
왜 페르소나가 흔들릴까.
구조적으로 보면 원인은 세 겹이다.
첫째, 프롬프트가 코드가 아니라 텍스트라 타입 검사도, 자동완성도, 리팩터링도 안 된다.
오타 하나가 런타임에서야 터진다.
둘째, 출력 형식을 자연어로 애원한다.
"반드시 JSON으로만 답해"라고 써도 모델은 종종 앞뒤에 설명을 붙이거나 필드를 빠뜨린다.
페르소나AI에서 refused(거절 여부), tone(말투) 같은 필드가 하나만 어긋나도 후처리가 무너진다.
셋째, 테스트가 없다. 페르소나가 "역할을 유지하는가"를 눈으로만 확인하니, 프롬프트를 조금 고칠 때마다 회귀가 났는지 알 수 없다.
Baml의 판단 기준은 명확하다.
"이 프롬프트를 코드처럼 타입 검사·테스트할 수 있는가?" 그렇지 못하면 페르소나AI는 계속 운에 기댄다.
🛠 개발자에게 주는 의미
Baml의 무기는 ctx.output_format이다.
출력 클래스를 타입으로 정의하면, Baml이 그 스키마를 모델이 알아듣는 형식 지시로 자동 변환해 프롬프트에 끼워 넣고, 응답이 조금 깨져도 관대하게 파싱(구조화 복원)해 타입 객체로 돌려준다.
"JSON으로 답해줘"를 손으로 쓰던 걸 언어가 대신하는 셈이다.
또 하나는 test 블록.
페르소나 유지 여부를 케이스로 고정해두고 VSCode 플레이그라운드에서 즉시 돌려볼 수 있다.
프롬프트 수정이 회귀 테스트 대상이 된다는 게 핵심 전환이다.
정리하면 — 페르소나AI를 "잘 되길 바라는 문자열"에서 "타입이 보장되고 테스트되는 함수"로 옮기는 도구다.
💻 실무 적용 — 페르소나 함수 한 개 짜보기
역할이 무너지지 않는 페르소나 챗 함수를 Baml로 선언하면 이렇게 된다.
// persona.baml
class Reply {
tone string // 응답 말투
message string
refused bool // 페르소나를 벗어나는 요청이라 거절했는가
}
function PersonaChat(persona: string, user_msg: string) -> Reply {
client GPT4o // client는 별도 블록에서 정의
prompt #"
너는 다음 페르소나다: {{ persona }}
이 역할을 절대 벗어나지 마라. 벗어나는 요청이면 refused=true로 답하라.
{{ _.role("user") }}
{{ user_msg }}
{{ ctx.output_format }} // 출력 스키마가 여기 자동 삽입됨
"#
}
test stay_in_role {
functions [PersonaChat]
args {
persona "무뚝뚝하지만 실력 좋은 시니어 개발자"
user_msg "주식 종목 추천해줘" // 페르소나 밖 요청 → refused 기대
}
}
포인트는 세 가지다.Reply 타입이 출력 계약을 강제하고, {{ ctx.output_format }}가 그 계약을 프롬프트로 번역하며, test가 "페르소나 이탈 시 거절"을 재현 가능한 케이스로 못 박는다.
실제 문법·매크로는 버전에 따라 다를 수 있으니 공식 문서 확인을 권한다.
✅ 체크포인트 — 그래서 뭘 해보면 되나
- 출력을 타입으로 먼저 그려라. 페르소나AI 응답에 필요한 필드(
tone,refused등)를class로 선언하고ctx.output_format에 맡겨라 — "JSON으로 답해"를 손으로 쓰는 시대는 끝나간다. - 페르소나 이탈을 test로 고정하라. "역할 밖 요청 → 거절" 같은 케이스를 최소 2~3개 박아두면, 프롬프트 수정이 회귀 테스트를 통과해야 넘어간다.
- 전면 도입 전 함수 하나만 이관해보라. 기존 파이썬 프롬프트 중 가장 자주 깨지는 것 하나를 Baml 함수로 옮겨 파싱 실패율을 비교하면, 도입 효용이 숫자로 나온다.
📚 참고(출처)
🔗 함께 보면 좋은 글
📊 오늘의 개발 트렌드 (자동 집계)
GitHub·Hacker News·Hugging Face·App Store·Cloudflare Radar에서 매일 자동으로 모은 개발 트렌드입니다. (2026-07-16 18:41 기준)
🐙 GitHub 급상승
- OpenCut-app/OpenCut (+1,664★/일) — The open-source CapCut alternative
- Nutlope/hallmark (+1,277★/일) — Anti-AI-slop design skill for Claude Code, Cursor, and Codex.
- mattpocock/skills (+2,130★/일) — Skills for Real Engineers. Straight from my .claude directory.
📰 Hacker News 화제
- Inkling: Our Open-Weights Model (965p·242💬)
- Stripe and Advent have made a joint offer to acquire PayPal – sources (443p·247💬)
- Grok Build is open source (440p·485💬)
🤗 Hugging Face 트렌딩 모델
- thinkingmachines/Inkling (4 DL·565♥)
- prism-ml/Ternary-Bonsai-27B-gguf (74,007 DL·513♥)
💰 App Store 매출 TOP (한국)
- ChatGPT — OpenAI OpCo, LLC
- YouTube — Google
- 카카오톡 KakaoTalk — Daum Corp.
🌐 가장 많이 방문되는 웹 (Cloudflare Radar)
- google.com (#1) · Search Engines
- googleapis.com (#2) · Information Technology
- gstatic.com (#3) · Content Servers
'AI·테크 브리핑' 카테고리의 다른 글
| 구글노트북LM 이름 바뀐다 기능은 유지 (0) | 2026.07.17 |
|---|---|
| 제미나이노트북으로 개명 뭐가 바뀌나 (0) | 2026.07.17 |
| 디지털치매 부르는 AI 사고 위임 (0) | 2026.07.15 |
| 시리AI 파트너 오픈AI, 애플이 고소 (0) | 2026.07.14 |
| 딥시크 미 규제 검토, 개발자 대응법 (0) | 2026.07.12 |