# RoBeing 서비스 아키텍처 비교 분석: rb10408_test vs rb10508_micro 작성일: 2025년 8월 11일 작성자: Claude (51124 서버) ## 개요 51124 서버에서 운영 중인 두 가지 RoBeing 서비스의 상세 비교 분석입니다. rb10408_test(무거운 버전)와 rb10508_micro(경량화 버전)의 리소스 사용량, 아키텍처, 로직을 비교하여 각 서비스의 장단점을 파악합니다. ## 1. 리소스 사용량 비교 ### 실시간 측정 결과 (2025-08-11 22:30) | 측정 항목 | rb10408_test | rb10508_micro | 성능 차이 | |-----------|--------------|---------------|-----------| | **메모리 사용량** | 304.3 MiB | 136.6 MiB | rb10508이 **55% 적게 사용** | | **메모리 점유율** | 1.28% | 0.57% | rb10508이 **0.71%p 낮음** | | **CPU 사용률** | 0.05% | 0.09% | 비슷한 수준 | | **프로세스 수** | 13개 | 73개 | rb10508이 더 많은 프로세스 | | **블록 I/O** | 8.75MB / 177MB | 30.3MB / 57.9MB | rb10408이 더 많은 쓰기 | ### 시스템 환경 | 항목 | rb10408_test | rb10508_micro | |------|--------------|---------------| | Python 버전 | 3.13.5 (최신) | 3.11.13 | | 가동 시간 | 2일 이상 | 15시간 | | Health 상태 | Healthy | Healthy | | 네트워크 모드 | Host | Host | ## 2. 아키텍처 차이 ### rb10408_test - 모놀리식 아키텍처 **핵심 특징**: - 자체 완결형 시스템 - 모든 기능을 내부에 포함 - 외부 의존성 최소화 **주요 구성 요소**: ``` rb10408_test ├── 내장 LLM 서비스 (OpenAI, Anthropic) ├── 자체 임베딩 생성 (sentence-transformers) ├── 로컬 ChromaDB (v0.5.20) ├── Brain 모듈 (직접 구현) └── Stats 시스템 (게임화) ``` **핵심 라이브러리**: - `torch==2.5.1` - 딥러닝 프레임워크 - `transformers==4.48.0` - NLP 모델 - `sentence-transformers==3.3.1` - 임베딩 생성 - `chromadb==0.5.20` - 벡터 데이터베이스 ### rb10508_micro - 마이크로서비스 아키텍처 **핵심 특징**: - 경량화된 코어 서비스 - 외부 서비스와 연동 - 모듈화된 구조 **주요 구성 요소**: ``` rb10508_micro ├── Langchain 체인 (추상화 레이어) ├── HTTP 임베딩 서비스 호출 ├── 최신 ChromaDB (v1.0.16) ├── 베이지안 메모리 선택 └── 함수형 프로그래밍 ``` **핵심 라이브러리**: - `langchain>=0.1.0` - LLM 오케스트레이션 - `chromadb>=0.4.0` - 벡터 데이터베이스 - `slack-bolt>=1.18.0` - Slack 통합 - ML 라이브러리 없음 (외부 서비스 활용) ## 3. 기능 및 로직 비교 ### 메모리 관리 | 기능 | rb10408_test | rb10508_micro | |------|--------------|---------------| | **임베딩 생성** | 자체 생성 (CPU/GPU) | 외부 서비스 호출 | | **메모리 선택** | 단순 유사도 검색 | 베이지안 + MMR 알고리즘 | | **저장 구조** | 단일 컬렉션 | 다중 컬렉션 (episodic, semantic, procedural) | | **검색 성능** | 빠름 (로컬) | 네트워크 지연 있음 | ### LLM 처리 | 기능 | rb10408_test | rb10508_micro | |------|--------------|---------------| | **LLM 호출** | 직접 API 호출 | Langchain 체인 | | **프롬프트 관리** | 하드코딩 | 템플릿 기반 | | **에러 처리** | 기본적 | 체계적 재시도 | | **모델 전환** | 수동 | 설정 기반 | ### 게임화 요소 | 기능 | rb10408_test | rb10508_micro | |------|--------------|---------------| | **Stats 시스템** | 구현됨 (파일 기반) | 미구현 | | **레벨링** | 경험치 시스템 | 없음 | | **스킬 트리** | 기본 구현 | 없음 | ### 스킬 서비스 통합 | 항목 | rb10408_test | rb10508_micro | |------|--------------|---------------| | **이메일 스킬** | ✅ 연동 (포트 8501) | ✅ 연동 (포트 8501) | | **뉴스 스킬** | ✅ 연동 (포트 8505) | ✅ 연동 (포트 8505) | | **슬랙 스킬** | ✅ 연동 (포트 8503) | ❌ 미연동 | | **임베딩 서비스** | ❌ 자체 처리 | ✅ 외부 서비스 (포트 8015) | | **스킬 라우팅** | Decision Engine 기반 | 미구현 | | **스킬 실행 전략** | Stats 기반 추천 | 수동 호출 | #### rb10408_test 스킬 실행 구조 ```python # Decision Engine이 스킬 실행 계획 수립 execution_plan = { "intent": "email_summary", "skills": [ {"name": "email_fetch", "params": {...}}, {"name": "summary_generate", "params": {...}} ] } # Stats Manager가 스킬 조합 추천 recommended = stats_manager.recommend_skill_combination(available_skills) # Router가 순차적으로 스킬 실행 for skill in execution_plan["skills"]: result = await execute_skill(skill) ``` #### rb10508_micro 스킬 실행 구조 ```python # 직접적인 스킬 호출 (구조화되지 않음) # 주로 Langchain 도구로 처리 # 외부 임베딩 서비스 의존 embedding_response = await httpx.post( SKILL_EMBEDDING_URL + "/embed", json={"text": text} ) ``` ### 스킬 서비스 성능 비교 | 측정 항목 | rb10408_test | rb10508_micro | |----------|--------------|---------------| | **스킬 호출 방식** | REST API | REST API | | **응답 시간** | ~500ms | ~300ms (캐싱) | | **에러 처리** | 재시도 로직 있음 | 기본 처리 | | **스킬 체이닝** | 지원 | 미지원 | | **병렬 실행** | 가능 | 불가능 | ### 임베딩 처리 비교 | 항목 | rb10408_test | rb10508_micro | skill-embedding | |------|--------------|---------------|-----------------| | **처리 방식** | 로컬 (내장) | HTTP API 호출 | 독립 서비스 | | **라이브러리** | sentence-transformers 3.3.1 | 없음 (외부 의존) | sentence-transformers | | **모델** | 다운로드 필요 | N/A | multilingual-MiniLM-L12-v2 | | **PyTorch** | 2.5.1 (338MB) | 없음 | 있음 | | **CUDA 지원** | 비활성화 | N/A | 비활성화 | | **메모리 사용** | ~500MB (모델 로드 시) | 0MB | 928MB (상시) | | **임베딩 차원** | 384 | 384 (외부) | 384 | | **최대 토큰** | 512 | 512 (외부) | 512 | | **처리 속도** | ~50ms/문장 | ~100ms/문장 (네트워크 포함) | ~30ms/문장 | | **캐싱** | 없음 | 가능 | 메모리 캐시 | #### 임베딩 아키텍처 차이 **rb10408_test - 모놀리식 임베딩** ```python from sentence_transformers import SentenceTransformer class EmbeddingService: def __init__(self): # 로컬에 모델 다운로드 및 로드 self.model = SentenceTransformer('multilingual-MiniLM') def embed(self, text): # CPU에서 직접 임베딩 생성 return self.model.encode(text) ``` **rb10508_micro - HTTP 임베딩 클라이언트** ```python class HTTPEmbeddingFunction: def __init__(self, api_url): self.api_url = api_url async def embed(self, texts): # 외부 서비스로 요청 response = await httpx.post( f"{self.api_url}/embed", json={"texts": texts} ) return response.json()["embeddings"] ``` **skill-embedding - 중앙화된 임베딩 서비스** ```python # 독립 실행 서비스 (포트 8015) # 모든 서비스가 공유 # 928MB 메모리 상시 사용 # 6일간 안정적 운영 중 ``` #### 임베딩 성능 분석 | 시나리오 | rb10408_test | rb10508_micro + skill-embedding | |----------|--------------|----------------------------------| | **첫 요청** | 모델 로드 (3-5초) | 즉시 응답 (서비스 상시 대기) | | **대량 처리** | 빠름 (로컬) | 네트워크 오버헤드 | | **메모리 효율** | 낮음 (중복 로드) | 높음 (공유 서비스) | | **확장성** | 제한적 | 수평 확장 가능 | | **장애 격리** | 전체 영향 | 임베딩만 영향 | #### 임베딩 최적화 권장사항 **rb10408_test 개선안**: 1. skill-embedding 서비스 활용으로 전환 2. 메모리 300MB+ 절약 가능 3. PyTorch 제거로 컨테이너 크기 감소 4. 모델 다운로드 시간 제거 **rb10508_micro 개선안**: 1. 임베딩 결과 캐싱 강화 2. 배치 처리 구현 3. 연결 풀링 최적화 4. 재시도 로직 추가 ## 4. 장단점 분석 ### rb10408_test **장점**: - ✅ 완전한 독립성 (외부 서비스 불필요) - ✅ 빠른 임베딩 생성 (로컬 처리) - ✅ 최신 Python 3.13 사용 - ✅ 게임화 요소 포함 - ✅ 단순한 배포 (단일 컨테이너) **단점**: - ❌ 높은 메모리 사용량 (304MB) - ❌ 대용량 ML 라이브러리 필요 - ❌ Stats 파일 초기화 문제 - ❌ 구버전 ChromaDB - ❌ 확장성 제한 ### rb10508_micro **장점**: - ✅ **낮은 메모리 사용량** (136MB, 55% 절약) - ✅ 최신 ChromaDB 1.0 - ✅ 베이지안 메모리 선택 (고급 알고리즘) - ✅ 모듈화된 구조 (유지보수 용이) - ✅ Langchain 생태계 활용 - ✅ 확장 가능한 아키텍처 **단점**: - ❌ 외부 서비스 의존성 - ❌ 네트워크 지연 가능성 - ❌ 복잡한 설정 - ❌ 많은 프로세스 수 (73개) - ❌ 게임화 요소 미구현 ## 5. 사용 권장 시나리오 ### rb10408_test 적합한 경우 1. **독립적 운영이 필요한 환경** - 인터넷 연결이 불안정한 환경 - 외부 서비스 의존성을 피해야 하는 경우 - 단일 서버 배포 2. **게임화 요소가 중요한 경우** - 사용자 참여도 향상이 목표 - Stats 기반 진행도 추적 필요 3. **빠른 응답이 중요한 경우** - 로컬 임베딩으로 네트워크 지연 없음 - 실시간 처리가 중요한 서비스 ### rb10508_micro 적합한 경우 1. **리소스 효율성이 중요한 환경** - 메모리 제약이 있는 서버 - 다중 서비스 운영 환경 - 비용 최적화가 필요한 경우 2. **확장성이 필요한 경우** - 마이크로서비스 아키텍처 선호 - 점진적 기능 추가 계획 - 외부 서비스 통합 예정 3. **고급 AI 기능이 필요한 경우** - 베이지안 메모리 선택 - Langchain 생태계 활용 - 다양한 LLM 모델 전환 ## 6. 최적화 제안 ### rb10408_test 개선 방안 1. **메모리 사용량 감소** - Torch 대신 ONNX Runtime 사용 - 모델 양자화 적용 - 불필요한 라이브러리 제거 2. **Stats 시스템 개선** - 파일 기반에서 DB 기반으로 전환 - 초기화 문제 해결 3. **ChromaDB 업그레이드** - 1.0 버전으로 마이그레이션 - 성능 향상 및 버그 수정 ### rb10508_micro 개선 방안 1. **프로세스 수 최적화** - 불필요한 워커 프로세스 정리 - 리소스 풀링 적용 2. **게임화 요소 추가** - Stats 시스템 구현 - 레벨링 및 스킬 시스템 3. **캐싱 전략 강화** - 임베딩 결과 캐싱 - LLM 응답 캐싱 ## 7. 결론 및 권장사항 ### 종합 평가 **rb10508_micro를 주력 서비스로 권장**하는 이유: 1. 55% 낮은 메모리 사용량으로 효율적 2. 최신 기술 스택 (ChromaDB 1.0, Langchain) 3. 확장 가능한 아키텍처 4. 베이지안 메모리 선택 등 고급 기능 ### 마이그레이션 전략 1. **단계적 전환** - rb10508_micro를 메인으로 운영 - rb10408_test는 백업/테스트용으로 유지 - 게임화 요소를 rb10508_micro에 점진적 이식 2. **하이브리드 운영** - 독립성이 필요한 환경: rb10408_test - 일반 서비스: rb10508_micro - 로드 밸런싱으로 부하 분산 3. **통합 계획** - 두 서비스의 장점을 결합한 새 버전 개발 - rb10508_micro 기반으로 게임화 요소 추가 - 선택적 로컬 임베딩 지원 ## 8. 스킬 서비스 활용 전략 ### 현재 운영 중인 스킬 서비스 | 서비스명 | 포트 | 상태 | 주요 기능 | 연동 서비스 | |----------|------|------|-----------|-------------| | **skill_email** | 8501 | 운영 중 (6일) | 이메일 조회/발송 | rb10408, rb10508 | | **skill-news** | 8505 | 정상 (2시간) | 뉴스 검색/요약 | rb10408, rb10508 | | **skill-slack** | 8503 | 정상 (2시간) | Slack 메시지 처리 | rb10408만 | | **skill-embedding** | 8015 | 정상 (6일) | 텍스트 임베딩 생성 | rb10508만 | ### 스킬 통합 개선 방안 #### rb10408_test 개선점 1. **임베딩 서비스 활용** - 자체 sentence-transformers 대신 skill-embedding 사용 - 메모리 200MB 절약 가능 - 중앙화된 임베딩 관리 2. **스킬 메타데이터 강화** ```python skill_registry = { "email": { "url": "http://localhost:8501", "timeout": 30, "retry": 3, "cache_ttl": 300 } } ``` #### rb10508_micro 개선점 1. **Decision Engine 구현** - rb10408의 스킬 라우팅 로직 이식 - 의도 파악 → 스킬 선택 → 실행 계획 수립 2. **스킬 체이닝 지원** - 복수 스킬 연속 실행 - 스킬 간 데이터 전달 - 병렬 실행 지원 3. **Slack 스킬 연동** - 현재 미연동 상태 - 포트 8503 연결 추가 ### 스킬 서비스 최적화 로드맵 | 단계 | 기간 | rb10408_test | rb10508_micro | |------|------|--------------|---------------| | **Phase 1** | 1주 | 임베딩 서비스 전환 | Slack 스킬 연동 | | **Phase 2** | 2주 | 스킬 캐싱 구현 | Decision Engine 추가 | | **Phase 3** | 3주 | 메트릭 수집 | 스킬 체이닝 구현 | | **Phase 4** | 4주 | 통합 테스트 | 성능 최적화 | ## 9. ChromaDB 데이터 영속성 문제 ### 저장 상태 비교 (2025-08-11 측정) | 항목 | rb10408_test | rb10508_micro | |------|--------------|---------------| | **컬렉션 수** | 4개 (SQLite) / 0개 (API) | 4개 | | **총 문서 수** | 3개 | 1개 | | **마지막 저장** | 2025-08-09 (2일 전) | 2025-08-11 (당일) | | **볼륨 마운트** | 정상 | 정상 | | **실제 저장** | ❌ 실패 | ✅ 성공 | ### rb10408_test ChromaDB 문제점 **증상**: - SQLite에는 4개 컬렉션 존재 (conversations, documents, insights, memories) - ChromaDB API로는 0개 컬렉션 반환 - 2일간 새로운 데이터 저장 없음 - 총 3개 문서만 존재 (초기 데이터) **원인 분석**: 1. **ChromaDB 버전 불일치** - v0.5.20 사용 (구버전) - SQLite와 API 간 동기화 문제 2. **초기화 실패** - 컨테이너 재시작 시 ChromaDB 클라이언트 초기화 오류 - Telemetry 에러: `capture() takes 1 positional argument` 3. **볼륨 권한 문제** - 디렉토리 권한은 999:docker로 정상 - 하지만 실제 쓰기 작업 실패 ### rb10508_micro ChromaDB 상태 **정상 작동**: - ChromaDB v1.0.16 (최신) - 정상적인 저장/조회 - Gitea Actions 경로 수정 후 안정화 - 베이지안 메모리 선택 정상 작동 ### 해결 방안 | 우선순위 | 작업 | 예상 효과 | |---------|------|-----------| | **긴급** | rb10408 ChromaDB 1.0 업그레이드 | 저장 기능 복구 | | **높음** | 초기화 코드 수정 | API 정상화 | | **중간** | 데이터 마이그레이션 | 기존 데이터 복구 | | **낮음** | 모니터링 추가 | 문제 조기 발견 | ## 10. 모니터링 지표 ### 추적 필요 항목 | 지표 | 임계값 | 대응 방안 | |------|--------|-----------| | 메모리 사용량 | > 500MB | 컨테이너 재시작 | | CPU 사용률 | > 50% | 스케일 아웃 고려 | | 응답 시간 | > 3초 | 캐싱 전략 검토 | | 에러율 | > 1% | 로그 분석 및 수정 | | **스킬 응답 시간** | > 5초 | 타임아웃 조정 | | **스킬 실패율** | > 5% | 서킷 브레이커 활성화 | ### 정기 점검 사항 - 주간: 리소스 사용 트렌드 분석 - 월간: 성능 벤치마크 실행 - 분기: 아키텍처 리뷰 및 최적화 --- *이 문서는 2025년 8월 11일 51124 서버에서 실측한 데이터를 기반으로 작성되었습니다.*