TrendShift · LLM Agent Engineering

12-Factor Agents — 실전급
LLM 에이전트의 12가지 원칙

프레임워크에 갇히지 말자. 좋은 에이전트는 80%까지는 쉽지만, 그 위는 모두 "직접 만든 소프트웨어"다.

humanlayer/12-factor-agents · TS·Python · Apache-2.0 · 19.1k★ 2026-05-19 · TrendShift 14위
00 — 들어가며Context

먼저, "에이전트"가 뭔가?

12가지 원칙을 보기 전에 깔아둬야 하는 기본 개념.

요즘 회사들이 "AI 에이전트"라고 부르는 제품의 대부분은 사실 대부분 결정론적 코드다. 그 사이사이에 LLM 호출이 양념처럼 끼어 있을 뿐이다. 진짜 에이전트도 그 본질은 다르지 않다. "프롬프트 주고, 도구 한 보따리 던져주고, 목표 달성까지 무한 루프" 같은 동화 속 패턴은 80%까지만 작동한다.

Term · 용어
LLM (Large Language Model, 거대 언어 모델)
GPT, Claude처럼 텍스트를 입력받아 텍스트를 출력하는 거대한 인공신경망. 본질적으로 상태 없는 함수(stateless function) — 같은 입력을 주면 같은(혹은 비슷한) 출력이 나온다. 기억력은 없다. 그래서 "기억"하게 하려면 매번 우리가 전체 맥락을 넣어줘야 한다.
Term · 용어
Agent / Agentic Loop (에이전트 · 에이전틱 루프)
LLM이 다음에 무엇을 할지 스스로 결정하고, 결정론적 코드가 그걸 실행하고, 결과를 다시 LLM의 컨텍스트에 붙이는 사이클을 반복하는 소프트웨어. 4단계로 요약하면 ① 다음 단계 결정 ② 도구 실행 ③ 결과를 컨텍스트에 누적 ④ "끝났다"고 판단할 때까지 반복.
Term · 용어
Tool Call (도구 호출)
LLM이 자연어 응답 대신 구조화된 JSON을 뱉어내고, 그 JSON을 우리 코드가 받아서 함수처럼 실행하는 방식. "이메일 보내기", "DB 조회하기" 같은 액션을 LLM이 "선택"하는 메커니즘이다. 비유하면 LLM이 식당 종업원에게 "오늘의 메뉴 3번, 단 양파 빼고"라고 주문서를 적어주는 것.
Term · 용어
Context Window (컨텍스트 윈도우)
LLM이 한 번에 "볼 수 있는" 텍스트의 분량. 단위는 토큰(token). 사람 두뇌의 단기 기억과 비슷한 역할이지만, 모델 종류에 따라 8천~수백만 토큰까지 다양하다. 이 안에 무엇을 어떻게 채우느냐가 에이전트 품질의 8할을 결정한다는 게 이 책의 핵심 주장.
01 — 한 줄 요약TL;DR

이 프로젝트의 핵심 메시지

한 문장으로 줄이면.

Core Message

"좋은 LLM 에이전트는 프레임워크 위에 짓는 게 아니라, 잘 알려진 12가지 패턴을 평범한 소프트웨어에 녹여 만든다."

2011년 Heroku가 발표해 클라우드 시대 웹앱의 표준이 된 12-Factor App 원칙을 LLM 에이전트 시대에 다시 쓴 가이드다. 코드 한 줄짜리 도구를 깔아주는 레포가 아니라, "이런 식으로 설계하라"라는 12개의 짧은 글 모음이다. TypeScript 80%, Python·Jupyter 19%로 구성된 예제 코드가 곁들여진다.

저자는 HumanLayer를 만드는 Dex Horthy. CrewAI, LangChain, smolagents, LangGraph, Griptape 등 시중 에이전트 프레임워크를 거의 다 써본 뒤 "YC 안팎의 진지한 창업자들 대부분이 결국 프레임워크를 버리고 스택을 직접 만든다"는 관찰에서 출발했다.

