대사 과정은 복잡합니다. 생물학에서 미토콘드리아(Mitochondria)나 리소좀(Lysosomes) 같은 세포 소기관들은 중앙의 '스크립트'를 따르지 않습니다. 대신 화학 신호에 반응하고 자원을 협상하죠. Cyto Agent를 구축하면서, 저는 이러한 분산된 지능을 최신 LLM 에이전트 패턴을 사용하여 구현하고자 했습니다. 이 글에서는 'LangGraph 스타일' 툴 호출 오케스트레이터를 통해 실시간 세포 시뮬레이션을 구축하는 방법을 깊이 파고들어 보겠습니다.
문제점: 스크립팅 vs. 동적 지능
대부분의 시뮬레이션은 하드코딩된 if/else 계단식 구조를 사용합니다. if (pathogen) { defend(); }와 같은 방식입니다. 이는 효율적이지만, 생물학적 적응이 가진 미묘한 뉘앙스를 담아내지 못합니다. Cyto Agent는 이러한 계단식 구조를 Nucleus Agent로 대체했습니다. Nucleus Agent는 LLM 기반의 오케스트레이터로서, 세포 상태를 비정형 데이터(unstructured data)로 인식하고 사용 가능한 도구들을 추론하며 행동을 결정합니다.
고수준 아키텍처 (High-Level Architecture)
시스템은 세 가지 주요 구성 요소로 나뉩니다:
- The Engine (Simulation.ts): 세포의 '물리'를 처리하는 반응형 상태 기계(reactive state machine)입니다 (ATP 감소, 포도당 소비, 병원체 손상 등).
- The Event Bus (EventBus.ts): 에이전트들이 강하게 결합되지 않은 상태에서도 신호를 '듣게' 해주는 pub/sub 시스템입니다.
- The AI Orchestrator (LangChainService.ts): 시뮬레이션 상태와 LLM 추론 사이의 다리 역할을 합니다.
'감지 도구(Sensing Tools)' 패턴
이 구축 과정에서 가장 흥미로운 부분은 LLM에게 '눈'과 '손'을 제공하는 것입니다. 전체 상태를 모든 프롬프트에 주입하는 대신, 저는 툴 호출(Tool Calling)을 구현했습니다:
const queryStatus = tool (
async ({ id }) => {
}
)
특정 소기관의 경우 ATP Efficiency: Level ${ state . mitoLevel } , Integrity: ${ state . lysoLevel } 를 반환합니다. }, { name : "query_organelle_status" , description : "소기관의 특정 원격 측정 데이터를 조사합니다." , schema : z . object ({ id : z . string () }), } ); 위기 상황이 발생하면, 핵(Nucleus)은 단순히 패닉에 빠지지 않습니다. 바이러스성 균주와 곰팡이성 균주 각각에 대한 구체적인 대응책을 검색하기 위해 check_genomic_database(pathogen_type)를 호출합니다. 이는 "도메인 지식" (데이터베이스)과 "추론" (LLM)을 분리하는 것입니다. 실시간 시각화 생태계를 살아있게 만들기 위해 Framer Motion을 사용하여 세포 구성 요소를 애니메이션 처리했습니다. 병원체는 단순히 정적인 점이 아닙니다. 그들의 행동은 유형에 따라 달라집니다: 바이러스성 : 고주파 복제를 반영하는 스파이크 모양의 빠르게 진동하는 푸크시아색 아티팩트. 박테리아성 : 대사 독성을 반영하는 느리게 움직이는 에메랄드빛 알약 모양. 곰팡이성 : 느리고 꾸준한 성장을 나타내는 맥동하는 호박색 포자. 결과: 자율 진화 가장 보람 있는 기능 중 하나는 "자율 진화(Autonomous Evolution)"입니다. 핵은 요약된 ATP를 사용하여 미토콘드리아를 "진화"시키기로 결정할 수 있습니다 (랭크 2 또는 3으로 업그레이드). 이는 사용자의 개입 없이도 시뮬레이션이 시간이 지남에 따라 스스로 최적화되는 피드백 루프를 만듭니다. 코드를 살펴보고 싶으신가요? 전체 리포지토리는 여기에서 확인하세요: https://www.dailybuild.xyz/project/128-cyto-agent