이 글은 LLM 에이전트가 단순한 OOP 비유가 아니라, 독립적인 프로그래밍 모델로 발전할 가능성을 설명한다. 1993년부터 존재한 Agent-Oriented Programming(AOP)은 LLM 덕분에 실용성이 크게 높아졌으며, 미래의 에이전트 프로그래밍은 OOP·Actor Model·BDI·ECS·LLM 추론이 결합한 형태가 될 수 있다. 핵심은 객체가 수동적으로 호출되는 존재였다면, 에이전트는 목표와 기억을 가진 채 스스로 행동하는 자율적 존재라는 점이다.
1. OOP의 비유를 넘어선 에이전트 프로그래밍
글은 class → SOUL.md/AGENT.md → instantiate → object라는 관점을 단순히 기존 객체지향 프로그래밍(OOP) 을 AI에 억지로 끼워 맞춘 비유로 보지 않는다. 오히려 이는 충분히 자연스럽고, 앞으로 하나의 새로운 프로그래밍 모델로 발전할 수 있는 생각이라고 평가한다.
사실 이런 관점은 새롭기만 한 것은 아니다. 1993년 Yoav Shoham은 이미 Agent-Oriented Programming(AOP) 이라는 이름의 논문을 발표했고, 이를 OOP의 한 특수화된 형태로 설명했다. 일반 객체가 state를 갖는다면, 에이전트는 다음과 같은 더 '정신적인' 상태를 가진다.
- beliefs: 믿고 있는 정보, 세계에 대한 인식
- decisions: 내린 결정
- capabilities: 할 수 있는 능력
- obligations: 수행해야 하는 의무
또한 에이전트 사이의 통신 자체를 프로그래밍의 기본 요소로 본다. 즉 객체의 필드와 메서드만으로 세계를 구성하는 대신, 각자 생각과 목표를 가진 존재들이 메시지를 주고받는 세계를 구성하려는 접근이다.
다만 과거에는 이 아이디어가 멋졌음에도 현실에서 구현하기가 쉽지 않았다. 그런데 LLM의 등장으로, 약 30년 전의 개념이 훨씬 현실적인 모델이 되었다는 것이 글의 출발점이다. 🤖
2. OOP 요소와 LLM 에이전트의 대응
글은 OOP의 주요 개념이 LLM 에이전트 세계에서 상당히 자연스럽게 대응된다고 설명한다.
| OOP 개념 | LLM 에이전트 세계 |
|---|---|
class | AGENT.md, SOUL.md, Agent Definition |
| 클래스 필드 | 기본 성격, 목표, 제약, 능력 |
new Foo() | 에이전트 생성 또는 spawn |
| 객체 인스턴스 | 실제로 실행 중인 에이전트 |
| 인스턴스 변수 | 메모리, 믿음, 현재 목표, 컨텍스트 |
| 메서드 | 스킬, 도구, 행동 |
| 메서드 호출 | 작업 요청, 메시지, 이벤트 |
| private field | 비공개 메모리, 내부 추론 상태 |
| interface | 에이전트 프로토콜, 능력 계약 |
| 생성자 인자 | 모델, 도구, 환경, 인증 정보, 초기 컨텍스트 |
| composition | 스킬·도구·정책의 조합 |
| runtime | 에이전트 스케줄러, 오케스트레이터, 시뮬레이션 세계 |
예를 들어 alice와 bob이 같은 Agent Class에서 생성되었다고 해도, 각자가 다른 사건을 경험하고 다른 기억을 쌓으면 시간이 갈수록 서로 다른 존재가 된다. 이는 같은 클래스에서 만들어진 객체들이 각기 다른 인스턴스 상태를 갖는 것과 매우 닮아 있다.
즉, 동일한 설계도에서 출발하더라도 기억과 경험의 차이가 에이전트의 개성을 만들어낸다.
3. 객체보다 강한 추상화로서의 에이전트
하지만 글은 에이전트를 단순한 객체와 동일시하는 데서 멈추지 않는다. 에이전트는 객체보다 더 강한 추상화라고 본다.
전통적인 객체는 기본적으로 수동적(passive) 이다. 외부에서 메서드를 호출해야 행동한다. 반면 에이전트는 자신만의 실행 루프를 갖고, 주변 상황을 관찰하고, 목표를 판단하며, 스스로 다음 행동을 결정할 수 있다.
이를 다음과 같이 정리한다.
에이전트 = 객체 + 자율성 + 목표 + 기억 + 추론 + 이벤트 루프
이 때문에 에이전트 지향 프로그래밍은 순수한 OOP보다는 다음 요소들이 함께 섞인 구조에 더 가깝다.
- OOP: 정체성, 상태, 캡슐화
- Actor Model: 메시지 전달과 독립적인 실행 단위
- BDI 모델: 믿음(Belief), 욕구(Desire), 의도(Intention)
- LLM: 자연어 기반의 유연한 추론과 행동 선택
특히 기존의 AgentSpeak나 Jason 같은 에이전트 언어는 이미 다음과 같은 흐름을 사용했다.
belief → desire → intention → plan → action
믿음 → 욕구 → 의도 → 계획 → 행동
에이전트는 관찰과 통신을 통해 세계에 대한 믿음을 만들고, 원하는 것들 가운데 일부를 실제 의도로 선택한 뒤, 계획을 실행해 행동한다. 오늘날 LLM 에이전트 역시 더 유연한 형태로 비슷한 과정을 수행할 수 있다.
4. LLM이 바꾼 핵심: 정신 상태를 '코딩'하지 않고 '서술'하기
과거 AOP가 어려웠던 가장 큰 이유는 에이전트의 정신 상태와 행동 규칙을 어떻게 프로그래밍할지에 있었다. 개발자는 믿음, 목표, 계획, 규칙 등을 형식 언어로 하나하나 엄밀하게 작성해야 했다.
개념은 강력했지만 실제 개발은 복잡하고 번거로웠다.
LLM 시대에는 상황이 달라진다. 에이전트의 역할, 성격, 가치관, 목표, 행동 원칙을 Markdown이나 자연어 문서로 적는 것만으로도 어느 정도 행동 명세가 될 수 있다. 예를 들어 SOUL.md 같은 문서가 에이전트의 정체성과 행동 기준을 정의하는 코드에 가까운 역할을 할 수 있다.
글은 이 차이를 매우 선명하게 표현한다.
옛날 AOP에서는 에이전트의 정신 상태를 프로그래밍해야 했고,
LLM 시대에는 에이전트의 정신 상태를 서술하면 된다.
즉, 자연어로 작성된 지침은 단순한 문서가 아니라 실행 가능한 행동 명세(executable behavioral specification) 에 가까워진다. 이것이 LLM이 기존 에이전트 프로그래밍의 장벽을 크게 낮춘 핵심 변화다.
5. 시뮬레이션과 게임에서 특히 잘 맞는 구조
이 모델은 특히 게임과 시뮬레이션에서 강력하다. 게임에서 OOP가 잘 작동했던 이유는 게임 세계가 플레이어, NPC, 몬스터, 아이템, 건물처럼 실제 개체들의 집합으로 보이기 때문이다.
마찬가지로 에이전트 시뮬레이션에서도 세계를 여러 자율적 존재들의 집합으로 정의할 수 있다. 예를 들어 스타트업 시장을 시뮬레이션한다면 창업자, 투자자, 고객, 경쟁사, 직원 등 각각을 별도의 에이전트로 만들 수 있다.
중앙 시스템이 모든 비즈니스 규칙과 결과를 직접 작성하는 대신, 각 에이전트가 자신의 목표·기억·제약을 바탕으로 상호작용하게 하면 예상하지 못한 행동이 나타날 수 있다. 이를 창발적 행동(emergent behavior) 이라고 한다. 🌱
2023년 Stanford와 Google의 Generative Agents 연구가 주목받은 것도 이 방향과 연결된다. LLM 에이전트들에게 기억, 반성, 계획 능력을 부여하고 작은 마을에서 상호작용하도록 하자, 파티 초대가 퍼지고 사회적 행동이 자연스럽게 이어지는 현상이 나타났다.
즉, LLM 에이전트는 기존의 에이전트 기반 시뮬레이션에 더 자연스러운 대화와 상황 해석, 행동 선택 능력을 더할 수 있다.
6. SOUL.md와 AGENT.md의 역할 구분
글은 class == SOUL.md라고 단순하게 대응시키면 중요한 구분이 빠질 수 있다고 지적한다.
더 적절한 구조는 다음과 같다.
SOUL.md: 에이전트의 정체성, 가치관, 행동 성향, 기본적인 우선순위AGENT.md: 에이전트 전체 클래스 정의에 가까운 문서- 인스턴스 상태: 실제 메모리, 현재 목표, 경험, 환경 정보, 컨텍스트
즉 SOUL.md는 에이전트가 "어떤 존재인가"를 설명한다. 반면 AGENT.md는 그 에이전트가 어떤 도구를 쓰고, 어떤 입력을 받고, 어떤 제약 속에서 실행되며, 어떤 방식으로 행동하는지까지 포괄하는 더 큰 정의가 된다.
같은 AGENT.md를 기반으로 생성된 에이전트라도, 서로 다른 SOUL.md나 초기 컨텍스트, 기억을 갖는다면 전혀 다른 인격과 행동을 보일 수 있다.
7. 메서드 호출에서 의도와 메시지 중심으로
에이전트의 '메서드'는 기존 OOP의 메서드와도 다르다.
일반적인 OOP에서는 호출자가 무엇을 실행할지 결정한다. 예를 들어 어떤 객체에 send_email() 메서드를 호출하면, 객체는 요청받은 그 행동을 수행한다.
하지만 에이전트는 외부에서 요청이나 메시지를 받더라도, 그 요청을 그대로 수행할지 스스로 판단할 수 있다. 자신의 목표, 규칙, 현재 상황, 권한, 위험도 등을 고려해 행동을 거절하거나 다른 행동을 택할 수 있다.
따라서 프로그래밍의 중심 추상화는 다음처럼 이동할 가능성이 있다.
메서드 호출(Method invocation) 에서
의도(Intent) · 메시지(Message) · 이벤트(Event) 로
이는 매우 큰 변화다. 외부 시스템은 에이전트에게 "이 행동을 즉시 실행하라"고 명령하기보다, "이런 요청이 있다", "이런 일이 발생했다", "이 목표를 고려해 달라"는 식으로 메시지를 전달한다. 이후 최종 행동 결정은 에이전트 내부에 남는다.
8. OOP의 부활이 아니라 Active Object로의 진화
글은 이 현상을 단순히 "OOP의 부활" 이라고 표현하기보다, OOP가 Active Object 모델로 한 단계 진화하는 과정이라고 보는 편이 더 흥미롭다고 말한다.
기존 OOP의 핵심 관점은 다음과 같았다.
세계를 객체들로 모델링한다.
반면 LLM 시대의 에이전트 지향 프로그래밍은 다음처럼 표현할 수 있다.
세계를 자율성을 가진 행위자들로 모델링한다.
여기서 중요한 차이는 객체가 단지 데이터와 기능을 묶은 단위라면, 에이전트는 목표를 세우고, 기억을 바탕으로 판단하며, 사건에 반응하고, 다른 존재와 협상하거나 협력하는 행위자(actor with agency) 라는 점이다.
9. 상속보다 조합으로 향할 에이전트 설계
게임 개발의 역사도 에이전트 설계에 힌트를 준다. 게임은 초기에 상속 중심 구조를 많이 사용했지만, 시간이 갈수록 복잡한 상속 계층이 관리하기 어려워지는 문제가 나타났다.
그래서 많은 게임 시스템은 ECS(Entity Component System) 처럼 구성 요소를 조합하는 방식으로 이동했다. 즉 "이 캐릭터는 전사 클래스의 하위 클래스"라고 설계하는 대신, 이동 능력·공격 능력·인벤토리·대화 능력·AI 제어 등의 컴포넌트를 필요한 만큼 붙이는 방식이다.
에이전트도 마찬가지로, 거대한 상속 구조보다 능력 조합(capability composition) 으로 설계될 가능성이 높다.
예를 들면 하나의 에이전트는 다음을 조합해 구성될 수 있다.
- 고객 응대 스킬
- 웹 검색 도구
- 코드 실행 도구
- 이메일 접근 권한
- 안전 정책
- 장기 기억 시스템
- 일정 관리 능력
- 특정 도메인 지식
- 특정 역할의 성격과 가치관
결국 미래의 에이전트 프로그래밍은 다음 요소들의 결합으로 발전할 수 있다.
OOP의 객체 정체성
ECS의 조합성
Actor Model의 메시지 전달
BDI의 목표와 의도
LLM의 유연하고 모호한 추론
10. new가 다시 특별해지는 순간
글의 마지막은 new 연산자의 의미가 달라질 수 있다는 흥미로운 관찰로 이어진다.
기존 프로그래밍에서 new Object()는 보통 메모리에 객체 인스턴스를 생성하는 연산이다. 하지만 자율적 에이전트의 세계에서 new Agent()는 단순한 데이터 구조 하나를 만드는 일이 아닐 수 있다.
그것은 기억하고, 판단하고, 목표를 세우고, 메시지에 반응하며, 스스로 행동할 수 있는 새로운 자율적 존재를 세계에 태어나게 하는 일에 가까워진다.
new는 단순히 메모리를 할당하는 것이 아니라,
하나의 새로운 autonomous entity를 세상에 태어나게 하는 연산이 될 수 있다.
따라서 처음 제시된 "Class → SOUL.md/AGENT.md → instantiate → Objects" 라는 관점은 단순한 비유를 넘어, 미래 에이전트 시스템을 설계하는 데 유용한 출발점이 된다. OOP가 객체로 세계를 모델링했다면, 에이전트 지향 프로그래밍은 이제 기억하고 판단하며 행동하는 존재들의 사회를 모델링하려는 방향으로 나아가고 있다.
