Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

1편의 물음표에서 시작한다 — “일반 LLM을 어떻게 일하는 에이전트로 바꿀 것인가?” ReAct 패턴과 Akka Become() 상태 머신이 만나는 자리. 작성일: 2026-04-13. 대상: 1편을 읽은 .NET / 서버 개발자.

Image Added

0. 들어가며 — 1편의 물음표, 그 이후

1편에서 우리는 Akka.NET 액터 모델로 여러 AI CLI 터미널 사이의 통신 복잡성을 풀었다. 설계 → 구현 → 개선 → 테스트를 거치며 “사회자 LLM + 3개 Claude 터미널” 시나리오가 동작하는 것을 확인했다.

...

답은 ReAct 패턴 + Akka Become() 상태 머신에 있다. 이 글에서는 그 설계를 기술적으로 깊이 파고든다.

...

1. 일반 LLM은 왜 에이전트가 아닌가

Image Added

1.1 동기 루프의 한계

현재 AgentWin의 RunFunctionCallLoopAsync는 다음과 같이 동작한다:

...

결론: 일반 LLM에 “기다림”과 “깨어남”을 가르치는 것이 에이전트화의 핵심이다.

...

2. ReAct — 추론과 행동의 합주

Image Added

2.1 ReAct란 무엇인가

ReAct(Reasoning + Acting)는 Yao et al.(2022)이 제안한 패턴으로, LLM이 생각(Thought) → 행동(Action) → 관찰(Observation)을 반복하며 과제를 수행하는 구조다.

...

4. ReAct 액터 상태 머신 — 전체 설계

Image Added

4.1 상태 전이 다이어그램

Code Block
languagetext
                    UserInput / CompletionSignal
                           │
                    ┌──────▼──────┐
          ┌────────│   Thinking   │←────────────┐
          │        │  (LLM 호출)  │              │
          │        └──────┬──────┘              │
          │               │                     │
          │    ToolCalls?  │  No ToolCalls?      │
          │    ┌───────────┼───────────┐        │
          │    ▼                       ▼        │
     ┌────┴────┐              ┌───────────┐    │
     │ Acting   │              │  Complete  │    │
     │(도구실행) │              │ (최종응답)  │    │
     └────┬────┘              └───────────┘    │
          │                                     │
          │ 즉시 결과?       비동기 대기?         │
          ├─────────────┬───────────────────────┤
          ▼             ▼                       │
   Become(Thinking)  ┌──────────┐              │
                     │ Waiting  │──completion──┘
                     │(시그널대기)│
                     └────┬─────┘
                          │ timeout (30s)
                          ▼
                   Become(Thinking)
                   "타임아웃됨, 현재 상태 확인"

...

상태

진입 조건

수신 메시지

전이

Thinking

StartReAct / CompletionSignal / 도구결과 / timeout

LLM 호출 → ToolCalls 유무로 분기

Acting

Thinking에서 ToolCalls 있음

도구 실행 → 즉시결과면 Thinking, 비동기면 Waiting

Waiting

Acting에서 비동기 도구

CompletionSignal, TaskComplete, ReceiveTimeout

시그널 → Thinking, 타임아웃 → Thinking

Complete

Thinking에서 ToolCalls 없음

부모에게 결과 전송, 액터 대기

4.3 Waiting 상태가 풀어내는 것

Image Added

Before (동기 루프):

Code Block
languagetext
term_send("npm test") → "Sent to term-0" (즉시 반환)
→ LLM: "결과 확인해야지" → term_read × 12 (55초간 동일 데이터 반복)
→ 10라운드 소진 → 루프 종료 → 테스트 결과 누락

...

기술

역할

상태

ReAct Pattern

LLM의 추론-행동-관찰 루프 구조화

설계 완료, Phase 2 구현 예정

Akka.NET Become()

상태 머신 런타임 전환, 스레드 안전

Phase 2 핵심

Akka ReceiveTimeout

비동기 대기 타임아웃, 교착 방지

Phase 2 핵심

Akka Supervision

자식 액터 장애 자동 복구

기존 적용, 확장 예정

세션 메모리 (Actor State)

온디바이스 모델의 컨텍스트 보존

설계 완료, Phase 2와 통합

LM-Kit.NET

온디바이스 추론 엔진 (gemma-4)

NuGet 설치 완료, Phase 4

ILlmProvider 추상화

원격/온디바이스 LLM 전환 투명화

Phase 4

Akka.Persistence

이벤트 소싱으로 상태 재생/복구

향후 검토

Akka Streams

LLM API 역압(backpressure) 제어

향후 검토

...

Image Added

11. 마무리 — LLM에게 기다림을 가르치다

...