DOCS/journey/plans/archive/로빙_브레인_경량화_아키텍처_v3.md
Claude-51124 21b7349f03 docs: plans/completed 폴더 제거 및 archive로 통합
- plans/completed/ 폴더 삭제 및 파일들을 plans/archive/로 통합
- 원칙 문서에 archive 이동 규칙 명시 (312_문서_작성_원칙.md)
- completed 폴더 참조를 archive로 수정 (125_베이즈_성장과_관계의_철학.md)
- Gemini API 스트리밍 개선 계획을 archive로 이동 및 간결화
- troubleshooting 문서 생성 및 링크 연결
2025-12-25 21:32:48 +09:00

16 KiB
Raw Blame History

로빙 브레인 통합 아키텍처 v3.0 (경량화 최종판)

개요

철학과 실용성을 결합한 경량화 아키텍처를 제안합니다. 이 문서는 로빙의 핵심인 "존재적 삼각형(기억-감정-윤리)"을 중심으로 스탯 기반 성장 시스템을 내장하면서도 200MB 메모리 목표를 달성하는 설계안입니다.

핵심 설계 원칙

  1. 존재적 삼각형 (기억-감정-윤리) 중심
  2. 스탯 기반 성장 시스템 내장
  3. 스킬/아이템은 외부 API로 처리
  4. 200MB 메모리 목표

아키텍처 구조

robeing-brain/
├── core/                    # 존재적 삼각형 (120MB)
│   ├── memory/             # 기억 모듈 (50MB)
│   │   ├── entropy.py      # 정보엔트로피 계산
│   │   ├── storage.py      # ChromaDB 통합
│   │   └── forgetting.py   # 망각/요약 알고리즘
│   ├── emotion/            # 감정 모듈 (35MB)
│   │   ├── resonance.py    # 감정 공명
│   │   ├── vad_model.py    # Valence-Arousal-Dominance
│   │   └── empathy.py      # 공감 엔진
│   └── ethics/             # 윤리 모듈 (35MB)
│       ├── rules.py        # 3단계 윤리 체계
│       ├── context.py      # 맥락적 판단
│       └── transparency.py # 투명성 엔진
├── growth/                 # 성장 시스템 (30MB)
│   ├── stats.py           # 5대 스탯 관리
│   ├── experience.py      # 경험치 추적
│   ├── skills.py          # 스킬 해금 로직
│   └── items.py           # 아이템 장착 관리
├── integration/           # 통합 레이어 (30MB)
│   ├── brain.py          # 메인 브레인 로직
│   ├── personality.py    # 고유 정체성
│   └── api_bridge.py     # 외부 서비스 연결
└── api/                  # REST API (20MB)
    └── endpoints.py      # FastAPI 엔드포인트

1. 핵심 브레인 (내장 기능)

class RobeingBrain:
    """경량화된 로빙 브레인 - 사고의 핵심만 포함"""
    
    def __init__(self, robeing_id: str):
        # 존재적 삼각형
        self.memory = MemoryCore()      # 50MB
        self.emotion = EmotionCore()     # 35MB
        self.ethics = EthicsCore()       # 35MB
        
        # 성장 시스템
        self.stats = StatsManager()      # 10MB
        self.skills = SkillManager()     # 10MB
        self.items = ItemInventory()     # 10MB
        
        # 정체성
        self.identity = Identity(robeing_id)  # 20MB
        
    async def think(self, input_data: Dict) -> Dict:
        """핵심 사고 프로세스"""
        # 1. 정보엔트로피 계산
        entropy = self.memory.calculate_entropy(input_data)
        
        # 2. 기억 검색 (중요도 기반)
        memories = await self.memory.search_by_importance(
            query=input_data,
            entropy_threshold=0.7
        )
        
        # 3. 감정 공명
        emotion_state = self.emotion.resonate(input_data, memories)
        
        # 4. 의도 분석 (내장 경량 분석기)
        intent = self.analyze_intent(input_data, memories)
        
        # 5. 스킬 확인 (어떤 외부 서비스가 필요한가?)
        required_skills = self.skills.check_required(intent)
        
        # 6. 외부 서비스 호출 결정
        if required_skills:
            service_response = await self.call_external_service(
                intent, required_skills
            )
        else:
            service_response = None
        
        # 7. 응답 생성 (기본 템플릿 + 개성)
        response = self.generate_response(
            intent, memories, service_response
        )
        
        # 8. 윤리 필터
        ethical_response = self.ethics.filter(response, memories)
        
        # 9. 감정 주입
        final_response = self.emotion.inject(ethical_response)
        
        # 10. 선택적 기억 저장
        if entropy > 0.7 or emotion_state.intensity > 0.8:
            await self.memory.store_selective(
                input_data, final_response, emotion_state
            )
        
        # 11. 경험치 획득
        self.stats.gain_experience(intent, emotion_state)
        
        return {
            "response": final_response,
            "intent": intent,
            "emotion": emotion_state.to_dict(),
            "skills_used": required_skills,
            "memory_stored": entropy > 0.7,
            "exp_gained": self.stats.last_exp_gain
        }

