지금까지의 안내서는 "외부 LLM에 넣기 전에 비식별하라"를 전제했습니다. 하지만 어떤 데이터는 비식별을 해도 밖으로 내보내면 안 되고, 어떤 조직은 애초에 내부망이 인터넷과 분리돼 있어 클라우드 API를 부를 수조차 없습니다. 이럴 때 답은 데이터를 가공해 내보내는 게 아니라, 모델을 데이터가 있는 곳으로 가져오는 것입니다 — 온프레미스 LLM입니다.
온프레미스가 맞는가 — 먼저 판단
온프레미스는 공짜가 아닙니다. 하드웨어·운영 부담을 지는 대신 데이터 통제를 얻는 거래입니다.
| 상황 | 권장 | 이유 |
|---|---|---|
| 인터넷 분리 내부망 | 온프레미스만 가능 | 클라우드 호출 자체가 불가 |
| 비식별해도 못 내보내는 데이터 | 온프레미스 | 데이터가 조직 밖으로 안 나감 |
| 공개 자료·비민감 업무 | 클라우드 | 더 강한 모델을 손쉽게 |
| 대량·고난도 추론 필요 | 클라우드 또는 하이브리드 | 로컬 모델은 최상위 성능에 못 미침 |
1. 모델 선택 — 크기·양자화·한국어
로컬 모델은 세 축으로 고릅니다.
- 크기(파라미터): 클수록 똑똑하지만 무겁습니다. 7~8B는 일반 사무용 GPU/고사양 CPU에서 돌고, 14~32B는 전용 GPU가 필요합니다. 분류·요약 같은 정형 작업엔 중소형이면 충분합니다.
- 양자화: 가중치 정밀도를 낮춰 메모리를 줄입니다(예: Q4_K_M). 4비트 양자화면 8B 모델이 6GB 안팎에 들어갑니다 — 신고 전사의 INT8 양자화와 같은 발상입니다.
- 한국어: 한국어 성능은 크기와 별개입니다. 한국어를 잘하는지, 라이선스가 업무 사용을 허용하는지 반드시 확인합니다.
레포 레이더의 로컬 LLM 도구(Ollama·llama.cpp·vLLM)로 모델을 받아 띄웁니다.
# Ollama — 가장 단순한 로컬 실행. 모델을 받아 OpenAI 호환 서버로 띄운다 ollama pull qwen2.5:7b # 한국어 지원·경량 모델 예시(용도에 맞게 선택) ollama run qwen2.5:7b # 대화형 확인 # 서버는 http://localhost:11434 에서 OpenAI 호환 /v1 엔드포인트를 연다
2. OpenAI 호환 API — 코드는 거의 그대로
온프레미스로 옮길 때 가장 큰 걱정이 "코드를 다 다시 짜야 하나"인데, 그렇지 않습니다. 로컬 서버 대부분이 OpenAI 호환 API를 제공하므로, 기존 코드에서 base_url만 로컬로 바꾸면 됩니다.
from openai import OpenAI # 클라우드였다면: OpenAI() — 여기선 base_url만 로컬로. 데이터가 밖으로 안 나간다 client = OpenAI(base_url="http://localhost:11434/v1", api_key="ollama") # 키는 형식상 resp = client.chat.completions.create( model="qwen2.5:7b", messages=[ {"role": "system", "content": "너는 소방 민원 분류 보조다. 주어진 유형에서만 고른다."}, {"role": "user", "content": "화재 관련 민원인가요? ..."}, ], temperature=0.1, # 분류·검산 작업은 낮게 — 재현성 확보 ) print(resp.choices[0].message.content)
RAG·분류 파이프라인의 LLM 호출부를 이 한 줄로 바꾸면 온프레미스로 이전됩니다. 평가 도구도 마찬가지입니다 — RAG 평가의 promptfoo는 ollama:chat:모델명 또는 apiBaseUrl로 로컬 모델을 그대로 평가합니다.
3. 검증 — 로컬 모델은 클라우드보다 약하다
온프레미스의 대가는 성능입니다. 중소형 로컬 모델은 최상위 클라우드 모델보다 약하고, 특히 환각·지시 이탈·한국어 미묘함에서 차이가 납니다. 그래서 "돌아간다"와 "믿고 쓸 만하다"는 다릅니다 — 반드시 검증합니다.
앞서 만든 골든셋과 회귀 평가를 그대로 씁니다. 클라우드 모델에서 재던 같은 골든셋을 로컬 모델로 돌려 점수 차이를 정량화합니다.
# promptfooconfig.yaml — 같은 골든셋으로 클라우드 vs 로컬 나란히 비교 providers: - id: openai:chat:qwen2.5:7b # 로컬(Ollama) config: { apiBaseUrl: http://localhost:11434/v1, apiKey: ollama } - openai:gpt-4o-mini # 클라우드 기준선(연결 가능할 때만) defaultTest: assert: - type: llm-rubric value: 처분·과태료를 단정하지 않고 근거를 제시한다 # tests: 22편에서 만든 골든셋 그대로
점수 차가 업무 허용 범위 안이면 온프레미스로 갑니다. 범위를 벗어나면 더 큰 모델, 프롬프트 개선, 또는 하이브리드를 검토합니다 — "로컬이니까 이 정도는 감수"는 안 됩니다. 소방 업무의 품질 기준은 인프라가 아니라 현장이 정합니다.
4. 폐쇄망 반입 — 공급망도 점검한다
인터넷 분리망은 모델·라이브러리를 온라인으로 받을 수 없어, 외부에서 받아 반입합니다. 이 경로 자체가 보안 지점입니다.
- [ ] 모델 가중치·라이브러리를 공식 출처에서만 받았습니다(체크섬 확인). - [ ] 반입 파일을 검역망에서 악성코드 검사 후 내부망에 들였습니다. - [ ] 모델 라이선스가 공공·업무 사용을 허용하는지 확인했습니다. - [ ] 오프라인 설치가 되도록 의존성을 함께 반입했습니다(온라인 설치 시도 차단). - [ ] 반입 버전·출처·체크섬을 기록으로 남겼습니다.
운영 루틴 한 장
| 언제 | 무엇을 | 통과 기준 |
|---|---|---|
| 도입 검토 시 | 온프레미스 vs 클라우드 판단 | "데이터가 밖으로 나가도 되는가" 기준 |
| 모델 선정 시 | 골든셋으로 클라우드 대비 품질 측정 | 업무 허용 범위 안 |
| 모델·버전 교체 시 | 골든셋 회귀 | 이전 대비 하락 없음 |
| 반입 시 | 공급망 체크리스트 | 출처·체크섬·검역 전부 통과 |
사람 검토 체크리스트
- [ ] "이 데이터가 조직 밖으로 나가도 되는가"로 온프레미스 여부를 판단했습니다. - [ ] 용도·한국어·라이선스·하드웨어를 함께 보고 모델을 골랐습니다. - [ ] 로컬 모델 품질을 클라우드 기준선과 같은 골든셋으로 비교했습니다. - [ ] 품질이 업무 기준에 못 미치면 "로컬이니까"로 타협하지 않았습니다. - [ ] 폐쇄망 반입 시 출처·체크섬·검역·라이선스를 점검했습니다.