Rank Reuse 08 KO - teamswyg/laya-tools GitHub Wiki

์ˆœ์œ„ ๋ฐฐ์—ด ์žฌ์‚ฌ์šฉ 08: ๊ฒฐ๊ณผ๋ฅผ ์œ ์ง€ํ•˜๋ฉฐ ๋ˆ„์  ํ• ๋‹น ์•ฝ 97% ๊ฐ์†Œ

English ยท ์ „์ฒด ์ธก์ • ยท ๊ฒ€์ƒ‰ ์ž๋ฃŒ์™€ ํ•œ๊ณ„

๋ฐ˜๋ณต ๊ฒ€์ƒ‰์˜ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์€ ์ค„์—ˆ์ง€๋งŒ, ํฐ ๊ฒ€์ƒ‰ ์†๋„ ๊ฐœ์„ ์ด๋‚˜ ์ƒ์ฃผ ๋ฉ”๋ชจ๋ฆฌ ๊ฐ์†Œ๋Š” ์ž…์ฆํ•˜์ง€ ๋ชปํ–ˆ๋‹ค. ์ด์ „ 2,948๊ฐœ ์งˆ๋ฌธ/3,009๊ฐœ ํ›„๋ณด๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ–ˆ๋‹ค. ์ƒˆ ํ•™์Šต, ํ‰๊ฐ€ ์ž๋ฃŒ ์„ ๋ณ„, ๊ฒ€์ƒ‰ ์ ์ˆ˜ ๋ณ€๊ฒฝ์€ ์—†๋‹ค.

๋ณ€๊ฒฝ๊ณผ ์‚ฌ์šฉ

pkg/hintsearch.Index.RankInto(query, previous)๊ฐ€ ํ˜ธ์ถœ์ž ์†Œ์œ ์˜ ์ˆœ์œ„ยท์ ์ˆ˜ ๋ฐฐ์—ด์„ ์žฌ์‚ฌ์šฉํ•œ๋‹ค. ๊ธฐ์กด Rank๋Š” ๋…๋ฆฝ๋œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ณ„์•ฝ์„ ์œ ์ง€ํ•œ๋‹ค. ์ ์ˆ˜ ๊ณ„์‚ฐ, ๋™์  ์ฒ˜๋ฆฌ, 0์  ํ›„๋ณด์™€ ์ „์ฒด ํ›„๋ณด ๋ณด์กด์€ ๋™์ผํ•˜๋‹ค.

var scratch hintsearch.Ranking
for _, query := range queries {
    var err error
    scratch, err = index.RankInto(query, scratch)
    if err != nil {
        return err
    }
    // Consume scratch.Order and scratch.Scores before the next call.
}

๋‹ค์Œ ํ˜ธ์ถœ์€ ๊ฐ™์€ ๋ฐฐ์—ด์„ ๋ฎ์–ด์“ด๋‹ค. ๊ฒฐ๊ณผ๋ฅผ ์˜ค๋ž˜ ๋ณด๊ด€ํ•˜๋ ค๋ฉด ๋ณต์‚ฌํ•˜๊ฑฐ๋‚˜ ๊ธฐ์กด Rank๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์—ฌ๋Ÿฌ ์ž‘์—…์ž๊ฐ€ ๋™์‹œ์— ๊ฒ€์ƒ‰ํ•˜๋ฉด ์ž‘์—…์ž๋งˆ๋‹ค ๋ณ„๋„์˜ ๋ฐฐ์—ด์„ ๋‘”๋‹ค. ์ƒ‰์ธ์€ ๋ถˆ๋ณ€์ด๋ฉฐ ๊ณต์œ  ํ’€ยท๋งตยท๋ฎคํ…์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์•˜๋‹ค. ์ž˜๋ชป๋œ ์งˆ๋ฌธ์€ ๊ธฐ์กด ๋ฐฐ์—ด์„ ์ˆ˜์ •ํ•˜๊ธฐ ์ „์— ๊ฑฐ๋ถ€ํ•œ๋‹ค. ๋” ํฐ/์ž‘์€ ์ƒ‰์ธ์—์„œ ์žฌ์‚ฌ์šฉํ•ด๋„ ํ•„์š”ํ•œ ๊ธธ์ด๋กœ ์กฐ์ •ํ•˜๊ณ  ๋‚จ์€ ์ ์ˆ˜๋ฅผ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.

