01문제
이 고객사는 사내 데이터를 외부 사업자 서버로 전송할 수 없다는 보안 요건을 갖고 있었다. 그 요건 자체는 협상 대상이 아니었다. 그래서 시중의 상용 LLM API를 호출하는 방식은 검토 단계에서 이미 배제된 상태였고, 그 결과 조직은 "AI를 도입하고 싶지만 도입 경로가 없는" 교착에 있었다.
더 정확히 말하면 문제는 모델이 아니라 운영이었다. 노트북에 로컬 모델을 하나 띄워 시연하는 것은 누구나 한다. 그러나 시연은 다음 세 가지를 증명하지 못한다. 여러 사람이 같은 창구로 쓸 수 있는가, 담당자가 자리에 없어도 계속 도는가, 정전이나 재부팅 뒤에 사람이 손대지 않아도 스스로 돌아오는가. 이 세 가지가 안 되면 도입이 아니라 시연으로 끝난다.
따라서 이 과제의 목표는 "로컬 LLM이 된다"가 아니라 사람의 개입 없이 유지되는 사내 서빙 인프라를 남기는 것으로 정의했다.
02제약
- 외부 반출 금지. 추론 요청과 응답이 사내망을 벗어나면 안 된다. 클라우드 GPU 임대, 외부 API 프록시, 외부 벡터 DB 모두 후보에서 제외된다.
- 신규 장비 구매 없음. 이미 보유한 Mac Studio를 그대로 쓴다. 장비 성능이 아니라 배정 설계로 해결해야 한다.
- 전담 운영 인력 없음. 상시로 클러스터를 돌볼 사람이 없다. 사람이 매일 확인해야 유지되는 구조는 실패로 간주한다.
- 사용자가 개발자가 아니다. 터미널이나 API 키를 다루지 않는 구성원이 쓴다. 진입점이 하나여야 하고, 그 하나가 이미 쓰고 있는 도구여야 한다.
- 모델 라이선스. 상용 이용 조건이 불명확한 가중치는 쓰지 않는다. 조건을 확인할 수 있는 계열만 남긴다.
03접근
1) 장비를 성능이 아니라 역할로 배정했다
보유 장비를 동일한 워커로 취급하지 않고, 장비마다 담당 역할을 정한 뒤 그 역할에 맞는 모델을 배정했다. 배정 근거는 감이 아니라 네 가지 정량 값이다. 상용 이용 조건, 장비 실 RAM, 양자화 형식(GGUF/MLX), 그리고 컨텍스트를 길게 쓸 때 필요한 KV cache 헤드룸이다. 헤드룸을 계산에 넣지 않으면 짧은 프롬프트에서는 잘 돌다가 실제 업무 길이에서 죽는다.
2) 장비 시트를 믿지 않고 교차검증했다
배정표를 만들다가 사내에 정리돼 있던 장비 명세와 제조사 공식 전력·사양 자료가 어긋나는 것을 발견했다. 시트 오류 1건을 실측 자료 기준으로 정정한 뒤 배정표를 다시 계산했다. 잘못된 입력으로 만든 설계는 검토를 통과해도 운영에서 깨진다.
3) 망을 열지 않고 묶었다
장비들을 Tailscale 독립망으로 묶어 서로 통신하게 하고, 공개 인터넷에는 어떤 포트도 노출하지 않았다. 포트 포워딩이나 리버스 프록시로 밖에서 접근 가능한 구멍을 만드는 대신, 사내 구성원 단말이 같은 사설망에 들어오는 방향으로 뒤집었다.
4) 진입점을 하나로 줄였다
이미 업무에 쓰던 메신저 봇을 단일 진입점으로 삼았다. 구성원 입장에서는 새 도구를 배우지 않고 평소 채널에 질문을 쓰면 된다. 인프라 쪽에서는 인증·라우팅·로깅을 한 곳에서 처리하게 되므로 강제 지점이 하나로 모인다.
5) 검수를 사람 대신 두 번째 에이전트에 맡겼다
작업을 수행하는 에이전트와 결과를 검수하는 에이전트를 분리해 자동으로 주고받는 2단 핸드오프 파이프라인을 구성했다. 한 모델이 스스로 채점하면 통과율만 올라간다. 역할을 나누면 "수행은 끝났지만 기준을 못 넘겼다"는 상태가 기록으로 남는다.
6) 재기동을 설계에 포함했다
서비스 등록과 부팅 시 자동 기동을 처음부터 넣었다. 데모에서는 사람이 프로세스를 띄우지만, 운영에서는 정전과 업데이트 재부팅이 반드시 온다. 그때 사람이 손대야 하면 그 인프라는 사람의 근무시간만큼만 살아 있다.
04결과
| 항목 | 실측 |
|---|---|
| 사내 서빙에 편성한 장비 | 15대 |
| 공개 인터넷에 노출한 추론 엔드포인트 | 0건 |
| 재부팅 후 복구에 필요한 수동 개입 | 0건 |
| 배정표 교차검증으로 정정한 장비 시트 오류 | 1건 |
| 구성원이 배워야 하는 새 도구 | 0건 (기존 메신저 채널 유지) |
결과적으로 이 스택은 그 뒤에 올라간 전사 메모리 시스템과 에이전트 자동화의 토대가 됐다. 즉 이 인프라는 그 자체가 산출물이면서 동시에 다음 과제의 전제가 됐고, 그 위에서 돌아가는 시스템들이 이 스택의 가동 여부를 매일 검증하고 있다.
05재현 가능한 부분
같은 요건을 가진 조직이라면 다음 산출물은 그대로 이식할 수 있다. 고객사 고유 정보가 들어 있지 않은 부분들이다.
- 장비 배정 산정표. 상용 이용 조건 · 실 RAM · 양자화 형식 · KV cache 헤드룸 4열로 모델을 장비에 배정하는 계산 방식.
- 폐쇄망 구성 절차. 사설 오버레이 네트워크로 장비를 묶고 공개 포트를 0으로 유지하는 구성과 그 검증 항목.
- 부팅 자동 기동·복구 유닛. 재부팅 후 사람 개입 없이 서비스가 돌아오게 만드는 등록 방식과 실패 시 재시도 규칙.
- 2단 에이전트 핸드오프 프로토콜. 수행 에이전트와 검수 에이전트 사이의 상태 전이와 반환 조건 정의.
- 단일 진입점 봇 골격. 이미 쓰는 메신저를 창구로 삼아 인증·라우팅·로깅을 한 지점에 모으는 구성.
반대로 재현되지 않는 것도 분명히 적어 둔다. 고객사의 장비 구성, 조직도, 업무 데이터, 내부 채널 규칙은 이관 대상이 아니다. 같은 결과를 원한다면 요건을 다시 측정해서 배정표를 새로 계산하는 편이 빠르다.
같은 제약을 가진 환경을 검토 중이라면
bk@bkan.dev 문의 폼은 두지 않는다. 메일 한 통이면 된다.