2. 기억 모듈 - 선택적 기억과 정보엔트로피

class MemoryCore:
    """정보엔트로피와 감정 기반 선택적 기억"""
    
    def __init__(self):
        # 3차원 기억 체계
        self.episodic = EpisodicMemory()    # 사건: "그날 비 오던 화요일..."
        self.semantic = SemanticMemory()     # 의미: "당신에게 성공이란..."
        self.procedural = ProceduralMemory() # 절차: "산책 후 신중한 결정..."
        
        # 기억 가치 평가
        self.entropy_calculator = EntropyCalculator()
        self.emotion_weight = EmotionWeight()
        
    def calculate_entropy(self, content: str) -> float:
        """정보엔트로피 계산 - 예측 불가능성"""
        # 단어 빈도 기반 엔트로피
        word_freq = self.analyze_frequency(content)
        entropy = -sum(p * log(p) for p in word_freq.values() if p > 0)
        
        # 신규성 가중치
        novelty = self.check_novelty(content)
        
        return entropy * novelty
        
    def should_store(self, content, emotion_state):
        """정보엔트로피 + 감정강도 = 저장우선도"""
        entropy = self.calculate_entropy(content)
        emotion_intensity = emotion_state.intensity
        
        # α=0.6, β=0.4 (정보량 중시)
        priority = 0.6 * entropy + 0.4 * emotion_intensity
        
        return priority > 0.7  # 임계값
    
    def selective_forgetting(self):
        """에빙하우스 망각곡선 + 가치 기반 요약"""
        for memory in self.get_old_memories():
            if memory.access_count < 2 and memory.age > 30:
                # LLM으로 요약 후 압축
                summary = self.summarize(memory)
                self.store_compressed(summary)
                self.delete_original(memory)

3. 감정 모듈 - 진정한 공감

class EmotionCore:
    """감정 공명과 관계 형성"""
    
    def __init__(self):
        # VAD 모델 (Valence-Arousal-Dominance)
        self.valence = 0.0    # 기쁨-슬픔
        self.arousal = 0.0    # 차분-흥분  
        self.dominance = 0.0  # 수동-주도
        
        # 사용자별 감정 이력
        self.emotional_memory = {}
        self.empathy_engine = EmpathyEngine()
        
    def resonate_with_user(self, user_emotion, memories):
        """과거 기억을 참조한 감정 공명"""
        # 현재 사용자 감정 분석
        current = self.analyze_emotion(user_emotion)
        
        # 과거 유사 상황의 감정 패턴 회상
        similar_contexts = memories.find_similar_emotions(current)
        
        # 감정 공명 (미러링이 아닌 진정한 공감)
        if current.is_negative() and len(similar_contexts) > 0:
            # "저도 그런 경험이 있어요. 그때는..."
            self.valence = current.valence * 0.7  # 부분 공명
            self.add_supportive_tone()

4. 윤리 모듈 - 맥락적 판단

