실제 서비스에서 버티는 LLM 에이전트를 만들기 위한 12가지 설계 원칙이다. 프레임워크로 만든 에이전트가 80% 품질에서 더 나아지지 않을 때, 잘 만든 소프트웨어에 LLM을 필요한 곳에만 끼워 넣는 구조로 바꿔 프롬프트·상태·제어 흐름을 직접 관리하려고 쓴다.
| 구분 | 프레임워크에 맡긴 에이전트 | 12-팩터 에이전트 |
|---|---|---|
| 프롬프트 | 프레임워크 기본값 | 직접 작성하고 관리 |
| 제어 흐름 | 프롬프트+도구+루프에 맡김 | 코드로 직접 정함 |
| 상태 | 프레임워크 안에 숨어 있음 | 밖에 저장해 언제든 재개 |
| 사람 개입 | 예외 처리 | 일반 도구 호출 |
HumanLayer의 Dex Horthy가 AI 엔지니어 100명 이상을 인터뷰한 뒤, 프로덕션에 나간 에이전트들의 공통점을 정리했다. 이름은 Heroku의 Twelve-Factor App에서 따왔다.
에이전트 프레임워크를 쓰면 처음에는 금방 70~80% 품질까지 간다. 그런데 그 뒤로는 에이전트가 없는 단계를 지어내거나 무한 루프에 빠지고, 남은 부분을 고치려면 프레임워크 내부를 뜯어봐야 한다. 12-팩터는 이 부분을 처음부터 내 코드로 가져와 고치고 디버깅할 수 있게 하자는 제안이다.
| 묶음 | 원칙 | 요점 |
|---|---|---|
| 프롬프트·도구 | 자연어를 도구 호출로, 프롬프트 직접 소유, 도구는 구조화된 출력일 뿐 | LLM은 다음 행동을 JSON으로 고를 뿐이다 |
| 상태·실행 | 컨텍스트 윈도우 직접 관리, 실행 상태와 비즈니스 상태 통합, 간단한 API로 시작·중단·재개, 상태 없는 리듀서 | 기록만 있으면 언제든 이어 간다 |
| 제어·연결 | 제어 흐름 직접 소유, 사람에게 도구 호출로 연락, 오류를 요약해 컨텍스트에 넣기, 작고 집중된 에이전트, 어디서든 실행 | 루프와 예외 처리는 코드가 정한다 |
기존 에이전트를 통째로 갈아엎을 필요는 없다. 먼저 한 가지 일만 하는 작은 에이전트로 나누고, 프롬프트를 코드 저장소에 직접 두어 바꿀 때마다 결과를 비교한다. 그다음 진행 기록을 이벤트 목록으로 저장해 중간에 멈췄다 이어 가게 만들고, 승인이 필요한 단계는 사람에게 묻는 도구로 넣는다.
Claude Code라면 CLAUDE.md에 지시를 직접 쓰는 것이 프롬프트 소유이고, 훅으로 파일 수정 뒤 린트를 강제하는 것이 제어 흐름 소유다. 역할별로 나눈 서브에이전트는 작고 집중된 에이전트에 해당한다.
12-팩터는 SDK가 아니라 언어와 상관없는 설계 원칙이다. LangChain이나 CrewAI를 쓰고 있어도 프롬프트·상태·루프를 내가 들여다볼 수 있게 꺼내 두면 된다. 짧은 실험이나 혼자 쓰는 스크립트라면 원칙을 다 지킬 필요는 없다. 사용자에게 내보내 오래 돌릴 에이전트일수록 효과가 크다.
사람들은 주로 새 에이전트를 설계하거나 데모 수준에서 멈춘 에이전트를 고칠 때, 12가지를 점검표처럼 하나씩 대조한다. 한 번에 다 적용하기보다 지금 가장 아픈 문제에 맞는 원칙부터 고른다.
| 어디서 | 어떻게 쓰나 |
|---|---|
| 업무 자동화 에이전트 | 배포·환불처럼 위험한 단계는 사람에게 묻는 도구로 넣고, 승인을 기다리는 동안 상태를 저장했다가 답이 오면 이어 간다 |
| 코딩 에이전트 설정 | 지시는 CLAUDE.md에 직접 쓰고, 훅으로 린트·테스트를 강제하고, 역할별 서브에이전트로 나눈다 |
| 프레임워크 에이전트 개선 | 무한 루프나 지어낸 단계가 나오는 부분의 프롬프트와 루프를 코드로 꺼내 직접 디버깅한다 |