개인정보 안 나가는 BGE-M3 다국어 검색 5분 퀵스타트
요약: BGE-M3란 100여 개 언어를 하나의 모델로 임베딩해 한국어를 포함한 다국어 문서를 외부로 한 글자도 보내지 않고 내 컴퓨터 안에서만 검색·색인할 수 있게 해 주는 오픈 임베딩 모델이다. 클라우드 임베딩 API와 달리 질의·문서 본문이 제공자 서버로 전송되지 않으므로, 개인정보·사내문서·계약서 같은 민감 텍스트의 데이터 잔류(어디에 남는가)와 로그 노출(누가 보는가)을 사용자가 직접 통제할 수 있다.
BGE-M3란 100여 개 언어를 하나의 모델로 임베딩해 한국어를 포함한 다국어 문서를 외부로 한 글자도 보내지 않고 내 컴퓨터 안에서만 검색·색인할 수 있게 해 주는 오픈 임베딩 모델이다. 클라우드 임베딩 API와 달리 질의·문서 본문이 제공자 서버로 전송되지 않으므로, 개인정보·사내문서·계약서 같은 민감 텍스트의 데이터 잔류(어디에 남는가)와 로그 노출(누가 보는가)을 사용자가 직접 통제할 수 있다. 즉 '검색 품질'이 아니라 '데이터가 어디에 남고 로그로 찍히는가'로 로컬을 판단하는 접근이다.
first_response_latency_ms 120.8 ms
Hax가 자체 인프라에서 직접 측정한 실측값은?#
아래는 Hax가 자체 인프라에서 직접 계측·공개한 참고 수치입니다(측정값, 출처 표기).
| 데이터 항목 | 실측값 | 날짜 | 출처 |
|---|---|---|---|
| first_response_latency_ms | 120.8 ms | 2026-07-04 | bench_harness.probe_unified_latency |
| 저장된 메모리 수 | 10929 개 | 2026-07-24 | bench_harness.probe_curator (curator stats 실측) |
| 활성 메모리 수 | 10585 개 | 2026-07-24 | bench_harness.probe_curator (curator stats 실측) |
- 표본
- 실측 지표 3개 (Hax /data 큐레이션)
- 수집일
- 2026-07-04 ~ 2026-07-24
- 방법
- bench_harness.probe_unified_latency; bench_harness.probe_curator (curator stats 실측)
이 수치는 어떻게 재현하나?#
측정 방법은 표의 출처와 우리 공개 데이터셋(/data)에서 확인할 수 있습니다.
| 항목 | 로컬 BGE-M3(내 서버) | 클라우드 임베딩 API |
|---|---|---|
| 데이터 잔류 | 내 디스크에만, 외부 전송 없음 | 제공자 서버로 전송·저장 가능(정책 의존) |
| 로그 정책 | 내가 설정, 요청 본문 비저장 가능 | 제공자 로그·리텐션 정책을 따름 |
| 다국어·한국어 | 100+ 언어 단일 모델(추정 스펙) | 엔드포인트마다 상이 |
| Hax 로컬 잔류 실측 | 활성 메모리 10585개 유지(측정 2026-07-24) | 해당 없음 |
| BGE-M3 검색지연 | 측정대기 / not measured | 측정대기 / not measured |
로컬 잔류 저장소 활성 메모리 10585개 유지
참고: 위 표의 활성 메모리 수는 2026-07-24 실측이며, BGE-M3 자체의 검색지연은 아직 측정 전(측정대기)이라 추후 갱신한다. 나머지 비교 셀은 공개 스펙과 정책 성격에 근거한 정성 비교다.
왜 '데이터 잔류·로그 정책'으로 판단하나#
로컬 임베딩의 핵심 이점은 정확도 몇 퍼센트가 아니라, 텍스트가 내 장치 밖으로 나가지 않는다는 점이다. Hax는 같은 원칙으로 자체 로컬 메모리 저장소를 운영하며, 2026-07-24 실측 기준 활성 메모리 10585개(측정)를 외부 API 없이 로컬에 유지하고 있다. 이 숫자 자체가 BGE-M3 성능은 아니지만, '민감 데이터를 로컬에 두고 운영하는 것이 실제로 가능하다'는 잔류 통제의 증거다.
5분 퀵스타트 (초보자 step-by-step)#
- 격리 환경을 만든다. 파이썬 가상환경(venv)을 하나 파서 다른 프로젝트와 섞이지 않게 한다.
- 설치한다.
pip install -U sentence-transformers한 줄이면 BGE-M3를 불러올 준비가 끝난다. - 오프라인을 강제한다. 최초 1회만 모델을 내려받고, 그 뒤로는 환경변수
HF_HUB_OFFLINE=1을 켜 추론 중 어떤 네트워크 호출도 나가지 않게 한다. 이것이 데이터 잔류 통제의 핵심 스위치다. - 색인한다. 아래처럼 문서를 임베딩해 벡터로 바꾼다.
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('BAAI/bge-m3')
docs = ['환불 정책은 7일 이내입니다', 'The refund window is 7 days']
emb = model.encode(docs, normalize_embeddings=True)
q = model.encode(['환불 며칠까지 되나요'], normalize_embeddings=True)
scores = (q @ emb.T)[0] # 코사인 유사도
print(scores.argsort()[::-1])- 검증한다. 실행 중 방화벽/네트워크 로그에 아웃바운드 요청이 없는지, 그리고 애플리케이션 로그에 질의 원문이 평문으로 찍히지 않는지 확인한다. 이 두 가지가 통과하면 '로컬'이라 부를 자격이 생긴다.
한국어 리콜 품질 팁: BGE-M3는 다국어 단일 모델이라 한국어 질의로 영어 문서까지 함께 잡아낸다. 임베딩은 반드시 정규화(normalize)하고, 문서는 문단 단위로 잘라 넣어야 짧은 질의의 리콜이 안정적이다. 재현율이 중요하면 밀집(dense) 점수에 더해 BGE-M3가 제공하는 희소(sparse) 매칭을 함께 쓰는 하이브리드가 유리하다.
데이터 잔류·로그 정책 체크리스트#
- 가중치 위치: 모델 파일이 내 디스크에 있고, 추론이 그 파일만 쓰는가.
- 아웃바운드 0: 오프라인 모드에서 임베딩이 정상 동작하는가(네트워크 끊고 테스트).
- 본문 로그: 프레임워크·프록시가 질의/문서 원문을 로그로 남기지 않게 껐는가.
- 벡터 저장 위치: FAISS·Chroma 같은 로컬 저장소를 쓰고, 그 파일이 백업·공유 경로로 새지 않는가.
- 삭제 경로: 특정 문서를 지우면 벡터·캐시에서도 함께 제거되는가.
이 다섯 항목이 모두 '예'라면, 클라우드 API의 리텐션 정책을 신뢰할 필요 없이 데이터 통제권이 내 손에 남는다. 성능 비교는 각자 환경에서 측정해 보되, 판단의 1순위 축은 언제나 '이 텍스트가 어디에 남는가'여야 한다.
참고: 본 글의 코드·환경변수 사용법은 2026-07-25 기준이며, 라이브러리 버전에 따라 API가 바뀔 수 있으니 실행 전 각 패키지의 최신 문서를 확인하라. 관련 내부 근거는 Hax data 참조.
함께 읽기: BGE-M3 다국어 검색 초보 5분 설치 퀵스타트와 실패 지점, 개인정보 안 보내는 Nomic Embed 로컬 RAG, 무엇으로 판단하나
종합 가이드: 노트북에서 돌리는 AI 모델, 흔한 함정과 해결법
Responses
No responses yet. Be the first to respond.