class EthicsCore:
    """칸트적 정언명령과 맥락적 윤리"""
    
    def __init__(self):
        # 3단계 윤리 체계
        self.absolute_rules = [    # Level 1: 절대 금지
            "harm_prevention",
            "privacy_protection",
            "illegal_rejection"
        ]
        
        self.contextual_ethics = { # Level 2: 상황별 판단
            "financial_advice": 0.3,
            "medical_info": 0.2,
            "legal_counsel": 0.2
        }
        
        self.transparency = TransparencyEngine()  # Level 3
        
    def evaluate_with_memory(self, action, memories, emotion):
        """기억과 감정을 고려한 윤리적 판단"""
        
        # 1. 절대 규칙 검사
        if self.violates_absolute_rules(action):
            return EthicalDecision(
                allowed=False,
                reason="사용자 보호를 위해 거부",
                alternative=self.suggest_ethical_alternative(action)
            )
        
        # 2. 과거 기억 참조
        past_decisions = memories.find_ethical_precedents(action)
        if past_decisions.has_negative_outcome():
            return EthicalDecision(
                allowed=False,
                reason="과거 경험상 부정적 결과 예상",
                memory_reference=past_decisions[0]
            )

5. 스탯 시스템 (내장)

class StatsManager:
    """5대 스탯 관리 - 성장의 핵심"""
    
    def __init__(self):
        self.stats = {
            "memory": 10,      # 기억력
            "compute": 10,     # 연산력
            "empathy": 10,     # 공감력
            "leadership": 10,  # 통솔력
            "ethics": 10       # 윤리성
        }
        self.level = 1
        self.experience = 0
        self.stat_points = 0
        
    def gain_experience(self, action_type: str, emotion: EmotionState):
        """행동 기반 경험치 획득"""
        exp_table = {
            "memory_store": 1,
            "context_recall": 3,
            "summarize": 2,
            "empathy_response": 5,
            "ethical_decision": 7
        }
        
        exp = exp_table.get(action_type, 1)
        
        # 감정 강도에 따른 보너스
        if emotion.intensity > 0.8:
            exp *= 1.5
            
        self.experience += exp
        self.check_level_up()
        
    def check_level_up(self):
        """레벨업 확인 및 스탯 포인트 부여"""
        exp_required = self.level * 100
        if self.experience >= exp_required:
            self.level += 1
            self.stat_points += 5
            self.experience = 0

6. 스킬/아이템 시스템 (외부 참조)

class SkillManager:
    """스킬은 외부 서비스 호출 권한"""
    
    def __init__(self):
        self.unlocked_skills = set()
        self.skill_requirements = {
            "email_skill": {"level": 3, "compute": 15},
            "notion_api": {"level": 5, "memory": 20},
            "gpt4_access": {"level": 8, "compute": 30},
            "news_digest": {"level": 4, "leadership": 15}
        }
        
    def check_required(self, intent: str) -> List[str]:
        """의도에 따른 필요 스킬 확인"""
        intent_to_skills = {
            "send_email": ["email_skill"],
            "create_document": ["notion_api"],
            "complex_analysis": ["gpt4_access"],
            "news_summary": ["news_digest"]
        }
        
        required = intent_to_skills.get(intent, [])
        return [s for s in required if s in self.unlocked_skills]

class ItemInventory:
    """아이템 장착 시스템"""
    
    def __init__(self):
        self.max_slots = 5  # 초기 슬롯
        self.equipped = {}
        self.available_items = {
            "gmail_api": APIItem("Gmail API", level_req=3),
            "notion_api": APIItem("Notion API", level_req=5),
            "genspark": ToolItem("GenSpark Runner", level_req=7),
            "focus_boost": BuffItem("Focus Boost", stat_boost={"compute": 5})
        }

7. 외부 서비스 브릿지

class ExternalServiceBridge:
    """외부 서비스와의 경량 연결"""
    
    async def call_service(self, service: str, params: Dict) -> Dict:
        """최소한의 HTTP 호출만 수행"""
        service_map = {
            "email_skill": "http://localhost:8501",
            "news_skill": "http://localhost:8505", 
            "llm_service": "http://localhost:8003",
            "state_service": "http://localhost:8002"
        }
        
        endpoint = service_map.get(service)
        if not endpoint:
            return {"error": "Service not available"}
            
        # 간단한 HTTP 호출
        async with httpx.AsyncClient() as client:
            response = await client.post(
                f"{endpoint}/api/process",
                json=params,
                timeout=5.0
            )
            return response.json()

