6단계: AI 프로젝트 실전 및 생산 배포
LLM 기반 소프트웨어를 프로덕션 환경에서 사용할 수 있도록 구축하기 위한 12가지 핵심 원칙. AI 애플리케이션의 프로토타입에서 프로덕션으로의 전환에 따른 주요 엔지니어링 과제 해결에 중점을 둡니다.
12 Factor Agents - 신뢰할 수 있는 LLM 애플리케이션 구축을 위한 12가지 원칙
개요
12 Factor Agents는 Dex Horthy와 HumanLayer 팀이 개발한, 프로덕션 환경에서 사용 가능한 LLM 기반 소프트웨어를 구축하기 위한 원칙적인 방법론입니다.
배경 및 동기
왜 이 원칙들이 필요한가?
저자는 100명 이상의 SaaS 개발자(주로 기술 창업자)들과 교류한 후, 대부분의 AI 에이전트 개발이 "70-80% 품질 병목 현상"에 직면한다는 것을 발견했습니다.
- 초기 빠른 진행: 기존 프레임워크를 사용하여 70-80%의 기능을 빠르게 달성
- 품질 병목: 80%가 고객 대면 기능에는 충분히 좋지 않다는 것을 발견
- 프레임워크 한계: 80%를 돌파하려면 프레임워크, 프롬프트, 프로세스 등을 역설계해야 함
- 처음부터 다시 시작: 결국 프레임워크를 버리고 처음부터 다시 시작해야 함
핵심 통찰
- 대부분의 성공적인 프로덕션급 "AI 에이전트"는 실제로는 그렇게 "에이전트답지" 않습니다.
- 이들은 주로 핵심 지점에서 LLM을 교묘하게 사용하는 정교하게 설계된 소프트웨어 시스템입니다.
- 고객이 고품질 AI 소프트웨어를 가장 빠르게 사용할 수 있도록 하는 방법은 작고 모듈화된 개념을 채택하여 기존 제품에 통합하는 것입니다.
12가지 핵심 원칙
Factor 1: 자연어를 도구 호출로
자연어를 도구 호출로 변환
LLM의 핵심 초능력은 자연어를 구조화된 데이터(JSON)로 변환하는 것입니다. 모든 에이전트 작업은 이 기본 변환에서 시작되어야 합니다.
// 핵심 패턴
const response = await llm.generateToolCall(userMessage, availableTools);
// response는 구조화된 JSON이며, 자유 텍스트가 아님
Factor 2: 프롬프트 소유하기
프롬프트 소유하기
프롬프트를 일회성 입력이 아닌, 핵심적이고 버전 관리되는 코드 자산으로 취급하십시오.
- 애플리케이션 코드베이스에서 프롬프트 관리
- 체계적인 테스트, 배포 및 롤백 지원
- 일관성, 재현성 및 통제된 진화 보장
Factor 3: 컨텍스트 윈도우 소유하기
컨텍스트 윈도우 소유하기
LLM의 컨텍스트 윈도우를 능동적이고 의도적으로 관리하십시오.
- 컨텍스트 윈도우가 현재 작업과 직접 관련된 정보만 포함하도록 보장
- "컨텍스트 드리프트"를 방지하기 위해 불필요한 데이터 제거
- LLM 성능 향상 및 토큰 사용량 감소
Factor 4: 도구는 그저 구조화된 출력일 뿐
도구는 구조화된 출력일 뿐
"도구"를 LLM 출력의 구조화된 JSON으로 간주하고 유효성을 검사하십시오.
// 도구 호출은 그저 JSON 스키마 유효성 검사일 뿐
const toolCall = validateToolCall(llmOutput, toolSchema);
const result = await executeValidatedTool(toolCall);
Factor 5: 실행 상태와 비즈니스 상태 통합
실행 상태와 비즈니스 상태 통합
LLM의 내부 "실행 상태"가 애플리케이션의 실제 "비즈니스 상태"와 일치하도록 보장하십시오.
- LLM이 오래되거나 잘못된 정보에 기반하여 작동하는 것을 방지
- 환각 또는 유효하지 않은 작업 방지
- 실행 상태를 비즈니스 상태 옆에 영구 저장
Factor 6: 간단한 API로 시작/일시 중지/재개
간단한 API로 시작/일시 중지/재개
수명 주기 관리를 지원하는 명확한 프로그래밍 인터페이스를 가진 LLM 에이전트를 설계하십시오.
interface AgentControl {
launch(config: AgentConfig): Promise<AgentInstance>;
pause(instanceId: string): Promise<void>;
resume(instanceId: string): Promise<void>;
}
Factor 7: 도구 호출로 사람과 소통
도구 호출로 사람과 소통
인간 상호작용을 일등 시민 도구 호출로 처리하십시오.
- 고위험 단계는 사람의 검토로 라우팅
- 사람의 피드백을 구조화된 입력으로 시스템에 반환
- 원활한 인간-기계 협업 프로세스
Factor 8: 제어 흐름 소유하기
제어 흐름 소유하기
제어 흐름을 일반 코드 또는 자체 워크플로우 엔진 내에 유지하십시오.
- 명시적인 OODA 루프(관찰-정향-결정-행동) 실행
- 중첩된 프롬프트 대신 수렴 휴리스틱 사용
- LLM이 복잡한 제어 흐름을 관리하도록 하지 마십시오.
Factor 9: 오류를 컨텍스트 윈도우로 압축
오류를 컨텍스트 윈도우로 압축
피드백 루프를 닫기 위해 오류 정보를 다음 프롬프트로 압축하십시오.
- LLM이 오류로부터 학습하고 복구할 수 있도록 함
- 구조화된 오류 정보 제공
- 자가 복구 능력 지원
Factor 10: 작고 집중된 에이전트
작고 집중된 에이전트
거대한 모놀리식 챗봇 대신 작고 단일 목적의 에이전트를 구축하십시오.
// 좋은 사례: 집중된 작은 에이전트
class EmailSummaryAgent {
async summarize(email: Email): Promise<Summary> { /* ... */ }
}
class PriorityClassificationAgent {
async classify(email: Email): Promise<Priority> { /* ... */ }
}
Factor 11: 어디서든 트리거, 사용자가 있는 곳에서 서비스 제공
어디서든 트리거, 사용자가 있는 곳에서 서비스 제공
사용자가 이미 작업하고 있는 곳에서 에이전트를 트리거하십시오: CLI, 웹훅, 크론 등.
- 기존 워크플로우에 통합
- 다양한 트리거 메커니즘
- 사용자 친화적인 접근 지점
Factor 12: 에이전트를 무상태 리듀서로 만들기
에이전트를 무상태 리듀서로 만들기
애플리케이션이 상태를 관리하고, 에이전트는 무상태를 유지합니다.
// 무상태 에이전트 패턴
class StatelessAgent {
step(state: State): Promise<State> {
}
}
기술 아키텍처 패턴
핵심 루프 단순화
각 에이전트는 본질적으로 다음으로 귀결됩니다:
const prompt = "Instructions for next step selection";
const switchFunction = (json) => routeToFunction(json);
const context = manageWhatLLMSees();
const loop = whileNotDone();
전통적인 DAG와의 차이점
- 전통적인 DAG: 소프트웨어 엔지니어가 각 단계와 엣지 케이스를 코딩
- 에이전트 방식: 에이전트에게 목표와 일련의 변환을 제공하고, LLM이 실시간으로 경로를 결정하도록 함
- 실제 상황: 가장 성공적인 구현은 더 큰 결정론적 DAG 내에서 에이전트 패턴을 교묘하게 사용하는 것임
적용 시나리오
가장 적합한 시나리오
- 자연어 이해가 필요한 구조화된 작업
- 인간-기계 협업이 필요한 워크플로우
- 복잡한 다단계 비즈니스 프로세스
- 높은 신뢰성이 필요한 프로덕션 환경
적합하지 않은 시나리오
- 간단한 결정론적 작업 (코드를 직접 작성하는 것이 더 좋음)
- 100% 정확성이 필요한 중요 업무
- 자원이 극도로 제한된 환경
구현 제안
점진적 채택
- 작게 시작: 현재 당면한 과제와 관련된 원칙 하나를 선택
- 구현 및 관찰: 개선 효과 확인
- 점진적으로 추가: 그 다음 다른 원칙 추가
- 지속적인 최적화: 끊임없이 개선하고 조정
기술 스택 추천
- 언어: TypeScript (저자 추천, Python 등 다른 언어도 지원)
- 핵심 라이브러리: BAML (스키마 정렬 파싱용)
- 배포: 클라우드 네이티브 및 Kubernetes 지원
관련 자료
공식 자료
추가 자료
- Building Effective Agents (Anthropic)
- 12 Factor Apps 원본 방법론
- Function Calling vs Structured Outputs vs JSON Mode
요약
12 Factor Agents는 진정으로 프로덕션 환경에서 사용 가능한 LLM 애플리케이션을 구축하기 위한 체계적인 방법을 제공합니다. 이 방법론은 더 마법 같은 프레임워크를 만드는 것이 아니라, LLM 기능에 더 나은 소프트웨어 엔지니어링 관행을 적용하는 것을 강조합니다. 핵심 개념을 기억하십시오: 에이전트는 소프트웨어이며, 소프트웨어처럼 다루면 신뢰성, 유지보수성, 그리고 경쟁자가 따라올 수 없는 능력으로 보답할 것입니다.