ํ•œ ๋ฒˆ๋งŒ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” riido-hints CLI๊ฐ€ ์ด๋ฒˆ ๋ณ€๊ฒฝ์œผ๋กœ ๋ฐ˜๋ณต ๊ฒ€์ƒ‰ ์ˆ˜์ค€์˜ ์ ˆ๊ฐ์„ ์–ป๋Š”๋‹ค๋Š” ์ฃผ์žฅ์€ ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ฃผ๋œ ์‚ฌ์šฉ์ฒ˜๋Š” ๊ฐ™์€ ์ƒ‰์ธ์— ์—ฌ๋Ÿฌ ๋ฒˆ ์งˆ๋ฌธํ•˜๋Š” Go ํ˜ธ์ถœ์ž์™€ ํ–ฅํ›„ daemon์ด๋‹ค. ํ‰๊ฐ€ CLI์—์„œ๋Š” --reuse-rank๋กœ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์‹ค์ œ ์ž๋ฃŒ์˜ ๊ฒฐ๊ณผ ๋ณด์กด๊ณผ ํ• ๋‹น

๊ธฐ์กด ๋ฐฉ์‹ โ†’ ์žฌ์‚ฌ์šฉ โ†’ ์žฌ์‚ฌ์šฉ โ†’ ๊ธฐ์กด ๋ฐฉ์‹ ์ˆœ์„œ๋กœ ๋„ค ๋ฒˆ ์‹คํ–‰ํ–ˆ๋‹ค. ๊ฐ ์‹คํ–‰์—์„œ ๋‘ ๊ฒ€์ƒ‰ ๋ฐฉ์‹(raw/identifiers)์„ ๋ชจ๋‘ ํ‰๊ฐ€ํ–ˆ๋‹ค. ์งˆ๋ฌธ๋ณ„ ๋ชจ๋“  ํ›„๋ณด ์ˆœ์„œ์™€ float64 ์ ์ˆ˜ ๋น„ํŠธ๋ฅผ ํ•ด์‹œํ–ˆ๊ณ  ๋„ค ์‹คํ–‰์—์„œ ์ผ์น˜ํ–ˆ๋‹ค. ๊ธฐ์กด 07์˜ ์ „์ฒดยท์ด๋ฆ„ ์œ ๋ฌดยท์ €์žฅ์†Œ๋ณ„ ํ’ˆ์งˆ ์ง€ํ‘œ๋„ ๋ชจ๋‘ ๊ฐ™์•˜๋‹ค.

์‹คํ–‰ ์งˆ๋ฌธ ์ฒ˜๋ฆฌ ๋ฃจํ”„์˜ ๋ˆ„์  ํ• ๋‹น ํ•ฉ๊ณ„ ์ „์ฒด wall ์ตœ๋Œ€ RSS
๊ธฐ์กด 1 298,879,080 B 1.89์ดˆ 102,465,536 B
์žฌ์‚ฌ์šฉ 1 9,176,888 B 1.50์ดˆ 92,291,072 B
์žฌ์‚ฌ์šฉ 2 9,176,888 B 1.50์ดˆ 93,503,488 B
๊ธฐ์กด 2 298,884,224 B 1.52์ดˆ 91,062,272 B

