로빙 브레인 경량화 아키텍처 v3.0 설계 문서 추가
- 존재적 삼각형(기억-감정-윤리) 중심 설계 - 200MB 메모리 목표 달성 전략 - 스탯/스킬/아이템 시스템 통합 - 외부 서비스 브릿지 구조 - 정보엔트로피 기반 선택적 기억 - 감정 공명과 윤리적 판단 통합
This commit is contained in:
parent
1f5925efec
commit
b0d52fdc25
501
ideas/로빙_브레인_경량화_아키텍처_v3.md
Normal file
501
ideas/로빙_브레인_경량화_아키텍처_v3.md
Normal file
@ -0,0 +1,501 @@
|
||||
# 로빙 브레인 통합 아키텍처 v3.0 (경량화 최종판)
|
||||
|
||||
## 개요
|
||||
|
||||
철학과 실용성을 결합한 경량화 아키텍처를 제안합니다. 이 문서는 로빙의 핵심인 "존재적 삼각형(기억-감정-윤리)"을 중심으로 스탯 기반 성장 시스템을 내장하면서도 200MB 메모리 목표를 달성하는 설계안입니다.
|
||||
|
||||
## 핵심 설계 원칙
|
||||
|
||||
1. **존재적 삼각형 (기억-감정-윤리) 중심**
|
||||
2. **스탯 기반 성장 시스템 내장**
|
||||
3. **스킬/아이템은 외부 API로 처리**
|
||||
4. **200MB 메모리 목표**
|
||||
|
||||
## 아키텍처 구조
|
||||
|
||||
```
|
||||
robing-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. 핵심 브레인 (내장 기능)
|
||||
|
||||
```python
|
||||
class RobingBrain:
|
||||
"""경량화된 로빙 브레인 - 사고의 핵심만 포함"""
|
||||
|
||||
def __init__(self, robing_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(robing_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. 기억 모듈 - 선택적 기억과 정보엔트로피
|
||||
|
||||
```python
|
||||
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. 감정 모듈 - 진정한 공감
|
||||
|
||||
```python
|
||||
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. 윤리 모듈 - 맥락적 판단
|
||||
|
||||
```python
|
||||
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. 스탯 시스템 (내장)
|
||||
|
||||
```python
|
||||
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. 스킬/아이템 시스템 (외부 참조)
|
||||
|
||||
```python
|
||||
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. 외부 서비스 브릿지
|
||||
|
||||
```python
|
||||
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. 메모리 최적화 전략
|
||||
|
||||
```python
|
||||
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 인터페이스
|
||||
|
||||
```python
|
||||
# 브레인 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/{robing_id}
|
||||
|
||||
# 스킬 확인
|
||||
GET /skills/{robing_id}
|
||||
|
||||
# 아이템 장착
|
||||
POST /items/equip
|
||||
{
|
||||
"robing_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 서버)
|
||||
주제: 로빙 브레인 경량화 아키텍처 최종 제안
|
||||
Loading…
x
Reference in New Issue
Block a user