02 — 왜 주목받는가Why now

19.1k 스타, TrendShift 14위의 이유

시대적 배경 + 경쟁 자료 대비 차별점.

시대적 배경 — 컨텍스트 엔지니어링의 부상

2025년부터 "컨텍스트 엔지니어링(Context Engineering)"이라는 용어가 업계의 새 화두로 떠올랐다. 안드레이 카르파시(Andrej Karpathy), 토비 뤼트케(Shopify CEO) 같은 인물들이 트위터(X)에서 이 용어를 사용하며 12-factor-agents의 Factor 3(컨텍스트 윈도우를 직접 소유하라)이 사실상 "컨텍스트 엔지니어링의 원전" 자리에 올랐다.

경쟁 자료 비교

자료스타일한계 / 차이
Anthropic "Building Effective Agents"추상 패턴 분류구체적 코드·안티패턴 부족
LangChain · LlamaIndex 공식 문서"이 함수를 쓰세요"프레임워크에 종속
OpenAI Agents SDKSDK 사용법특정 회사 제품에 묶임
12-factor-agents코드 + 안티패턴 짝지음"함수를 쓰지 말고 이 원칙대로 직접 만들어라"

3대 매력

매력 1 — 프레임워크 종속 트라우마를 정확히 짚는다

대부분 팀의 여정은 동일하다. ① 에이전트 만들기로 결심 → ② UX 매핑 → ③ 빨리 가려고 프레임워크 도입 → ④ 70~80% 품질 달성 → ⑤ 마지막 20%가 안 됨 → ⑥ 프레임워크 내부를 역공학 → ⑦ 결국 처음부터 다시 작성. 이 패턴을 "프로덕션 80% 벽"으로 명명하고 거기 부딪힌 사람들을 정확히 겨냥한다.

매력 2 — "모듈로 떼어와 기존 제품에 붙여라"

저자가 만난 100명 이상의 SaaS 창업자에게 공통적으로 효과적이었던 방식은 "그린필드 재작성" 대신 "기존 제품에 작은 모듈 단위로 에이전트 패턴을 끼워넣기"였다. 12-factor는 그 모듈의 카탈로그 역할을 한다.

매력 3 — 언어·벤더 독립

TypeScript와 Python 예제를 모두 제공하지만 원칙 자체는 언어·LLM 벤더 독립. OpenAI든 Anthropic이든 Google이든 같은 12가지 압력에 부딪힌다는 게 핵심 가정.

03 — 기술 스택Stack

레포 안에서 실제 쓰이는 것

백엔드 · 트리거 채널 · 인프라.

이 레포는 "프레임워크"가 아니라 "가이드"라서 의존성이 가볍다. 하지만 워크숍 코드와 패키지가 들어있어 실제 기술 스택은 명확히 드러난다.

백엔드 / 에이전트 코어 (TypeScript 80.2% · Python 7.5% · Jupyter 11.2%)

듀얼 언어 예제

  • TypeScript — 워크숍·예제 코드의 주된 언어. 저자가 "왜 TS인가"라는 글까지 따로 쓸 정도로 선호
  • Python + Jupyter — 노트북 기반 데모와 추가 예제용
  • 원칙 자체는 언어 독립이라고 명시

관련 DSL · 라이브러리

  • BAML (boundaryml/baml) — "프롬프트는 함수다" 철학의 DSL. LLM 호출을 강타입 함수처럼
  • Schema Aligned Parsing — JSON 모드 vs 함수 호출 vs 구조화된 출력의 차이를 알고 골라 쓰는 패턴
  • kubechain — 같은 저자가 만든 "쿠버네티스 위 분산 에이전트" 별도 프레임워크. "우리도 원칙을 어겼다"라는 자조적 링크

프론트엔드 / 트리거 채널 (Factor 11)

Slack · Email · Cron · Webhook

  • 에이전트는 특정 UI가 아니라 사용자가 이미 있는 채널에서 시작된다는 원칙
  • 예제 시나리오 — Slack 메시지 받아 GitHub 태그 조회하고 배포 진행
  • Mailcrew Agent — 이메일 트리거 데모
  • Chainlit — 대화형 UI 데모

