11장. 폐쇄망 문서 파이프라인과 폐쇄형 RAG
모델과 패키지 들여오기
섬에 들어가기 전에는 장을 봐서 배에 싣고, 항구의 검문을 거쳐 내립니다. 폐쇄망에 들여올 패키지와 모델도 인터넷이 되는 PC 에서 미리 받아, 검사하고, 승인된 매체로 옮겨, 안에서 설치합니다.
1번에서 인터넷 PC 로 휠과 모델을 받습니다. 2번에서 백신으로 검사하고 파일마다 해시를 적어 둡니다. 3번에서 회사가 승인한 매체나 망연계 시스템으로 반입을 신청합니다. 4번에서 폐쇄망 안에서 인터넷을 찾지 않게 설치하고, 오프라인으로 돌아가는지 확인합니다. 여기서 장보기가 내려받기, 검문이 검사와 승인입니다.
무엇을 들여오나
| 들여올 것 | 받는 곳(인터넷 PC) | 폐쇄망에서 두는 곳 |
|---|---|---|
| 파이썬 패키지 | pip download 로 휠 폴더에 | 휠 폴더. --no-index --find-links 로 설치 |
| 임베딩·LLM 모델(Hugging Face) | 허브에서 내려받은 모델 폴더 | 같은 이름의 캐시 폴더 또는 지정한 폴더 |
| Ollama 모델 | ollama pull 뒤의 모델 폴더(.ollama\models) | 같은 폴더에 복사 |
| 설치 프로그램 | Python, Ollama, VS Code 설치 파일 | 설치 파일 보관 폴더 |
| 설명서 | 쓰는 판의 공식 문서 | 사내 위키나 파일 서버 |
휠로 설치하기
아래 명령은 이 장의 실습에 쓰는 qdrant-client 를 예로 듭니다. 교안을 만든 PC 에서 휠 폴더로 내려받은 뒤, 새 가상 환경에 --no-index 로 설치해 보았습니다. 실제 폐쇄망으로 옮기는 일은 하지 않았습니다.
# 1) 인터넷 PC: 패키지와 의존 패키지를 휠 폴더로 내려받는다(폐쇄망 PC 와 같은 파이썬 판에서)
python -m pip download qdrant-client -d wheelhouse
# 2) 폐쇄망 PC: 인터넷 저장소를 찾지 말고(--no-index) 휠 폴더에서만 설치한다
python -m pip install --no-index --find-links wheelhouse qdrant-client교안을 만든 PC 에서는 qdrant-client 하나를 받는데 의존 패키지까지 휠 20개(약 23MB)가 내려받아졌고, 새 가상 환경에 --no-index 로 설치까지 끝났습니다. 받은 휠 가운데 numpy-2.5.4-cp314-cp314-win_amd64.whl 처럼 이름에 cp314, win_amd64 가 붙은 것은 "파이썬 3.14, 64비트 윈도 전용"입니다. py3-none-any 가 붙은 휠은 판과 운영체제를 가리지 않습니다.
반입 기록 남기기
들여온 파일이 중간에 바뀌지 않았는지는 해시로 확인합니다. 바깥에서 잰 해시와 안에서 잰 해시가 같으면 같은 파일입니다.
import hashlib
from pathlib import Path
def sha256(path):
"""파일 내용의 SHA-256 해시(지문)를 16진수 글자로 돌려준다"""
return hashlib.sha256(Path(path).read_bytes()).hexdigest()
# 결과: 64글자의 지문. 앞 16글자만 보인다
print(sha256("intranet/_문서목록.csv")[:16])코드에 나오는 함수
| 코드 | 쉬운 뜻 |
|---|---|
pip download 이름 -d wheelhouse | 설치하지 않고 패키지 파일만 내려받는다. -d 는 directory(폴더)로, 받아 둘 폴더를 정한다 |
--no-index | 인터넷의 패키지 목록(index)을 찾지 않는다 |
--find-links wheelhouse | 패키지를 찾을 곳으로 이 폴더를 알려 준다 |
hashlib | 해시(hash)를 재는 표준 라이브러리다 |
hashlib.sha256(…) | SHA(Secure Hash Algorithm, 안전한 해시 알고리즘)의 256비트 판으로 지문을 잰다 |
Path(path).read_bytes() | 파일을 글이 아니라 바이트(bytes, 날것의 숫자 덩어리) 그대로 읽는다 |
.hexdigest() | hexadecimal(16진수) digest(요약)의 줄임이다. 지문을 0~9, a~f 의 64글자로 적는다 |
[:16] | 64글자 가운데 앞 16글자만 잘라 보인다 |
이 코드가 뜻하는 것
택배로 귀한 물건을 보낼 때를 떠올려 봅니다. 보내는 쪽은 물건의 사진과 특징을 적은 쪽지를 따로 보내고, 받는 쪽은 상자를 연 뒤 쪽지와 견줘 바뀐 데가 없는지 봅니다. 여기서 물건이 휠과 모델 파일, 쪽지에 적은 특징이 해시, 받은 뒤 견주는 일이 폐쇄망 안에서 다시 잰 해시와 견주기입니다.
| 줄 | 하는 일 | 쉽게 말하면 |
|---|---|---|
python -m pip download ... -d wheelhouse | 패키지와 의존 패키지를 폴더에 받는다 | 보낼 물건을 상자에 담는다 |
python -m pip install --no-index --find-links wheelhouse ... | 그 폴더에서만 설치한다 | 받은 상자에서만 꺼내 쓴다 |
def sha256(path) | 파일을 바이트로 읽어 지문을 돌려준다 | 물건의 특징을 쪽지에 적는다 |
print(sha256(...)[:16]) | 문서 목록 파일의 지문 앞 16글자를 찍는다 | 쪽지의 첫 줄만 보인다 |
교안을 만든 PC 에서 이 블록을 돌리면 a50c142bf248d54c 가 나왔습니다. 같은 make_data.py 로 만든 파일이면 어느 PC 에서 재도 같은 지문이 나옵니다. 지문이 한 글자라도 다르면 파일이 중간에 바뀐 것이니 반입하지 않습니다.
주의할 점
- 휠은 파이썬 판과 운영체제마다 다릅니다. 인터넷 PC 와 폐쇄망 PC 의 파이썬 판(3.12, 3.14 등)과 운영체제를 맞춰서 받습니다.
torch처럼 큰 패키지는 GPU 판과 CPU 판이 따로 있고 크기가 수 GB 입니다. 폐쇄망의 GPU 와 맞는 판을 고릅니다.- 모델의 라이선스도 함께 들여옵니다. 이 과정에서 쓰는 모델의 라이선스는 7장과
setup.md에 적었습니다.