"장난감"에서 "교재"로: 500행 AI 프레임워크의 자기 수양
요약
기존의 복잡한 Agent 프레임워크와 달리, Agent의 작동 원리를 깊이 있게 이해할 수 있도록 설계된 교육용 프레임워크 FROST를 소개합니다. 500행 미만의 단순한 코드로 Store, Skill, Agent라는 세 가지 핵심 개념을 구현하여 학습 격차를 해소하는 데 집중합니다.
핵심 포인트
- 기존 프레임워크의 과도한 추상화로 인한 학습 격차 문제 지적
- FROST는 프로덕션용이 아닌 교육용 프레임워크로 설계됨
- Store, Skill, Agent라는 세 가지 핵심 클래스로 구성된 단순한 구조
- 복잡한 의존성 없이 Agent의 내부 동작 원리 이해에 최적화
왜 나는 500행짜리 Agent 바퀴를 새로 만들려고 하는가?
안녕하세요, FROST의 저자입니다.
2026년이 되었습니다. Agent 프레임워크는 눈이 휘둥그레질 정도로 많습니다. LangGraph는 월 다운로드 수가 3,450만 회에 달하고, Dify는 GitHub에서 129.8K Stars를 획득했으며, 주요 기업들은 앞다투어 자신들의 SDK를 밀어붙이고 있습니다. 이런 환경에서 또 다른 "바퀴(wheel)"를 만드는 것이 과연 불필요한 일은 아닐까요?
솔직히 말씀드리면, 저도 오랫동안 고민했습니다.
하나의 혼란: 초보자의 딜레마
이 일은 한 번의 실패한 튜터링에서 시작되었습니다.
저는 한 친구의 Agent 개발 입문을 돕기 위해 LangChain을 추천했습니다. 결과적으로 그는 두 달 동안 공부했지만, 여전히 chain.invoke()와 씨름하고 있었고, 머릿속에는 "Agent가 도대체 어떻게 작동하는가"라는 개념이 전혀 자리 잡지 못했습니다.
문제는 어디에 있었을까요?
현재의 프레임워크들은 너무 강력합니다. 모든 복잡성을 숨겨버릴 정도로 강력합니다. 단 세 줄의 코드로 Agent를 실행할 수 있지만, 내부에서 어떤 일이 일어나는지는 영원히 알 수 없습니다. 마치 운전을 배우는 것과 같습니다. 가속 페달을 밟고 코너를 도는 법은 배웠지만, 엔진이 어떻게 작동하는지, 변속기가 어떻게 변속되는지는 전혀 모르는 상태와 같습니다.
Agent의 본질을 진정으로 이해하고자 하는 사람들에게 이것은 거대한 격차(Gap)입니다.
| 요구사항 | 기존 옵션 |
|---|---|
| 빠른 제품 개발 | LangChain/CrewAI |
| ... |
이 공백이 바로 FROST가 존재하는 이유입니다.
FROST의 설계 철학: Less is More
FROST는 프로덕션급(production-grade) 프레임워크가 아닙니다. 이것은 교육용 프레임워크입니다.
이는 의도적으로 다음을 포기했음을 의미합니다:
- ❌ 복잡한 의존성 생태계 (LangChain이 필요 없음)
- ❌ 풍부한 도구 통합 (100개 이상의 내장 도구가 없음)
- ❌ 분산 배포 능력 (단순한 단일 머신 Python)
FROST는 오직 세 가지 핵심 개념만을 유지합니다:
# Store - 기억 컨테이너 (신경 세포의 저장 기능과 유사)
class Store:
"""컨텍스트, 기억, 상태를 저장"""
def __init__(self): self.data = {}
# Skill - 순수 함수 변환 (신경 세포의 처리 기능과 유사)
class Skill:
"""입력→처리→출력, 무상태(stateless)"""
def __call__(self, store, *args, **kwargs): pass
# Agent - 실행 단위 (신경 세포 자체와 유사)
class Agent:
"""Skill을 호출하고, Store를 조작하여 목표를 달성"""
def __init__(self, skills: list[Skill], store: Store): pass
네, 이토록 간단합니다. 세 개의 클래스, 500행이 채 되지 않는 코드.
하지만 바로 이러한 단순함이 "이해"를 가능하게 만듭니다.
한 줄의 코드로 실행되는 Agent
from frost import Agent, Store, Skill
# "검색 도우미" Skill 정의
class SearchSkill(Skill):
def __call__(self, store, query):
result = web_search(query) # 여기는 당신의 검색 구현부입니다
store.set("last_search", result)
return result
# Agent 생성 및 실행
store = Store()
agent = Agent(skills=[SearchSkill()], store=store)
response = agent.run("오늘 서울 날씨 어때?")
print(response)
LangChain을 사용하여 동일한 기능을 구현하는 것과 비교해 보세요:
from langchain.agents import AgentExecutor, create_react_agent
from langchain_openai import ChatOpenAI
# ... 여기에 십여 줄의 초기화 코드가 더 필요합니다
FROST는 당신이 첫 번째 줄의 코드를 작성할 때부터 자신이 무엇을 하고 있는지 알게 해줍니다:
- Agent는 실행자입니다.
- Skill은 그것의 능력입니다.
- Store는 그것의 기억입니다.
마법도 없고, 블랙박스도 없습니다. 오직 명확한 데이터 흐름만이 존재합니다.
왜 FROST라고 부르는가?
FROST의 전체 이름은 Fractal Remote Organ of Scalable Thoughts — 즉, 확장 가능한 사고를 위한 프랙탈 원격 기관입니다.
이 이름은 설계 영감인 **신경 세포 (Neural Cell)**에서 유래되었습니다.
생물학에서 각 신경 세포는 매우 단순합니다:
- 신호를 수신함
- 신호를 처리함
- 신호를 발신함
하지만 수십억 개의 신경 세포가 서로 연결될 때, 지능이 창발(Emergence)합니다.
FROST는 소프트웨어 계층에서 이 과정을 재현하려고 시도합니다:
Neural Cell (신경 세포) → Agent (에이전트)
Synapse (시냅스) → Skill (기술)
Long-term Memory (장기 기억) → Store (저장소)
...
이것은 뇌를 모방하는 것이 아니라, 생물계의 지혜를 배우는 것입니다: 단순한 단위 + 명확한 연결 = 복잡한 행동.
나의 시행착오 일기
제로 베이스에서 프레임워크를 작성하는 사람으로서, 제가 빠졌던 함정(Pitfall)은 코드 줄 수보다 더 많았습니다:
함정 1: "완전함"을 추구하다 프로젝트를 망칠 뻔함
처음에는 설정 관리, 로그 시스템, 오류 재시도(Error Retry)를 포함한 "완전한 프레임워크"를 설계했습니다. 2,000줄을 작성한 후 저는 깨달았습니다:
- 코드 복잡도가 기하급수적으로 상승함
- 핵심 개념이 세부 사항 속에 파묻힘
- 교육적 가치가 제로(0)가 됨
교훈: 교육용 프레임워크의 제1원칙은 **최소화(Minimization)**입니다. 기능은 나중에 추가할 수 있지만, 첫인상은 되돌릴 수 없습니다.
함정 2: "이게 무슨 소용인가"라는 의구심
가장 흔한 의구심은 다음과 같습니다: "이렇게 단순한 프레임워크를 실제 운영 환경(Production Environment)에서 누가 쓰겠습니까?"
저의 대답은 이렇습니다: 이것은 운영 환경을 위한 것이 아닙니다.
FROST의 사용자 페르소나는 다음과 같습니다:
- Python을 막 배우고 Agent를 이해하고 싶은 학생
- 애플리케이션 계층에서 저수준(Low-level) 원리까지 깊이 파고들고 싶은 개발자
- 학생들에게 Agent의 작동 원리를 보여주고 싶은 강사
**"모든 것을 할 수 있는 것"보다
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기