인프라 / 오케스트레이션

DAG 오케스트레이터 계보

  • 저자는 에이전트를 "DAG를 던져버린 소프트웨어"로 정의
  • 운영 면에서는 결국 DAG 오케스트레이터의 후예 — Factor 6(Launch/Pause/Resume) · Factor 12(Stateless Reducer)가 그 흔적
  • Airflow / Prefect / Dagster / Inngest / Windmill — 비교 대상으로 자주 등장
  • HumanLayer — 저자 회사 제품. "사람을 도구로 호출"하는 SaaS. Factor 7의 레퍼런스 구현
Term · 용어
DAG (Directed Acyclic Graph, 방향성 비순환 그래프)
한 방향으로만 흐르고 같은 자리로 돌아오지 않는 그래프. 데이터 파이프라인을 그릴 때 표준 표현이다. 비유하면 강물 — 위에서 아래로만 흐르고 합류는 있어도 거꾸로 올라가지 않는다. 에이전트의 매력은 "이 DAG를 미리 다 그리지 않아도 LLM이 알아서 길을 찾는다"는 약속이지만, 12-factor는 그 약속이 80%만 지켜진다고 본다.
04 — 아키텍처Design

에이전트 루프와 12가지 압력

4줄짜리 의사 코드 + 12개 원칙을 4그룹으로.

저자가 그리는 에이전트의 본질은 4줄짜리 의사 코드다.

initial_event = {"message": "..."}
context = [initial_event]

while True:
    next_step = await llm.determine_next_step(context)
    context.append(next_step)

    if next_step.intent == "done":
        return next_step.final_answer

    result = await execute_step(next_step)
    context.append(result)

이 단순한 루프에 12가지 압력이 가해진다. 각 압력에 어떻게 대응할지가 12개의 원칙이다.

전체 시스템 구조도

┌────────────────────────────────────────────────────────────┐
│  외부 트리거 (Slack / Email / Cron / Webhook / Manual)      │
│                  ↓  Factor 11                              │
│  ┌───────────────────────────────────────────────────┐     │
│  │  Stateless Reducer (Factor 12)                    │     │
│  │                                                   │     │
│  │   Thread = [event_0, event_1, ..., event_n]       │     │
│  │   nextEvent = f(thread)  ← LLM이 결정             │     │
│  │                                                   │     │
│  │  ┌──────────────────────────────────────┐         │     │
│  │  │  Context Window (Factor 3)           │         │     │
│  │  │   - system prompt (Factor 2)         │         │     │
│  │  │   - tool schemas (Factor 4)          │         │     │
│  │  │   - thread history                   │         │     │
│  │  │   - compact errors (Factor 9)        │         │     │
│  │  └──────────────────────────────────────┘         │     │
│  │                  ↓                                │     │
│  │  LLM → Structured JSON  (Factor 1, 4)             │     │
│  │                  ↓                                │     │
│  │  Tool Executor (deterministic code)               │     │
│  │     ↓                              ↓              │     │
│  │  자동 실행                     사람 호출          │     │
│  │  (DB / API / Code)            (Factor 7)          │     │
│  │     ↓                              ↓              │     │
│  │  Result Event                  Human Response     │     │
│  │     └──────────────┬───────────────┘              │     │
│  │                    ↓                              │     │
│  │     Unified State Store (Factor 5)                │     │
│  │     - Pause/Resume API (Factor 6)                 │     │
│  │     - Own control flow (Factor 8)                 │     │
│  └───────────────────────────────────────────────────┘     │
│                                                            │
│  ※ 한 에이전트 = 작고 집중된 역할 (Factor 10)              │
└────────────────────────────────────────────────────────────┘

12개 원칙을 4그룹으로 묶기

