Static Embeddings 04 KO - teamswyg/laya-tools GitHub Wiki

์ •์  ์˜๋ฏธ ์ž„๋ฒ ๋”ฉ 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 ๊ณ„์ •์— ๋ณต์ œํ•˜์ง€ ์•Š์•˜๋‹ค. ์ƒˆ ๋ชจ๋ธ ๊ณต๊ฐœ๋Š” ๊ฒ€์ฆยท์ถœ์ฒ˜ยท๋ผ์ด์„ ์Šค/๋‚ด์šฉ ์ ๊ฒ€์„ ๊ฐ–์ถ˜ ํ›„ ๋ณ„๋„๋กœ ์ง„ํ–‰ํ•œ๋‹ค.