Skip to content

Static Embeddings 04 KO

teamswyg edited this page Sep 30, 2026 · 1 revision

정적 의미 임베딩 04: Go 실행·압축은 검증, 코드 관련성은 부족

English · 고정 계획 · 집계 결과 · 출처·파일 해시

문맥 인코더 없이 작은 단어 벡터 표를 읽는 Go 실행 경로를 구현했다. 원본과 결과가 일치하고 3진 표를 메모리에 압축 상태로 유지한다. 그러나 CoSQA 검증 성능은 어휘 기준선보다 낮아 실사용 승격하지 않는다. reserve1 2,403개/reserve2 2,401개는 이번에도 점수를 내지 않았다.

무엇을 만들었나

MinishLab Model2Vec의 potion-base-2M은 일반 영어용 정적 임베딩이며 모델 카드의 라이선스 표시는 MIT다. 모델 revision 389b9f64be5aa4ae7a6bc6fe95ef20ce485ae5da, 참고 구현 commit 38c7bc9c93808ee15602265ba96a9b8fda58783f를 고정했다. 원래 Laya 인코더를 포팅/교체한 것이 아니라 별도 비교군이다.

Go가 WordPiece/BertNormalizer를 구현하고, 각 토큰의 64차원 벡터를 평균·정규화한다. 자동 CLS/SEP는 넣지 않고 unknown ID는 원본처럼 제외한다. 문자 그대로 입력한 특수 토큰은 별도로 처리한다. 빈 입력 또는 남는 토큰이 없으면 영벡터이며, 이것은 의미 있는 관련성 근거가 아니다. 한 입력4,096바이트 및 올바른 UTF-8을 요구하고 초과 입력을 자르지 않고 거부한다.

기존 Laya는 NFC/ByteLevel/BPE여서 그 토크나이저를 재사용하지 않았다. 모델/토크나이저 해시가 다르면 로드하지 않는다. 실행용 어휘는 정렬 배열, 임베딩은 연속 배열이다. JSON 로드 중 임시 map을 쓰지만 정상 추론에는 map·가변 캐시·lock이 없다. 각 호출이 자신의 결과·임시 메모리를 갖는다.

원본 일치 검증

  • 작성자가 만든 새 공개 시험 문장34개: 악센트, 한글/중국어/일본어, 특수 토큰, 제어문자, 이모지, 빈 입력, 긴 단어 등을 포함한다. 토큰 ID 전부 일치; FP32 벡터 최대 절대 오차 8.94e-8, 허용값 2e-6 이내.
  • 실제 validation607개 질문·코드 총1,214개 텍스트도 원본과 비교: 토큰 전부 일치, 최대 벡터 오차 1.19e-7. 입력 범위 밖54쌍의 텍스트도 이 토크나이저 검증에는 포함했다. 관련성 AUC 평가에는 기존과 동일한553쌍만 사용한다. 이 검증은 reserve를 사용하지 않는다.
  • 원본 비교에만 pinned Model2Vec Python을 사용한다. 사용자 실행·다운로드·CI의 실제 모델 테스트에는 Python/ONNX/Torch가 필요 없다. 공개34문장 reference만 Git에 넣고 CoSQA 원문·벡터 추적은 로컬에만 보관한다.
  • race 검사와 CGO 비활성 실행, INT8/3진 수치 예제, 손상 파일·입력 한도 거부를 확인했다. CI는 실제 고정 모델을 내려받아 원본 reference와 비교하므로 단순 mock 검사가 아니다.

압축과 실제 비용

모드 메모리의 가중치+scale 표 검증 AUC 재측정 단문 encode p95
FP32 7,559,168B 0.5289 5.04µs
INT8, 토큰별 scale 2,007,904B 0.5286 3.75µs
3진, 토큰별 scale 590,560B (576.72KiB) 0.5394 4.83µs
BM25 기준선 별도 0.5378 이번 비교 대상 아님
직전 16계수 matching FP32 별도 0.5729 이번 비교 대상 아님