그룹 A · 입력 영역 — "LLM에게 무엇을 보여줄 것인가"

  • Factor 1 — 자연어를 도구 호출(JSON)로 변환하는 능력이 LLM의 본업
  • Factor 2 — 프롬프트를 직접 소유. 프레임워크 안에 숨겨진 프롬프트는 디버깅 불가
  • Factor 3 — 컨텍스트 윈도우 포맷을 표준 messages 배열에 묶지 말고 XML·YAML 등 토큰 효율 좋은 형식으로 직접 짜기

그룹 B · 출력과 도구 — "LLM의 결정을 어떻게 받아낼 것인가"

  • Factor 4 — "도구"는 그저 LLM이 만든 구조화된 출력일 뿐. 거창한 추상화로 감싸지 말 것
  • Factor 7 — 사람도 "도구"의 한 종류. 확신이 안 서면 LLM이 사람을 호출하도록
  • Factor 9 — 에러는 그대로 던지지 말고 압축해서 컨텍스트에 넣어 자가 회복을 유도

그룹 C · 상태와 제어 흐름 — "누가 흐름을 책임지는가"

  • Factor 5 — 실행 상태(어디까지 갔는가)와 비즈니스 상태(주문 ID 등)를 한 스토리지로 통합
  • Factor 6 — 에이전트는 시작/일시정지/재개를 단순 API로 노출
  • Factor 8 — 제어 흐름을 LLM의 무한 루프에 위임 금지. 결정론적 코드가 소유
  • Factor 12 — 에이전트를 상태 없는 리듀서(stateless reducer)로 만들기

그룹 D · 조직과 배포 — "어떻게 운영할 것인가"

  • Factor 10 — 만능 에이전트 한 개보다 작고 특화된 에이전트 여러 개
  • Factor 11 — Slack·Email·Cron·웹훅 등 사용자가 이미 있는 채널 어디서든 트리거 가능하게
  • (부록) Factor 13 — 필요할 만한 컨텍스트는 미리 가져와라(pre-fetch)
Analogy · Redux 리듀서 비유

리듀서(Reducer)는 React Redux를 써본 사람에게 친숙하다. (이전 상태, 액션) → 새 상태 함수다. Factor 12는 에이전트를 그 모양으로 보라고 한다. 스레드(이벤트 목록)와 새 이벤트를 받아 다음 이벤트를 결정하는 순수 함수. 함수 자체에는 기억이 없고, 기억은 바깥의 스레드 저장소가 가진다. 그래서 정전이 나도, 서버를 죽였다 살려도, 같은 스레드를 다시 넣으면 똑같이 재현된다.

Trap · 함정
"프롬프트 + 도구 보따리 + 무한 루프" 패턴

가장 흔한 첫 시도. 80%까지는 잘 굴러간다. 그러나 ① 같은 도구를 무한 반복 호출 ② 컨텍스트가 부풀어 토큰 한도 초과 ③ 사용자가 중간 개입을 못 함 ④ 에러 복구 불가 — 이 네 가지가 거의 동시에 터진다.

Fix · 해결책
제어 흐름은 코드가, 결정은 LLM이

"다음 단계를 결정"하는 LLM 호출을 한 번에 한 단계만 시키고, 도구 실행과 분기·재시도는 결정론적 코드가 소유. LLM이 단순 분류기 역할을 하도록 좁히면 디버깅·테스트가 일반 백엔드 수준으로 떨어진다.

05 — 디렉토리Repo map

레포 구조 해부

코드 레포가 아니라 책 레포.