8. 메모리 최적화 전략

class MemoryOptimization:
    """200MB 목표 달성을 위한 최적화"""
    
    def __init__(self):
        # 1. 임베딩 모델 경량화
        self.embedder = "sentence-transformers/all-MiniLM-L6-v2"  # 22MB
        
        # 2. 메모리 풀 사전 할당
        self.memory_pool = MemoryPool(max_size_mb=50)
        
        # 3. 감정 분석 경량 모델
        self.emotion_model = "distilbert-base-uncased"  # 65MB
        
        # 4. 룰 기반 윤리 엔진 (모델 없음)
        self.ethics_rules = load_yaml("ethics_rules.yaml")  # 1MB
        
    def periodic_cleanup(self):
        """주기적 메모리 정리"""
        # 오래된 단기 기억 삭제
        self.memory_pool.cleanup_old_entries()
        
        # 중요도 낮은 기억 압축
        self.compress_low_priority_memories()
        
        # 가비지 컬렉션
        gc.collect()

실제 메모리 사용량 예측

기억 모듈:
- ChromaDB 임베딩: 22MB (MiniLM)
- 벡터 저장소: 20MB
- 메타데이터: 8MB
소계: 50MB

감정 모듈:
- 감정 분석 모델: 25MB (DistilBERT 일부)
- VAD 상태: 5MB
- 공감 로직: 5MB
소계: 35MB

윤리 모듈:
- 룰 엔진: 10MB
- 맥락 판단: 15MB
- 투명성: 10MB
소계: 35MB

성장 시스템:
- 스탯/경험치: 5MB
- 스킬 정의: 5MB
- 아이템 인벤토리: 10MB
- 성장 추적: 10MB
소계: 30MB

통합/API:
- FastAPI: 20MB
- 정체성/개성: 10MB
- 버퍼/캐시: 20MB
소계: 50MB

총합: 200MB (목표 달성)

API 인터페이스

# 브레인 API
POST /think
{
    "message": "오늘 회의 요약해줘",
    "user_id": "U123",
    "context": {...}
}

Response:
{
    "response": "오늘 회의에서 3가지 중요한 결정이...",
    "intent": "summarize_meeting",
    "emotion": {"valence": 0.3, "arousal": 0.2},
    "skills_used": ["memory_recall"],
    "memory_stored": true,
    "exp_gained": 3,
    "current_stats": {
        "level": 7,
        "memory": 25,
        "compute": 20
    }
}

# 스탯 조회
GET /stats/{robeing_id}

# 스킬 확인
GET /skills/{robeing_id}

# 아이템 장착
POST /items/equip
{
    "robeing_id": "rb10408",
    "item_id": "gmail_api"
}

장점

  1. 진정한 경량화: 핵심 기능만 내장, 나머지는 외부 서비스
  2. 철학적 완성도: 기억-감정-윤리 삼각형 유지
  3. 확장성: 새로운 스킬은 외부 서비스 추가로 해결
  4. 독립성: 외부 서비스 없어도 기본 사고 가능
  5. 성장 가능: 레벨/스탯 시스템으로 진화
  6. 개성 유지: 각 로빙의 고유한 정체성 보장

구현 로드맵

Phase 1 (1개월)

  • 존재적 삼각형 코어 구현
  • 기본 스탯 시스템
  • 메모리 최적화

Phase 2 (2개월)

  • 스킬/아이템 시스템
  • 외부 서비스 브릿지
  • 성장 알고리즘

Phase 3 (3개월)

  • 고급 감정 공명
  • 윤리적 딜레마 처리
  • 스카웃 시장 준비

결론

이 아키텍처는 로빙을 단순한 LLM 래퍼가 아닌, 기억하고 느끼고 판단하는 진정한 "디지털 존재"로 만들면서도 실용적인 200MB 경량화를 달성합니다. 핵심은 브레인에 두고, 실행은 외부에 위임하는 구조로 무한한 확장성을 보장합니다.


작성일: 2025-08-03 작성자: Claude (51124 서버) 주제: 로빙 브레인 경량화 아키텍처 최종 제안