AUC는 같은553개 범위 안 검증 쌍의 점 추정이며 신뢰구간이나 새 최종 시험 결과가 아니다. 54개 제외를 숨기지 않는다. FP32가 사전 조건 AUC≥0.60 및 BM25보다≥0.03 개선을 충족하지 못했다. 작은 3진 상승으로 승격 후보를 사후 교체하지 않는다. 이 주기에는 과제별 가중치 학습을 하지 않았다.

3진은 행별 평균 절댓값을 scale로 쓰고 그0.7배 이상인 계수의 부호를 남긴다. 계수당2비트에64계수마다4바이트 scale이 추가돼 총2.5bits/계수다. 1.58bit 달성을 주장하지 않는다. RAM에서 바로 비트를 읽지만 누적 연산은 float32이며 GPU·특수 SIMD 커널은 쓰지 않았다. FP32 원본7.56MB를 읽고 시작 시 압축하므로 디스크 파일 자체가590KB인 것도 아니다.

Apple M4 Pro/24GiB/Go1.27.1의 공개 단문2,000회 측정이다. 첫 p95는 FP32/INT8/3진 각각4.21/3.63/4.67µs, 재측정은 위 표와 같다. 모두912B/op·31allocs/op. Go GC 후 생존 heap은 재측정에서 약8.44/3.14/1.80MiB였다. 반면 초기 로딩을 포함한 첫 전체 프로세스 최대RSS는31.73/33.58/32.33MiB로 압축 모드가 더 작지 않았다. 가중치 표·생존 heap·전체 peak RSS를 구분해야 한다. 표에는 어휘·런타임이 빠져 있다. 단문 encode 비용은 p95 전체 검색·64후보 검색·에이전트 실행 비용이 아니다.

사람이거나 에이전트일 때 실행 방법

# 한 번: 고정된 공개 파일만 내려받고 SHA256 검증
go run ./cmd/riido-staticprobe --stage setup
# 이후 오프라인 실행: JSON 한 개 입력 → 벡터·토큰 ID·표 크기 출력
printf '%s\n' '{"text":"parse HTTP response headers"}' | \
  go run ./cmd/riido-staticprobe --mode ternary
# 원천 CoSQA 파일은 앞선 준비 절차로 로컬에 있어야 함
go run ./cmd/riido-staticprobe --stage validation --mode fp32 \
  --out .cache/static-validation-new.json

검증 출력 파일은 새 파일이어야 한다. 이 도구는 실험용 벡터 공급자이며 기존 riido-hints의 기본 모델을 바꾸거나 Codex에 등록하지 않는다. reference 재생성 스크립트는 scripts/training/static_reference.py다. CI와 사용자 실행은 저장된 공개 reference를 사용한다.

다음 단계와 출처 범위

단순 평균 벡터의 cosine만으로는 일반 영어 의미를 코드 관련성으로 옮기지 못했다. 다음에는 기존 어휘 기준선을 유지하면서 코드 식별자 정규화, 질문/코드 표현 간 작은 학습 층, 필요시 과제별 정적 임베딩 튜닝을 비교한다. 메모리를 늘려도 품질이 오르지 않으면 그 경로를 채택하지 않는다. 실행 가능한 Go 압축 경로는 마련됐지만, 실제 후보 검색과 LLM 절감은 미검증이다.

MIT 표시는 작성자 모델 카드의 선언이고 모든 사전학습 데이터 권리나 평가 자료 중복 부재를 증명하지 않는다. CoSQA 코드 MIT/데이터 C-UDA 구분을 유지하며 원문·라벨 행을 재배포하지 않는다. upstream 가중치는 로컬에만 있고 Git이나 우리 HF 계정에 복제하지 않았다. 새 모델 공개는 검증·출처·라이선스/내용 점검을 갖춘 후 별도로 진행한다.

Clone this wiki locally