humanlayer/12-factor-agents/
├── content/                # 12개 Factor 본문 마크다운 (가이드의 본체)
│   ├── brief-history-of-software.md
│   ├── factor-01-natural-language-to-tool-calls.md
│   ├── factor-02-own-your-prompts.md
│   ├── factor-03-own-your-context-window.md   ← 컨텍스트 엔지니어링 원전
│   ├── factor-04-tools-are-structured-outputs.md
│   ├── factor-05-unify-execution-state.md
│   ├── factor-06-launch-pause-resume.md
│   ├── factor-07-contact-humans-with-tools.md
│   ├── factor-08-own-your-control-flow.md
│   ├── factor-09-compact-errors.md
│   ├── factor-10-small-focused-agents.md
│   ├── factor-11-trigger-from-anywhere.md
│   ├── factor-12-stateless-reducer.md
│   └── appendix-13-pre-fetch.md               ← 보너스 원칙
├── workshops/              # 단계별 워크숍 코드 (가장 실습 가치 높음)
├── packages/               # 재사용 가능한 코드 예제 패키지
├── drafts/                 # 추가 원칙·아이디어 드래프트
├── hack/contributors_markdown/  # 기여자 자동 표기 빌드 스크립트
├── img/                    # 가이드 본문에 쓰이는 다이어그램 이미지
├── CLAUDE.md               # Claude Code용 레포 설명(컨트리뷰터에 친절)
├── Makefile                # 빌드/렌더 자동화
└── README.md               # 12-factor의 입구

핵심 1 — content/ 안의 13개 마크다운이 본체

  • "코드 레포가 아니라 책 레포" — 모든 가치는 13개 짧은 마크다운에 있음
  • 각 글은 5~15분이면 읽음. Factor 3과 Factor 8이 가장 길고 핵심

핵심 2 — workshops/ — 손으로 따라가는 실습

  • 단계별 코드가 폴더로 분리. TypeScript 기반이 주
  • 본문이 추상적이라고 느낀다면 이 폴더부터 클론해 돌려보는 게 가장 빠른 학습 경로

핵심 3 — img/ — 가이드의 시각 자산

  • 다이어그램이 많다 (010-software-dag, 025-agent-dag, 027-agent-loop-animation 등)
  • 본문보다 그림으로 먼저 이해가 빠를 때가 많음
06 — 학습 포인트What to learn

레포에서 가져갈 6가지 기술 자산

분야별로 무엇을 손에 잡을지.

프롬프트 엔지니어링 → 컨텍스트 엔지니어링

  • "프롬프트만 잘 쓰면 된다"라는 통념이 무너지는 과정이 보임
  • Factor 3 정독 후, 자기 프로젝트의 LLM 호출 한 곳을 골라 표준 messages 배열을 버리고 XML 태그 기반 단일 user 메시지로 재구성
  • 핵심 인용 — "Information Density: Structure information in ways that maximize the LLM's understanding"

구조화된 출력 / 함수 호출 / JSON 모드 차이

  • OpenAI·Anthropic·Google이 각각 다른 이름으로 부르는 세 가지 구조화 출력 방식 구분법
  • Factor 4와 외부 자료(Vellum, BAML 블로그)가 짝지어짐
  • 면접에서 "둘 차이가 뭐예요"라고 물어볼 때 자신감 있게 답할 수 있게 됨

Thread를 정의하는 타입 시스템 설계

  • Factor 3의 TypeScript 예제는 Thread = { events: Event[] }, Event = { type, data }로 시작
  • 이걸 한 번 자기 손으로 구현하면 "에이전트가 그냥 리스트일 뿐이구나"라는 감각이 생김

휴먼-인-더-루프(HITL) 설계

  • Factor 7 — "사람도 도구 호출의 결과로 받자"라는 단순한 발상의 전환
  • 결재 시스템, 위험한 액션 승인, 정보 부족 시 질문 등을 깔끔하게 모델링하는 방법

일시정지·재개가 되는 워크플로 설계

  • Factor 6 + Factor 12를 같이 읽으면 "왜 Temporal·Inngest·DBOS 같은 워크플로 엔진이 다시 뜨는가"가 보임
  • 에이전트는 결국 분산 워크플로의 일종 — 클래식 기술이 다시 무기로 돌아오는 중

"작은 에이전트 여러 개" 설계 사고

  • Factor 10은 멀티 에이전트 시스템(CrewAI 류)에 대한 신중한 옹호
  • 만능 에이전트 1개보다 단일 책임 원칙(SRP)을 따르는 작은 에이전트 여러 개가 신뢰성·디버깅·평가 모두에서 우월
07 — 요구사항Setup