๋ˆ„์  ํ• ๋‹น์€ ์•ฝ 96.93% ๊ฐ์†Œํ–ˆ๋‹ค. ์ด ํ•ฉ๊ณ„๋Š” ๋‘ ๋ฐฉ์‹์œผ๋กœ ๊ฐ๊ฐ 2,948๋ฒˆ ๊ฒ€์ƒ‰ํ•˜๋Š” ๋ฃจํ”„์˜ Go TotalAlloc ์ฐจ์ด์ด๋ฉฐ ์ „์ฒ˜๋ฆฌยท์ถ”์  ํ•ด์‹œยทํ‰๊ฐ€ ์ง‘๊ณ„๋„ ํฌํ•จํ•œ๋‹ค. ๋™์‹œ์— ์‚ด์•„ ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ๋‚˜ ๋ชจ๋ธ ํฌ๊ธฐ๊ฐ€ ์•„๋‹ˆ๋‹ค. ์›์ฒœ ZIP ๊ฒ€์ฆ๊ณผ ์ƒ‰์ธ ์ค€๋น„๋Š” ๋ฃจํ”„ ํ• ๋‹น์—์„œ ์ œ์™ธํ•˜์ง€๋งŒ ์ „์ฒด wall/RSS์—๋Š” ํฌํ•จํ•œ๋‹ค. ๋‘ ๋ฒˆ์งธ ๊ธฐ์กด ๋ฐฉ์‹์˜ RSS๊ฐ€ ์žฌ์‚ฌ์šฉ๋ณด๋‹ค ๋‚ฎ์•˜์œผ๋ฏ€๋กœ ์ตœ๋Œ€ RSS ๊ฐœ์„ ์„ ํ™•์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ฐœ๋ณ„ ๊ฒ€์ƒ‰ p95๋„ ๊ฑฐ์˜ ๊ฐ™์•˜์œผ๋ฉฐ JSON์— ์›๊ฐ’์„ ๋‚จ๊ฒผ๋‹ค.

์ž‘์€ ๋ฒค์น˜๋งˆํฌ

์›๋ณธ ๊ณต๊ฐœ์šฉ ๊ณ ์ • ๋ฌธ์ž์—ด๋กœ ํ›„๋ณด 64๊ฐœ/3,009๊ฐœ๋ฅผ ๋งŒ๋“ค๊ณ  ๊ฐ™์€ ์งˆ๋ฌธ์„ ๋ฐ˜๋ณตํ–ˆ๋‹ค. ๊ฐ ๊ตฌ์„ฑ 300ms์”ฉ 5ํšŒ ์ธก์ •ํ•œ ์ค‘์•™๊ฐ’์ด๋‹ค. ์ด๊ฒƒ์€ ์‹ค์ œ ์งˆ๋ฌธ 2,948๊ฐœ์˜ ๋‹ค์–‘์„ฑ์„ ๋Œ€์ฒดํ•˜์ง€ ์•Š๋Š”๋‹ค.

ํ›„๋ณด ์ˆ˜ ๋ฐฉ์‹ ํ˜ธ์ถœ๋‹น ์ƒˆ ํ• ๋‹น ํ˜ธ์ถœ๋‹น ํ• ๋‹น ํšŸ์ˆ˜ ์‹œ๊ฐ„ ์ค‘์•™๊ฐ’
64 ๊ธฐ์กด 1,112 B 5 655.3ns
64 ์žฌ์‚ฌ์šฉ 88 B 3 588.9ns
3,009 ๊ธฐ์กด 49,240 B 5 59,595ns
3,009 ์žฌ์‚ฌ์šฉ 88 B 3 59,493ns

