- Embedding architecture comparison (local vs HTTP vs centralized) - Memory usage: rb10408 (500MB) vs rb10508 (0MB) vs skill-embedding (928MB) - Performance metrics: processing speed, caching, scalability - PyTorch dependency analysis (338MB overhead) - Optimization recommendations for both services - Model specifications (multilingual-MiniLM-L12-v2, 384 dims)
15 KiB
15 KiB
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 스킬 실행 구조
# 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 스킬 실행 구조
# 직접적인 스킬 호출 (구조화되지 않음)
# 주로 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 - 모놀리식 임베딩
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 임베딩 클라이언트
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 - 중앙화된 임베딩 서비스
# 독립 실행 서비스 (포트 8015)
# 모든 서비스가 공유
# 928MB 메모리 상시 사용
# 6일간 안정적 운영 중
임베딩 성능 분석
| 시나리오 | rb10408_test | rb10508_micro + skill-embedding |
|---|---|---|
| 첫 요청 | 모델 로드 (3-5초) | 즉시 응답 (서비스 상시 대기) |
| 대량 처리 | 빠름 (로컬) | 네트워크 오버헤드 |
| 메모리 효율 | 낮음 (중복 로드) | 높음 (공유 서비스) |
| 확장성 | 제한적 | 수평 확장 가능 |
| 장애 격리 | 전체 영향 | 임베딩만 영향 |
임베딩 최적화 권장사항
rb10408_test 개선안:
- skill-embedding 서비스 활용으로 전환
- 메모리 300MB+ 절약 가능
- PyTorch 제거로 컨테이너 크기 감소
- 모델 다운로드 시간 제거
rb10508_micro 개선안:
- 임베딩 결과 캐싱 강화
- 배치 처리 구현
- 연결 풀링 최적화
- 재시도 로직 추가
4. 장단점 분석
rb10408_test
장점:
- ✅ 완전한 독립성 (외부 서비스 불필요)
- ✅ 빠른 임베딩 생성 (로컬 처리)
- ✅ 최신 Python 3.13 사용
- ✅ 게임화 요소 포함
- ✅ 단순한 배포 (단일 컨테이너)
단점:
- ❌ 높은 메모리 사용량 (304MB)
- ❌ 대용량 ML 라이브러리 필요
- ❌ Stats 파일 초기화 문제
- ❌ 구버전 ChromaDB
- ❌ 확장성 제한
rb10508_micro
장점:
- ✅ 낮은 메모리 사용량 (136MB, 55% 절약)
- ✅ 최신 ChromaDB 1.0
- ✅ 베이지안 메모리 선택 (고급 알고리즘)
- ✅ 모듈화된 구조 (유지보수 용이)
- ✅ Langchain 생태계 활용
- ✅ 확장 가능한 아키텍처
단점:
- ❌ 외부 서비스 의존성
- ❌ 네트워크 지연 가능성
- ❌ 복잡한 설정
- ❌ 많은 프로세스 수 (73개)
- ❌ 게임화 요소 미구현
5. 사용 권장 시나리오
rb10408_test 적합한 경우
-
독립적 운영이 필요한 환경
- 인터넷 연결이 불안정한 환경
- 외부 서비스 의존성을 피해야 하는 경우
- 단일 서버 배포
-
게임화 요소가 중요한 경우
- 사용자 참여도 향상이 목표
- Stats 기반 진행도 추적 필요
-
빠른 응답이 중요한 경우
- 로컬 임베딩으로 네트워크 지연 없음
- 실시간 처리가 중요한 서비스
rb10508_micro 적합한 경우
-
리소스 효율성이 중요한 환경
- 메모리 제약이 있는 서버
- 다중 서비스 운영 환경
- 비용 최적화가 필요한 경우
-
확장성이 필요한 경우
- 마이크로서비스 아키텍처 선호
- 점진적 기능 추가 계획
- 외부 서비스 통합 예정
-
고급 AI 기능이 필요한 경우
- 베이지안 메모리 선택
- Langchain 생태계 활용
- 다양한 LLM 모델 전환
6. 최적화 제안
rb10408_test 개선 방안
-
메모리 사용량 감소
- Torch 대신 ONNX Runtime 사용
- 모델 양자화 적용
- 불필요한 라이브러리 제거
-
Stats 시스템 개선
- 파일 기반에서 DB 기반으로 전환
- 초기화 문제 해결
-
ChromaDB 업그레이드
- 1.0 버전으로 마이그레이션
- 성능 향상 및 버그 수정
rb10508_micro 개선 방안
-
프로세스 수 최적화
- 불필요한 워커 프로세스 정리
- 리소스 풀링 적용
-
게임화 요소 추가
- Stats 시스템 구현
- 레벨링 및 스킬 시스템
-
캐싱 전략 강화
- 임베딩 결과 캐싱
- LLM 응답 캐싱
7. 결론 및 권장사항
종합 평가
rb10508_micro를 주력 서비스로 권장하는 이유:
- 55% 낮은 메모리 사용량으로 효율적
- 최신 기술 스택 (ChromaDB 1.0, Langchain)
- 확장 가능한 아키텍처
- 베이지안 메모리 선택 등 고급 기능
마이그레이션 전략
-
단계적 전환
- rb10508_micro를 메인으로 운영
- rb10408_test는 백업/테스트용으로 유지
- 게임화 요소를 rb10508_micro에 점진적 이식
-
하이브리드 운영
- 독립성이 필요한 환경: rb10408_test
- 일반 서비스: rb10508_micro
- 로드 밸런싱으로 부하 분산
-
통합 계획
- 두 서비스의 장점을 결합한 새 버전 개발
- 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 개선점
-
임베딩 서비스 활용
- 자체 sentence-transformers 대신 skill-embedding 사용
- 메모리 200MB 절약 가능
- 중앙화된 임베딩 관리
-
스킬 메타데이터 강화
skill_registry = { "email": { "url": "http://localhost:8501", "timeout": 30, "retry": 3, "cache_ttl": 300 } }
rb10508_micro 개선점
-
Decision Engine 구현
- rb10408의 스킬 라우팅 로직 이식
- 의도 파악 → 스킬 선택 → 실행 계획 수립
-
스킬 체이닝 지원
- 복수 스킬 연속 실행
- 스킬 간 데이터 전달
- 병렬 실행 지원
-
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개 문서만 존재 (초기 데이터)
원인 분석:
-
ChromaDB 버전 불일치
- v0.5.20 사용 (구버전)
- SQLite와 API 간 동기화 문제
-
초기화 실패
- 컨테이너 재시작 시 ChromaDB 클라이언트 초기화 오류
- Telemetry 에러:
capture() takes 1 positional argument
-
볼륨 권한 문제
- 디렉토리 권한은 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 서버에서 실측한 데이터를 기반으로 작성되었습니다.