읽고 실습하려면 무엇이 필요한가

가이드 자체는 GitHub에서 그냥 읽으면 된다.

구분도구용도
필수 런타임Node.js 18+ / pnpm 또는 npmTypeScript 워크숍 다수
필수 런타임Python 3.11+ (pip 또는 uv)Jupyter 노트북 예제용
필수 키OpenAI 또는 Anthropic API 키LLM 호출 (무료 크레딧 또는 소액)
필수 도구Git레포 클론
권장BAML CLIFactor 1~4를 코드로 익히기 좋은 DSL
권장로컬 LLM (Ollama)토큰 비용 걱정 없이 컨텍스트 포맷 실험
권장VS Code + Copilot 또는 Claude Code가이드 따라 미니 에이전트 짤 때
권장Slack 워크스페이스 (무료)Factor 11 트리거 실험

전반적으로 로컬 노트북 한 대 + API 키 한 개면 모든 원칙을 손으로 확인해볼 수 있다. GPU·서버는 필요 없다.

08 — 실습 과제Hands-on

직접 해볼 수 있는 9가지

난이도별 — Easy → Hard.

실습 1 — "다음 단계 결정자" 만들기Easy

1) Factor 1을 따라, 자연어 한 줄을 받아 { "intent": "send_email", "to": "...", "subject": "..." } 같은 JSON으로 변환하는 LLM 호출 작성 2) 도구는 실제로 실행하지 말고 콘솔에 찍기만 함 3) 30분짜리 과제

예시 입력: "오늘 회의록 정리해서 팀에 메일 보내줘" → tool: send_email, recipients: team, body: ...

실습 2 — messages 배열 → XML 단일 메시지Easy

Factor 3 따라, OpenAI 표준 messages 배열 대신 <slack_message>, <tool_call> 같은 태그로 같은 정보를 한 user 메시지에 욱여넣기. 토큰 수와 응답 품질 비교.

배우는 것: 컨텍스트 포맷이 정확도에 미치는 영향

실습 3 — 에러를 압축해 컨텍스트에Easy

Factor 9. 의도적으로 실패하는 도구(throw new Error("DB connection refused"))를 만들고, 그 에러 메시지를 컨텍스트에 1~2줄로 줄여 넣은 뒤 LLM이 다음 단계로 무엇을 제안하는지 관찰.

배우는 것: 자가 회복 패턴, "ROI 가장 높은 30분 실험"

실습 4 — "휴먼 도구" 추가하기Medium

Factor 7 구현. ask_human 도구를 정의하고, LLM이 이걸 호출하면 콘솔에서 사용자 입력을 받아 결과를 컨텍스트에 다시 붙이기. 실제 서비스라면 Slack DM이나 이메일로 대체.

배우는 것: HITL 패턴, 사람을 함수처럼 다루기

실습 5 — Pause/Resume 가능한 에이전트Medium

Factor 6 + Factor 12. Thread를 SQLite나 Redis에 저장하고, HTTP API 2개(POST /agent/start, POST /agent/resume/:id)만 노출. 서버를 죽였다 살려도 같은 ID로 재개되면 통과.

배우는 것: 영속화, 상태 외부화, 재현 가능성

실습 6 — 본인 프로젝트 LLM 호출 리팩토링Medium

이미 LLM을 쓰고 있다면 가장 위험한 곳(루프 안에서 LLM 부르는 곳)을 골라 ① 프롬프트 분리(Factor 2) ② 컨텍스트 포맷 직접 작성(Factor 3) ③ 제어 흐름 회수(Factor 8) 3종 세트 적용. Before/After 토큰 수와 정확도 비교.

배우는 것: 12-factor 적용 ROI를 자기 코드로 체감

실습 7 — 멀티 에이전트로 작업 분할Hard

Factor 10. "이메일 분류 → 요약 → 회신 초안" 같은 워크플로를 3개의 작은 에이전트로 쪼개고, 각 에이전트의 컨텍스트 윈도우를 독립적으로 관리. 한 에이전트가 다른 에이전트를 "도구"로 호출하게.