3,009๊ฐœ ํ›„๋ณด์˜ ํ˜ธ์ถœ๋‹น ํ• ๋‹น์€ ์•ฝ 99.82% ์ค„์—ˆ์ง€๋งŒ ์†๋„ ์ฐจ์ด๋Š” ๋ฏธ๋ฏธํ–ˆ๋‹ค. ์žฌ์‚ฌ์šฉ ๋ฐฐ์—ด์ด ์—†์–ด์ง€๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ ๋ฐฐ์—ด์€ ์ค€๋น„ ํ›„ ํ˜ธ์ถœ์ž๊ฐ€ ๋ณด์œ ํ•˜๊ณ , 88๋ฐ”์ดํŠธ๋Š” ๊ทธ ์ดํ›„ ๊ฐ ํ˜ธ์ถœ์˜ ์ƒˆ ํ• ๋‹น๋งŒ ์„ผ๋‹ค. ๋‚จ์€ ๋น„์šฉ์€ ์งˆ๋ฌธ ํ† ํฐํ™”์™€ ์ •๋ ฌ ๋“ฑ์— ์žˆ๋‹ค. SIMD ํšจ๊ณผ๋ฅผ ์ธก์ •ํ•œ ์‹คํ—˜์ด ์•„๋‹ˆ๋‹ค.

์žฌํ˜„๊ณผ ๊ฒ€์ฆ

Apple M4 Pro/Go1.27.1 CPU. ์•ž์„  07์˜ ๊ณ ์ • ์›์ฒœ๊ณผ ZIP์„ ์ค€๋น„ํ•˜๊ณ  ์‹คํ–‰ํ•œ๋‹ค.

go test -race ./pkg/hintsearch ./internal/retrievalbench
go test ./pkg/hintsearch -run '^$' -bench BenchmarkRankReuse -benchmem -benchtime=300ms -count=5
go run ./cmd/riido-retrievalbench --stage evaluate
go run ./cmd/riido-retrievalbench --stage evaluate --reuse-rank

ํšŒ๊ท€ ์‹œํ—˜์€ ์„œ๋กœ ๋‹ค๋ฅธ ์งˆ๋ฌธ์œผ๋กœ ๋‚จ์€ ์ ์ˆ˜ ์ง€์šฐ๊ธฐ, ๋ฌด๋งค์นญยท๋™์  ํ›„๋ณด ๋ณด์กด, ์ƒ‰์ธ ํฌ๊ธฐ ๋ณ€๊ฒฝ, ์ž˜๋ชป๋œ ์ž…๋ ฅ์˜ ๋น„์ˆ˜์ •, ์ž‘์—…์ž๋ณ„ ๋ฒ„ํผ๋ฅผ ์‚ฌ์šฉํ•œ ๋™์‹œ ๊ฒ€์ƒ‰์„ ๊ฒ€์‚ฌํ•œ๋‹ค. ๊ธฐ์กด BM25 ๊ณ„์‚ฐ ์ฐธ์กฐ ์‹œํ—˜๊ณผ ํ›„๋ณด ๋ณด์กด ์‹œํ—˜๋„ ์œ ์ง€ํ–ˆ๋‹ค.

์ด ๊ฒฐ๊ณผ๋Š” ๊ฒ€์ƒ‰ ๋Ÿฐํƒ€์ž„์˜ ํ• ๋‹น ๊ฐœ์„ ์ด๋‹ค. ์ƒˆ๋กœ์šด ๋ชจ๋ธ ์„ฑ๋Šฅ์ด๋‚˜ ์‹ค์ œ ์—์ด์ „ํŠธ ์„ฑ๊ณต๋ฅ ยทLLM ์ ˆ๊ฐ์„ ์ž…์ฆํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋‹ค์Œ ์˜๋ฏธ ๋ชจ๋ธ ์‹คํ—˜์€ ๊ฒ€์ƒ‰ ๋„์›€ ์—ฌ๋ถ€๋ฅผ ๋Ÿฐํƒ€์ž„์—์„œ ๊ด€์ธก ๊ฐ€๋Šฅํ•œ ์‹ ํ˜ธ๋กœ ์˜ˆ์ธกํ•˜๋˜ ๋ณ„๋„ ์ž๋ฃŒยท๊ธฐ์ค€์œผ๋กœ ๊ฒ€์ฆํ•ด์•ผ ํ•œ๋‹ค.