작성일: 2026-07-15 상태: 계획 단계 (개발 미착수) — 이 글은 구축 계획이며, 코드/스캐폴딩은 포함하지 않음. 대상 시스템: hermes-agents (Mattermost 채널별 다중 프로필 봇 위에 문서 RAG 계층 추가)
1. 목표
Mattermost 채널별 전담 봇(sales / finance / dev / qna)이 사내 지식과 실시간 데이터를 근거로 답변하도록, Hermes 위에 문서 RAG(검색 증강) 계층과 ERP 실시간 도구를 추가한다.
- 지식 소스: 구글드라이브 문서 + Mattermost 업로드 파일 (색인) / ERP·외부시스템 (실시간 호출)
- 질의 채널: Mattermost 로 통일 (부서별 봇)
- 격리 원칙: 부서(dept) 수준. 각 봇은 자기 부서 지식만 검색.
2. 확정된 결정사항 (Locked)
| # | 축 | 결정 | 근거 |
|---|---|---|---|
| D1 | ERP/외부시스템 | 실시간 도구호출 (색인 안 함) | 재고·잔액 등 '현재 값'이 중요 → 색인은 낡음 |
| D2 | 지식 격리 | 부서(dept) 수준 | 구현 단순, 대부분 사내봇이 이 수준. 부서 내 민감파일은 색인 제외로 처리 |
| D3 | 벡터 저장소 | C안 = 임베디드 벡터스토어 | 별도 서버 컨테이너 없이 단일 파일, 메모리 부담 최소 |
| D4 | 임베딩 | API 임베딩 | 메모리 0, 대형 로컬모델 불필요 (Docker VM 여유 부족) |
| D5 | 질의 통로 | Mattermost 통일 (부서봇) | 기존 5개 프로필 봇 재사용 |
2.1 부서 내 민감파일 처리 (D2 파생)
부서 수준 격리를 택했으므로, 같은 부서라도 일부만 봐야 하는 파일(급여·인사 등)은 색인 대상에서 제외한다. 제외 판정 방식은 아래 "확정 필요 O5" 참고.
3. 미확정 결정 & 권장 기본값 (구축 착수 전 확정 필요)
아래는 계획을 구체화하려면 사용자가 확정해야 하는 항목. 각 항목에 권장값을 제시.
| # | 항목 | 권장 기본값 | 대안 | 영향 |
|---|---|---|---|---|
| O1 | 벡터 라이브러리 | sqlite-vec | Chroma(임베디드) | 코드 구조, Hermes SQLite 생태계 정합성 |
| O2 | 임베딩 API 모델 | 다국어 지원 모델(예: text-embedding-3-large / voyage-3 / cohere embed-multilingual) | 3-small(저렴, 다국어 약함) | 한국어 검색 품질 좌우 |
| O3 | 봇 연결 방식 | MCP 서버(도구 2개를 하나로 묶음) | Hermes skill | search_docs·erp_query 노출 방식 |
| O4 | 수집기 실행 위치 | 별도 수집 컨테이너 | hermes 컨테이너 내부 크론 | 관심사 분리, hermes 재시작과 무관 |
| O5 | 부서 매핑 & 민감파일 판정 | 드라이브 폴더 구조 기반(폴더→dept 매핑표, 특정 폴더/라벨=색인제외) | 파일명 규칙, MM 채널→dept | 색인 정확성·보안 |
| O6 | 대상 봇 범위 | sales·finance·dev·qna (default 제외) | 일부만 | 초기 롤아웃 범위 |
| O7 | 드라이브 동기 주기 | 15~30분 증분 | 실시간 webhook | 최신성 vs API 비용 |
| O8 | 예상 문서 규모 | (미확인 — 확정 필요) | — | 저장소/비용 상한 검증 |
4. 목표 아키텍처
[색인 대상 — RAG]
구글드라이브 ─┐ (증분동기, Docs→텍스트, PDF OCR)
MM 업로드파일 ┴─→ 정규화 → 청킹 → [API 임베딩] → [벡터스토어(sqlite-vec)]
│ 메타: {source, dept, sensitivity, url, doc_id, mtime}
[실시간 — 도구호출] │
ERP/외부시스템 ─── (색인 안 함) ─────────────────┐ │
↓ ↓
[질의 — Mattermost 통일] [Hermes 봇 도구 (MCP)]
사용자 → 부서봇 → ① search_docs(query, dept=고정) → 벡터검색+필터 → 근거
→ ② erp_query(...) ─ 실시간 ────→ 최신 데이터
→ LLM 종합 → 답(출처 인용)
핵심: 소스가 몇 개든 정규화→벡터스토어로 합류. 질의는 Mattermost 하나로 수렴. 봇은 "두 손"을 가짐 — 왼손=문서검색(고정 지식), 오른손=ERP호출(실시간 값). LLM이 질문 성격에 따라 선택.
5. 컴포넌트 명세
각 컴포넌트는 하나의 목적 / 명확한 인터페이스 / 독립 테스트 가능하도록 분리.
C1. 벡터 저장소 (Vector Store)
- 목적: 문서 청크 + 임베딩 + 메타데이터 보관 및 유사도 검색.
- 구현: sqlite-vec 기반 단일 DB 파일 (권장 O1).
- 데이터 모델 (chunks 테이블 개념):
컬럼 설명 id청크 고유 ID doc_id원본 문서 ID (upsert/삭제 단위) sourcegdrive/mattermostdeptsales / finance / dev / qna sensitivityinternal(색인) — confidential은 애초 색인 안 함text청크 원문 url출처 링크 (인용용) mtime원본 수정시각 (최신성 판단) embedding벡터 - 인터페이스:
upsert(chunks),delete(doc_id),search(query_vec, dept, k). - 의존: 임베딩 API(질의 벡터화), 수집기(쓰기).
C2. 구글드라이브 수집기 (Drive Connector)
- 목적: 드라이브 문서를 증분으로 가져와 색인.
- 동작: 서비스계정/OAuth → Drive changes API로 변경분만 → Google Docs는 텍스트 export, PDF/이미지는 OCR → 청킹 → 임베딩 →
upsert. 삭제 감지 시delete(doc_id). - 부서 태깅: 폴더→dept 매핑표(O5) 기반. 색인제외 폴더/라벨은 스킵.
- 스케줄: 크론(O7).
- 의존: Drive API, OCR, 임베딩 API, 벡터 저장소.
C3. Mattermost 파일 수집기 (MM File Connector)
- 목적: 채널에 업로드된 파일을 색인.
- 동작: 게이트웨이 파일 업로드 이벤트 감지 → 다운로드 → 추출/OCR → 청킹 → 임베딩 →
upsert. - 부서 태깅: 업로드된 채널 → dept 자동 매핑.
- 의존: Mattermost 이벤트/훅, OCR, 임베딩 API, 벡터 저장소.
C4. 문서검색 도구 (search_docs)
- 목적: 봇이 호출하는 검색 도구. 부서 필터로 관련 청크 반환.
- 인터페이스:
search_docs(query, k)— dept는 봇마다 코드로 고정 바인딩(LLM이 바꿀 수 없음, D2 보안장치). - 동작: query를 동일 임베딩 API로 벡터화 →
search(query_vec, dept, k)→ 청크+출처 반환. - 노출: MCP 서버(O3).
C5. ERP 실시간 도구 (erp_query)
- 목적: 질문 시점에 ERP/외부시스템 API를 호출해 최신 데이터 반환 (색인 아님, D1).
- 인터페이스:
erp_query(...)— 부서별 호출 가능 엔드포인트/자격증명 분리 → 부서 스코프 유지. - 노출: C4와 같은 MCP 서버로 묶음(O3).
- 의존: ERP API (구체 시스템은 O 확정 필요).
C6. 봇 연결/바인딩 (Bot Wiring)
- 목적: 각 프로필 봇에 도구를 연결하고 dept를 고정.
- 동작: sales/finance/dev/qna 각 프로필에 MCP 도구 등록,
search_docs의 dept를 프로필별로 고정, ERP 도구는 해당 부서 자격증명으로. - 원칙: default 프로필은 건드리지 않음(기존 메모리 규칙 준수).
6. 데이터 흐름
색인(쓰기) 경로
- 소스 이벤트/스케줄 → 수집기(C2/C3)가 원본 획득
- 텍스트 추출(+OCR) → 청킹 → 임베딩 API 호출
- 메타데이터(부서·민감도·출처) 부여 → 벡터 저장소 upsert
- 원본 삭제/수정 → doc_id 기준 delete/replace
질의(읽기) 경로
- 사용자가 Mattermost 부서 채널에서 봇에게 질문
- LLM이 도구 선택: 고정지식→
search_docs, 실시간값→erp_query search_docs: 질의 임베딩 → 부서필터 벡터검색 → top-k 청크- LLM이 청크/ERP응답을 근거로 답변 생성 (출처 인용 포함)
7. 엣지케이스 & 처리방안
브레인스토밍에서 도출된 위험 지점. 구현 시 반드시 다룰 것.
| # | 엣지케이스 | 처리방안 |
|---|---|---|
| E1 | 권한 누수 — 부서 밖/민감문서가 답변에 노출 | dept 고정 바인딩(C4) + confidential 문서 색인 제외(D2/O5) |
| E2 | 최신성 — 드라이브 문서 수정·삭제가 색인에 미반영 | changes API 증분동기 + doc_id 기준 삭제 처리(C2) |
| E3 | ERP 값 노후화 | 색인하지 않고 실시간 호출(D1)로 원천 차단 |
| E4 | 검색 결과 없음 | 봇이 "근거 문서 없음"을 명시하고 추측 답변 금지 (환각 방지 프롬프트) |
| E5 | OCR 실패/스캔 품질 | 실패 문서 로깅·스킵, 재시도 큐. 색인 실패가 파이프라인 전체를 막지 않게 |
| E6 | 한국어 검색 품질 | 다국어 임베딩 모델 선택(O2), 청킹 시 문장 경계 보존 |
| E7 | 임베딩 일관성 | 수집·질의에 반드시 동일 모델 사용. 모델 교체 시 전체 재임베딩 필요 명시 |
| E8 | 부서 매핑 모호 — 폴더가 여러 부서 걸침 | 매핑표 명시적 우선순위 규칙, 미매핑 문서는 색인 보류 + 경고 |
| E9 | 대용량/중복 문서 | 청킹 크기·중첩 정책, doc_id 해시로 중복 upsert 방지 |
| E10 | 임베딩 API 비용 폭증 | 변경분만 재임베딩, 최초 대량색인은 배치·상한 설정, 비용 모니터링 |
| E11 | API 레이트리밋/장애 | 지수 백오프 재시도, 실패 청크 재처리 큐 |
| E12 | Docker VM 메모리 부족 | 수집기 별도 컨테이너(O4), VM 최소 4GB(권장 8GB)로 상향 |
| E13 | 민감파일 오분류 | 색인제외는 화이트리스트가 아닌 명시적 규칙 + 기본 보수(불확실하면 제외) |
8. 단계별 실행 로드맵 (개발 착수 시 순서)
⚠️ 본 계획서 승인 및 O1~O8 확정 전에는 착수하지 않음.
Phase 0 — 확정 & 준비
- O1~O8 결정 확정, ERP 시스템/엔드포인트 명세 수집, 폴더→dept 매핑표 작성, Docker VM 메모리 상향.
Phase 1 — 저장소 + 검색도구 (뼈대)
- C1(벡터 저장소) 스키마 구성, C4(search_docs) + MCP 서버 골격, 봇 1개(예: sales)에 dept 고정 바인딩.
- 검증: 수동으로 문서 몇 개 넣고 Mattermost sales 봇이 부서필터로 검색·답변하는 왕복 확인.
Phase 2 — 구글드라이브 수집기
- C2 구현: 증분동기·OCR·청킹·부서태깅·삭제처리·크론.
Phase 3 — Mattermost 파일 수집기
- C3 구현: 업로드 이벤트 훅·추출·채널→dept 매핑.
Phase 4 — ERP 실시간 도구
- C5 구현: ERP API 래핑, 부서별 자격증명 분리, MCP에 통합.
Phase 5 — 마감 & 롤아웃
- 출처 인용 포맷, 환각방지 프롬프트, 권한필터 검증, 나머지 부서봇(finance/dev/qna) 확장, 비용·최신성 모니터링.
9. 테스트 & 검증 전략
- 단위: 각 컴포넌트 인터페이스별 독립 테스트(청킹, 임베딩 호출, 검색 필터, 삭제 반영).
- 격리 검증(보안): finance 문서를 넣고 sales 봇에 질문 → 절대 안 나오는지 확인 (E1 회귀 테스트).
- 최신성 검증: 드라이브 문서 수정/삭제 후 색인 반영 확인 (E2).
- 환각 검증: 근거 없는 질문에 "모름/근거없음" 응답하는지 (E4).
- 한국어 품질: 실제 사내문서로 검색 적합도 스팟체크 (E6).
- E2E: 세 소스(드라이브/MM/ERP) 각각 대표 질문 왕복.
10. 인프라 · 비용 · 리스크 요약
- 인프라: 벡터스토어(파일) + 수집기 컨테이너 + MCP 도구 서버. Docker VM 메모리 최소 4GB, 권장 8GB.
- 비용: API 임베딩 — 대부분 최초 색인 + 변경분에서 발생, 질의당 비용은 미미. 규모(O8) 확정 후 상한 산정.
- 최대 리스크: ① 권한 누수(E1) ② 최신성 미반영(E2) ③ 이 작업은 '설정 튜닝'이 아니라 별도 서비스 개발이라는 규모 인식.
11. 확정 필요 체크리스트 (사용자 액션)
- O1 벡터 라이브러리 (sqlite-vec 권장)
- O2 임베딩 API 모델 (다국어 권장)
- O3 봇 연결 방식 (MCP 권장)
- O4 수집기 실행 위치 (별도 컨테이너 권장)
- O5 폴더→dept 매핑표 & 민감파일 색인제외 규칙
- O6 대상 봇 범위
- O7 드라이브 동기 주기
- O8 예상 문서 규모
- ERP 시스템/엔드포인트/인증 명세
- Docker VM 메모리 상향 승인
부록 A. 관련 글
- 세션 상세 기록(RAG 설계 논의): Hermes RAG 논의 — 옵션 비교와 초기 결정
- 세션 상세 기록(dev holographic provider 도입): Hermes dev 채널 holographic provider 도입
- 기존 멀티에이전트 구성: Hermes × Mattermost — Ubuntu 서버에서 채널별 다중 에이전트 구축