배우는 것: 합성(composition), 단일 책임 원칙

실습 8 — Slack 봇으로 트리거되는 12-factor 에이전트Hard

Factor 11 + 1~12 종합. Slack 슬래시 명령으로 시작 → 도구 호출 → 사람 승인(Factor 7) → 배포 → 결과 보고. 가장 현실적인 미니 프로덕트.

배우는 것: 종합적인 12-factor 적용, 실 사용 시나리오

실습 9 — eval(평가) 파이프라인 추가Hard

12-factor에 직접 언급은 짧지만, 작은 에이전트들의 신뢰성은 결국 자동 평가 없이는 측정 불가. 본인 에이전트에 대해 ① 기대 출력 데이터셋 ② 자동 평가 스크립트 ③ regression 감지 추가.

배우는 것: LLM 시스템의 회귀 테스트, 객관적 품질 측정

09 — 학습 로드맵8 weeks

8주 심화 학습 로드맵

주차별로 따라가면 12개 원칙 + 주변 기술 마스터.

Week 01
기본 개념 다지기

README + "Brief History of Software" 정독 → Anthropic "Building Effective Agents"와 비교 독서 → "에이전트"라는 단어 없이 시스템을 DAG/이벤트 루프로 설명해보기

Week 02
Factor 1~4 — 입력과 도구

Factor 1, 2, 3, 4 본문 + 실습 1, 2번 → OpenAI Function Calling vs JSON Mode vs Structured Outputs 비교 글 읽기 → BAML 튜토리얼 1개 따라하기

Week 03
Factor 5~6 — 상태 관리

Factor 5, 6 본문 + 실습 5번 → Temporal 또는 Inngest 무료 튜토리얼 1개 → SQLite로 Thread 저장소 직접 구현

Week 04
Factor 7~9 — 사람, 흐름, 에러

Factor 7, 8, 9 본문 + 실습 3, 4번 → HumanLayer 또는 자체 구현으로 ask_human 도구 작성

Week 05
Factor 10~12 — 운영 아키텍처

Factor 10, 11, 12 + 부록 13 정독 → 실습 7번(멀티 에이전트) 도전 → "Stateless Reducer"를 Redux/Elm 아키텍처와 비교

Week 06
실전 결합

실습 6번 — 본인 프로젝트의 LLM 호출 리팩토링 → Slack 봇 또는 이메일 트리거 추가(Factor 11)

Week 07
평가와 관측

실습 9번 — eval 파이프라인 추가 → LangSmith·Langfuse·Helicone 등 LLM 관측 도구 중 1개 도입

Week 08
발표와 기록 (캡스톤)

실습 8번(Slack 봇) 또는 본인 프로젝트의 Before/After를 사내 발표 → 12-factor-agents에 한국어 번역·예제·이슈로 기여

10 — 키워드 사전Glossary

핵심 용어 한눈에

레포를 읽다 막힐 만한 단어들.

