11장. 폐쇄망 문서 파이프라인과 폐쇄형 RAG
폐쇄망이란
섬에 사는 사람은 필요한 것이 생겨도 바로 사러 나갈 수 없습니다. 배가 들어올 때 미리 주문한 것만 받습니다. 대신 섬 밖의 사람이 함부로 들어오지도 못합니다. 은행, 공공기관, 병원, 공장처럼 다루는 정보가 민감한 곳은 업무망을 인터넷과 끊어 둡니다. 이것이 폐쇄망입니다.
왼쪽 인터넷망에서는 pip install, 모델 내려받기, 외부 API 호출이 필요할 때 바로 됩니다. 오른쪽 폐쇄망에서는 바깥과 끊겨 있어 미리 들여온 것만 씁니다. 여기서 섬이 폐쇄망, 배로 실어 온 물건이 반입한 패키지와 모델입니다. 다만 섬과 달리 폐쇄망은 일부러 끊은 것이라, 들여오는 길에도 검사와 승인이 따릅니다.
인터넷망과 무엇이 다른가
| 하던 일 | 인터넷망 | 폐쇄망 |
|---|---|---|
| 패키지 설치 | pip install 이름 | 미리 받아 온 휠 폴더에서 설치 |
| 모델 불러오기 | 처음 부를 때 허브에서 내려받는다 | 들여온 모델 폴더(캐시)에서만 읽는다 |
| LLM 부르기 | 외부 API 도 쓸 수 있다 | 사내 서버의 로컬 모델(Ollama 등)만 |
| 문서 | 웹에서 찾아 붙일 수 있다 | 사내 파일 서버와 게시판의 문서 |
| 고장 났을 때 | 검색해서 바로 고친다 | 오류 문구와 설명서를 미리 챙겨 둔다 |
오프라인 설정 확인하기
라이브러리들이 인터넷을 찾지 않게 하는 설정은 대부분 환경 변수입니다. 지금 켜져 있는지 봅니다.
import os
# 폐쇄망에서 켜 두는 환경 변수들. 없으면 "(없음)" 으로 보인다
for name in ["HF_HUB_OFFLINE", "TRANSFORMERS_OFFLINE", "ANONYMIZED_TELEMETRY", "PIP_NO_INDEX"]:
print(name, "=", os.environ.get(name, "(없음)"))HF_HUB_OFFLINE=1 은 Hugging Face 라이브러리가 허브에 묻지 않고 캐시만 쓰게 합니다. ANONYMIZED_TELEMETRY=False 는 Chroma 가 사용 통계를 보내지 않게 합니다. PIP_NO_INDEX=1 은 pip 가 인터넷의 패키지 저장소를 찾지 않게 합니다.
코드에 나오는 함수
| 코드 | 쉬운 뜻 |
|---|---|
os | operating system(운영체제)의 줄임이다. 운영체제의 기능을 쓰는 표준 라이브러리다 |
os.environ | environment(환경)의 줄임이다. 환경 변수를 사전처럼 담고 있다 |
os.environ.get(name, "(없음)") | 그 이름의 환경 변수 값을 꺼낸다. 없으면 오류 대신 둘째 값 "(없음)" 을 준다 |
HF_HUB_OFFLINE | HF 는 Hugging Face 의 머리글자다. 허브(hub)에 접속하지 말라는 설정이다 |
TRANSFORMERS_OFFLINE | transformers 라이브러리에게 오프라인으로 돌라는 설정이다 |
PIP_NO_INDEX | pip 에게 패키지 목록(index)을 찾지 말라는 설정이다 |
이 코드가 뜻하는 것
냉장고 문에 붙여 둔 가족 메모로 읽어 봅니다. "오늘은 배달 시키지 말 것" 같은 메모가 붙어 있으면, 집에 들어온 사람은 누구나 그 메모를 보고 따릅니다. 메모가 없으면 평소대로 합니다. 여기서 냉장고 문이 운영체제의 환경, 메모가 환경 변수, 집에 들어온 사람이 파이썬 프로그램과 라이브러리입니다.
| 줄 | 하는 일 | 쉽게 말하면 |
|---|---|---|
for name in [...] | 폐쇄망에서 켜 둘 설정 이름 넷을 차례로 본다 | 확인할 메모 네 장 |
os.environ.get(name, "(없음)") | 그 설정의 값을 꺼낸다 | 냉장고 문에 그 메모가 붙어 있나 |
print(name, "=", ...) | 이름과 값을 찍는다 | "배달 금지 메모: 없음" |
교안을 만든 PC 에서 이 블록만 따로 돌리면 넷 모두 (없음) 이었습니다. 아무것도 켜지 않은 보통의 인터넷 PC 라는 뜻입니다. 비유와 다른 점은, 환경 변수는 그 프로그램과 그 프로그램이 띄운 하위 프로그램에만 보인다는 것입니다. 파이썬 안에서 바꾼 값은 다른 창의 프로그램에 전해지지 않습니다.
작게 줄여서 눈으로 보기
파이썬 안에서 환경 변수를 켰다가 지워 봅니다. 이 프로그램 안에서만 바뀌고, 끝나면 사라집니다.
import os
print("켜기 전:", os.environ.get("HF_HUB_OFFLINE", "(없음)"))
os.environ["HF_HUB_OFFLINE"] = "1" # 이 프로그램 안에서만 켠다
print("켠 뒤:", os.environ.get("HF_HUB_OFFLINE", "(없음)"))
del os.environ["HF_HUB_OFFLINE"] # 예시가 끝나면 지운다
print("지운 뒤:", os.environ.get("HF_HUB_OFFLINE", "(없음)"))켜기 전: (없음)
켠 뒤: 1
지운 뒤: (없음)| 결과 | 읽는 법 |
|---|---|
켜기 전: (없음) | 처음에는 설정이 없다 |
켠 뒤: 1 | os.environ[...] = "1" 로 값을 넣었다. 환경 변수의 값은 늘 글자라서 "1" 로 적는다 |
지운 뒤: (없음) | del 로 지우자 다시 없는 상태가 되었다 |
실습 1의 guard() 도 이렇게 파이썬 안에서 설정을 켭니다. 라이브러리가 불러올 때 설정을 읽어 두는 경우가 있으므로, 켜는 줄은 import 보다 앞에 둡니다.
주의할 점
- 폐쇄망은 회사마다 규칙이 다릅니다. 무엇을 어떤 절차로 들여올 수 있는지는 보안 담당 부서의 지침이 먼저입니다. 이 장의 방법은 일반적인 예입니다.
- 이 장의 실습은 인터넷이 되는 PC 에서, 파이썬 안에서 바깥 연결을 막는 방식으로 폐쇄망을 흉내 냅니다. 실제 폐쇄망에서 돌려 본 것이 아닙니다.