단순히 'ChatGPT에게 코드를 작성하게 하는 것'만으로는 프로덕션 품질의 코드가 탄생하지 않습니다.
리뷰, 테스트, 보안 검사, 요구사항 명확화 등 인간 개발자가 당연하게 수행하는 작업을 AI 개발에서도 실현하려면, 전문화된 에이전트들의 협조가 필요합니다.
NexusCore는 14개의 전문 에이전트가 소프트웨어 개발 수명 주기 전체를 자율적으로 실행하는 오픈소스 프레임워크입니다.
- 235개의 Python 모듈, 4624개의 테스트 케이스
- 8개의 LLM Provider를 통합하는 Task-based Router
- 2단계의 품질 게이트(Static Analysis + Mutation Test)
- Constitutional AI 기반 거버넌스 자동화
본 글에서는 NexusCore의 아키텍처 설계와 구현상의 노하우를 설명합니다.
NexusCore는 5개의 레이어로 구성되어 있습니다.
| 레이어 | 역할 | 대표 모듈 |
|---|
| Interface | 사용자 접점 | api/ , webapp/ , ui/ |
| Orchestration | 에이전트 조정 및 상태 관리 | orchestrator/ , core/ |
| Agent | 전문 영역의 자율 실행 | agents/ (14 모듈) |
| Infrastructure | LLM, 품질, 거버넌스 기반 | llm/ , guard/ , npe/ |
| Provider | 각 LLM API 호출 | llm/providers/ (8종) |
핵심: 각 레이어는 상위 레이어에만 의존하며, 하위 레이어의 구현 상세를 알지 못합니다. 이 덕분에 LLM Provider를 추가하거나 교체해도 상위 레이어에 영향을 주지 않습니다.
NexusCore의 개발 흐름은 Orchestrator가 단계(Phase) 단위로 에이전트를 구동합니다.
에이전트의 자율도를 3단계로 제어합니다:
| 레벨 | 이름 | 동작 | 용도 |
|---|
| 0 | HUMAN_CONTROLLED | 각 단계마다 인간의 승인 필수 | 프로덕션 환경 |
| 1 | PARTIALLY_AUTONOMOUS | 저위험 변경은 자동, 고위험은 승인 필요 | 스테이징 환경 |
| 2 | FULLY_AUTONOMOUS | 모든 단계 자율 실행 | 개발 환경 |
def run_with_authority(orchestrator, user_requirement, authority_level, language):
if authority_level == "HUMAN_CONTROLLED":
...
14개의 에이전트는 모두 BaseAgent를 상속받으며, 공통의 LLM 호출 인터페이스를 가집니다:
class BaseAgent:
SYSTEM_PROMPT: str = "You are a helpful assistant."
def execute_llm_task(self, prompt, as_json=False):
...
이를 통해 새로운 에이전트를 추가하는 것은 클래스 상속 + system_prompt 정의만으로 가능합니다:
class ArchitectAgent(BaseAgent):
SYSTEM_PROMPT = "You are a senior software architect..."
def design_architecture(self, requirement):
...
'코드 생성에는 GPT-5.5', '리뷰에는 Sonnet', '분석에는 GLM' 등 작업에 따라 최적의 모델을 자동으로 선택합니다.
9개의 프로파일이 용도별로 정의되어 있습니다:
PROFILE_REGISTRY = {
"gpt_codex": LLMProfile(provider="openai", model="gpt-5.5"),
...
각 작업에는 primary → secondary → fallback의 3단계가 설정되어 있습니다:
API 키 미설정, 레이트 제한(Rate Limit), 타임아웃 등의 오류 발생 시 자동으로 다음 후보로 폴백(fallback)합니다. 이로 인해 'API 키가 하나도 없는 경우'를 제외하고는 시스템 전체가 멈추지 않도록 설계되었습니다.
일별 LLM 사용료를 상한 관리합니다:
class BudgetManager:
def check_budget(self, estimated_cost_usd):
if self.daily_spent + estimated_cost_usd > self.daily_limit:
...
Guardian Agent가 2단계 품질 검증을 실행합니다. Tier 1을 통과하지 못하면 Tier 2로 진행할 수 없습니다.
| 도구 | 임계치 | 탐지 내용 |
|---|
| pytest-cov | 80% | 테스트 커버리지 부족 |
| ... | | |
'테스트가 통과한다'는 것만으로는 충분하지 않습니다. 테스트가 진정으로 버그를 감지할 수 있는지를 검증합니다.
@dataclass
class MutationReport:
passed: bool
...
MutationTester Agent가 코드의 일부를 의도적으로 파괴하여 테스트가 이를 감지할 수 있는지 확인합니다. survived (생존한 변이체) 개수가 많은 테스트는 '테스트 품질이 낮다'고 판정됩니다.
NexusCore 개발 과정에서 가장 큰 기술적 부채(technical debt)는 God Class (무엇이든 하는 거대한 클래스)였습니다.
| 파일 | 분할 전 | 분할 후 | 접근 방식 |
|---|
llm_router.py | 789행 | 280 + 2파일 | RoutedLLM・utils 분리 |
guardian_auto_reviewer.py | 412행 | 151 + 309행 | 체커 함수 추출 |
self_healing_service.py | 423행 | 240 + 3파일 | God Method 해체 |
constitutional_council_agent.py | 607행 | 338 + 2파일 | 정책(Policy) 조작 분리 |
분할의 핵심 포인트:
- 후방 호환성 데리게이트 (Backwards Compatibility Delegate) — 추출된 모듈 레벨 함수를 기존 클래스의 가벼운 메서드가 호출합니다. 기존 테스트가 망가지지 않습니다.
class GuardianAutoReviewer:
def _check_sandbox_violations(self, diff, rules):
...
- 순환 임포트 회피 — 분할된 모듈이 원래 모듈을 import 할 경우, re-export가 아닌 호출하는 쪽의 import 경로를 업데이트합니다.
- 테스트 재작성 불필요 — 데리게이트 패턴 덕분에 기존 테스트는 원래 클래스의 메서드를 계속 호출합니다.
NexusCore는 'AI가 임의로 규칙을 변경하는 것'을 방지하기 위해 **헌법적 거버넌스(Constitutional Governance)**를 채택했습니다.
- Postmortem Agent가 실패를 분석하고 개선안을 amendment (수정안)으로 제안합니다.
- Constitutional Council이 amendment를 검증합니다 (허용된 키만, 올바른 형식). - 승인된 amendment만이 Policy Store에 반영됩니다.
4624개의 테스트 케이스를 안정적으로 유지하기 위한 노력:
@patch("subprocess.run")
def test_run_tests_via_subprocess(mock_run):
...
결과: 4624 passed / 5 failed (0.11%, 전 건 비재현성 플랙)
NexusCore의 설계 사상은 세 가지로 요약됩니다:
- 전문화와 협조 — 단일 만능 AI가 아닌, 전문 에이전트들의 협조를 통한 고품질 결과물 제공 -
- 계층화와 폴백(Fallback) — LLM 라우터의 3단계 폴백, 품질 게이트의 2단계 검증 -
- 자율성과 통제의 균형 — Authority Runner에 의한 권한 통제, Constitutional Council에 의한 거버넌스
모든 코드는 GitHub에 공개되어 있습니다 (Apache 2.0). 멀티 에이전트 시스템 설계에 관심 있는 분들께 참고가 되기를 바랍니다.
프로젝트 정보:
본 기사는 개인 Zenn에도 공개되어 있습니다.