Context Engineering
2025년 중반부터 "프롬프트 엔지니어링"의 후계어로 부상. 프롬프트뿐 아니라 도구 스키마·히스토리·RAG 문서·메모리 등 LLM에 들어가는 모든 입력의 설계. Factor 3의 별명.
RAG (Retrieval-Augmented Generation)
LLM에 답을 시키기 전에 외부 DB·문서에서 관련 자료를 먼저 끌어다 컨텍스트에 붙이는 방식. 12-factor에선 "Factor 3에서 어떻게 잘 넣을 것인가"의 한 갈래.
MCP (Model Context Protocol)
Anthropic이 2024년 말 공개한 표준. 에이전트가 외부 도구·데이터에 접근하는 공통 인터페이스. Factor 4의 표준 구현체로 자연스럽게 자리.
Tool Calling vs Structured Outputs vs JSON Mode
JSON Mode = "유효 JSON만" 약한 보장. Structured Outputs = 스키마 강제. Tool Calling = "어떤 도구를 어떤 인자로" 모델이 선택. 공급자마다 이름·동작 미묘하게 다름.
Stateless Reducer
Factor 12의 핵심. nextEvent = agent(thread, lastEvent) 형태로 에이전트를 순수 함수로 본다. 같은 입력 → 같은 출력 → 재현·테스트·디버깅 쉬워짐.
Schema Aligned Parsing
BAML의 핵심 기법. LLM이 뱉은 텍스트를 미리 정의한 타입 스키마에 "맞춰" 파싱. 모델이 살짝 형식을 깨도 유연하게 복구. Factor 4 본문에서 외부 링크로 소개.
Outer Loop / Inner Loop Agent
Outer = 사용자가 자리를 비워도 시간 단위로 일하는 장기 에이전트(이메일 모니터링). Inner = 사용자 옆에서 즉답하는 단기 에이전트(채팅 코파일럿). 저자 블로그 The Outer Loop에서 자주 쓰는 구분.
12-Factor App (원조)
2011년 Adam Wiggins(Heroku 공동창업자)가 발표한 클라우드 친화 웹앱 12원칙. 코드베이스 단일화, 설정·코드 분리, 백엔드 서비스 분리, 무상태 프로세스 등. 12-factor-agents가 정신과 형식을 빌렸음.
DSL (Domain-Specific Language)
특정 영역만 깔끔하게 풀라고 만든 좁은 언어. SQL이 DB용 DSL인 것처럼 BAML은 "LLM 프롬프트를 함수처럼 다루기 위한" DSL.
Function Calling
Tool Calling과 사실상 동의어. OpenAI가 처음 이 이름으로 출시. "함수를 호출"하는 게 아니라 "함수 호출 의도를 JSON으로 표현"하는 것.
Pre-fetch (Factor 13)
필요할 만한 컨텍스트는 LLM 호출 전에 미리 가져와라. LLM이 한 번에 결정 못 내리고 도구를 여러 번 호출하는 흔한 원인 제거.
HumanLayer
저자 Dex Horthy의 회사 제품. "사람을 도구로 호출"하는 SaaS. Factor 7의 레퍼런스 구현. Slack·이메일로 승인 요청을 받음.
11 — 참고 링크Refs

더 깊이 파고들 자료

레포 · 강연 · 관련 표준.

공식 자료

관련 표준 · 비교 자료

핵심 라이브러리 · 사례

Action · 오늘 당장 시도

12-factor를 처음 만났다면 이 순서로.

  1. Factor 3 하나만 정독한다. 13개 글 다 읽으려고 미루지 말 것. 컨텍스트 윈도우 한 편이 12-factor 전체 가치의 절반을 차지한다.
  2. 본인 프로젝트의 가장 위험한 LLM 호출 1곳을 골라본다. 루프 안에 있거나 응답이 자주 깨지는 곳. 그 한 곳에 Factor 2(프롬프트 분리) + Factor 3(컨텍스트 포맷 직접 작성)만 적용해도 체감이 확 바뀐다.
  3. "에이전트"라는 말을 한 번 빼고 다시 설계해본다. 같은 시스템을 "이벤트 루프 + 도구 함수 + 상태 저장소"로 풀어쓰면 무엇이 어색한지 보인다. 그 어색함이 보통 12-factor 위반 지점이다.
  4. 실패를 컨텍스트에 압축해 넣는 실험. 의도적으로 실패하는 도구 하나를 만들어 LLM이 그걸 보고 다음 단계를 어떻게 제안하는지 본다. 가장 ROI 높은 30분 실험.
  5. messages 배열을 XML로 바꿔본다. OpenAI 표준 messages 배열 대신 <slack_message>·<tool_call> 태그로 한 user 메시지에 욱여넣고 토큰 수·정확도를 비교. 컨텍스트 엔지니어링의 첫 손맛.
출처 · humanlayer/12-factor-agents (GitHub, 19.1k★, CC BY-SA 4.0 + Apache 2.0) · github.com/humanlayer/12-factor-agents
TrendShift 2026-05-19 데일리 14위 · trendshift.io/repositories/14186