BM25 ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์: ๋ฒกํฐ ๊ฒฐํฉ๋ถํฐ ์ฌํ์จ ๊ฒ์ฆ๊น์ง
BM25์ ๋ฒกํฐ ๊ฒ์์ ๊ฒฐํฉํ๋ ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์์ ์๋ฆฌ์ ๊ตฌํ ๋ฐฉ๋ฒ์ ์ดํด๋ด ๋๋ค. RRF์ ๊ฐ์ค ์ ์์ ์ฐจ์ด, ์ ํํ ์๋ณ์ ์ฒ๋ฆฌ, ElasticsearchยทWeaviateยทPinecone ์ค์ , ๋ผ๋ฒจ๋งํ ์ง์๋ฅผ ํ์ฉํ recall@k ๋น๊ต๊น์ง ์๋ดํฉ๋๋ค.
๊ฒ์์ผ

๊ฒ์์ด ์ง๋ฌธ์ ๋ป์ ์ดํดํ๋ฉด์ ์ ํ ์ฝ๋๋ ๋์น๋ค๋ฉด, ์๋ฒ ๋ฉ ๋ชจ๋ธ์ ๊ต์ฒดํ๊ธฐ ์ ์ ์ดํ ๊ธฐ๋ฐ ๊ฒ์ ๊ฒฝ๋ก๋ถํฐ ์ถ๊ฐํด ๋ณด์ญ์์ค. ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์์ BM25 ๊ฐ์ ํค์๋ ๊ฒ์์ ํ๋ณด ๋ชฉ๋ก๊ณผ ๋ฒกํฐ ๊ฒ์์ ํ๋ณด ๋ชฉ๋ก, ์ด๋ ๊ฒ 2๊ฐ๋ฅผ ํ๋์ ์์๋ก ํฉ์นฉ๋๋ค. ๋จผ์ ์ํธ ์์ ์ตํฉ(RRF)์ ์ ์ฉํ๊ณ , ์ ํํ ์๋ณ์๋ฅผ ์ฒ๋ฆฌํ๋ ๊ท์น์ ๋ช ์์ ์ผ๋ก ์ ์งํฉ๋๋ค. ๊ด๋ จ ๋ฌธ์๋ฅผ ๋ผ๋ฒจ๋งํ ์ง์ ์ธํธ์์ ๊ธฐ์กด์ ์ ์ฒ๋ฆฌํ๋ ์ง์๋ฅผ ํด์น์ง ์์ผ๋ฉด์ ์ฌํ์จ์ด ๋์์ง ๋๋ง ๋ณ๊ฒฝ์ ์ ์งํฉ๋๋ค.
๋ฌธ์ ํ์ธ์ผ: 2026๋ 10์ 24์ผ. ์๋ ๊ตฌํ ์ค๋ช ์ Elasticsearch, Weaviate, Pinecone์ ํํ ๋ฌธ์๋ฅผ ๊ธฐ์ค์ผ๋ก ํฉ๋๋ค. ํ๊ฐ ์ค์ ์ ์คํ์ ์์ํ๊ธฐ ์ํ ์ ์์ด๋ฉฐ, ์ค์ ๋ก ์ธก์ ํ ๊ฐ์ ๊ฒฐ๊ณผ๋ ๊ณต๊ธ์ฌ์ ๋ฒค์น๋งํฌ๊ฐ ์๋๋๋ค.
BM25์ ๋ฒกํฐ๋ฅผ ๊ฒฐํฉํ ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์์ด๋?
ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์์ ํํ ์์ฒด์ ๊ทธ ์๋ฏธ๋ฅผ ๋ชจ๋ ๊ฒ์์ ๋ฐ์ํฉ๋๋ค. ์ด ๊ธ์์ ๋ค๋ฃจ๋ ๊ตฌ์กฐ์์๋ ํค์๋ ๊ฒ์๊ณผ ๋ฒกํฐ ๊ฒ์์ด ๊ฐ๊ฐ ์์๊ฐ ๋งค๊ฒจ์ง ๋ชฉ๋ก์ ๋ง๋ค๊ณ , ์ตํฉ ๋ฐฉ์์ด ๋ ๋ชฉ๋ก์ ํฉ์นฉ๋๋ค. Weaviate์ ๊ฐ๋ ์ค๋ช ์์ ๋ ๊ฒ์ ๊ฒฝ๋ก์ ๊ฒฐํฉ ๋ฐฉ์์ ํ์ธํ ์ ์์ต๋๋ค.
๊ฐ์ ๊ณ ๊ฐ ์ง์ ์ง๋ฌธ์ ๋ ์กฐ์ฌ ๋ด๋น์์๊ฒ ๋งก๊ธด๋ค๊ณ ์๊ฐํด ๋ณด์ญ์์ค. ํ ๋ช ์ ์์ธ์์ ์ ํํ ์ด๋ฆ๊ณผ ์ค๋ฅ ๋ฌธ์์ด์ ํ์ธํฉ๋๋ค. ๋ค๋ฅธ ํ ๋ช ์ ํํ์ด ๋ฌ๋ผ๋ ๊ด๋ จ๋ ๋ด์ฉ๊ณผ ๋ต๋ณ์ ์ฐพ์ต๋๋ค. ์ด๋ ํ์ชฝ์ ๋ ์ญํ ์ ๋ชจ๋ ๋งก๊ธฐ๋ ๋์ , ๊ฐ์ ์ถ๋ฆฐ ํ๋ณด๋ฅผ ํฉ์น๋ ๋ฐฉ์์ ๋๋ค.
BM25๋ ๋ฌธ์์ ํฌํจ๋ ์ง์์ด๋ฅผ ๋ฐํ์ผ๋ก ์ ์๋ฅผ ๋งค๊ธฐ๋ ์ดํ ๊ธฐ๋ฐ ๋ญํน ํจ์์ ๋๋ค. ๋จ์ด์ ์ถํ ๋น๋์ ๋ฌธ์ ๊ธธ์ด๊ฐ ์ ์์ ์ํฅ์ ์ฃผ๋ฏ๋ก, ์ผ์นํ๋ ๋จ์ด ์๋ง ์ธ๋ ๋ฐฉ์๋ณด๋ค ์ ์ฉํฉ๋๋ค. Elasticsearch๋ ํ ์คํธ ์ ์ฌ๋์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก BM25๋ฅผ ์ฌ์ฉํฉ๋๋ค. Elastic์ ์ ์ฌ๋ ๋ ํผ๋ฐ์ค์์ ์ ์์ ์ํฅ์ ์ฃผ๋ ์์๋ฅผ ์ค๋ช ํฉ๋๋ค.
๋ฒกํฐ ๊ฒ์์ ์ฝํ ์ธ ๋ฅผ ์ซ์๋ก ํํํ ์๋ฒ ๋ฉ์ ๋น๊ตํด ์๋ฏธ๊ฐ ๋น์ทํ ๋ด์ฉ์ ์ฐพ์ต๋๋ค. ์๋ฅผ ๋ค์ด โ์๊พธ ๋ก๊ทธ์์๋ฉ๋๋คโ๋ผ๋ ์ง๋ฌธ์, ํํ์ด ๋ค๋ฅธ ์ธ์ ๋ง๋ฃ ๋ฌธ์์ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค. ์๋งจํฑ ๊ฒ์ ๊ฐ์ด๋์์ ์ด ๊ฒ์ ๋ฐฉ์์ ์ค๋ช ํฉ๋๋ค.
์์ ์ง์๊ฐ ERR_SESSION_EXPIRED after login์ด๋ผ๋ฉด, ์ดํ ๊ธฐ๋ฐ ๊ฒ์์ ์ค๋ฅ ๋ฌธ์์ด์ด ๊ทธ๋๋ก ๋ค์ด ์๋ ๋ฌธ์๋ฅผ ๊ฒฐ๊ณผ์ ํฌํจํ ์ ์๊ฒ ํฉ๋๋ค. ์๋ฏธ ๊ธฐ๋ฐ ๊ฒ์์ ์ธ์ฆ ์ธ์
๊ณผ ๊ฐฑ์ ์ ๊ดํ ์๋ด๋ฅผ ๋ณดํค ์ ์์ต๋๋ค. ์ต์ข
์์๋ ์ตํฉ ๊ณผ์ ์์ ๊ฒฐ์ ํฉ๋๋ค. ์ด๋ ์๋ํ ๋์์ ์ค๋ช
ํ๋ ์์์ด์ง, ๋ณ๋ ์ค์ ์ด ์๋ ์ ์ฅ์์์ ํน์ ์์๊ฐ ๋์จ๋ค๋ ์ฃผ์ฅ์ ์๋๋๋ค.

BM25๋ฅผ ๊ฒฐํฉํด๋ ์ ํํ ์๋ณ์ ์ฒ๋ฆฌ ๊ท์น์ ํ์ํฉ๋๋ค
ํค์๋ ๊ฒ์ ๊ฒฝ๋ก๊ฐ ์๋ค๊ณ ํด์ ์๋ณ์์ ์ ํํ ์ผ์น๊ฐ ๋ณด์ฅ๋์ง๋ ์์ต๋๋ค. ๋ฌธ์์ด์ ๊ฒ์ ๊ฐ๋ฅํ ํ ํฐ์ผ๋ก ๋ฐ๊พธ๋ ํ ์คํธ ๋ถ์ ๊ณผ์ ์์ ์์ธ์ ์ ์ฅ๋๋ ํํ๊ฐ ๋ฌ๋ผ์ง ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์๋ฅผ ๋ค์ด Elastic์ ํ์ค ๋ถ์๊ธฐ๋ ๋ฌธ์์ ๋์จ ์์์์ ํ์ดํ์ผ๋ก ์ฐ๊ฒฐ๋ ๊ตฌ๋ฌธ์ ๋ถ๋ฆฌํฉ๋๋ค. ํ์ฌ ์ค์ ํ ๋ถ์๊ธฐ๊ฐ ์ค์ SKU์ ์ค๋ฅ ์ฝ๋๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ๋์ง ํ์ธํ์ญ์์ค. ํ์ค ๋ถ์๊ธฐ ๋ฌธ์์์ ๊ด๋ จ ๋ด์ฉ์ ๋ณผ ์ ์์ต๋๋ค.
์๋ณ์์ ํ๊ธฐ ์์ฒด๊ฐ ์์ฒญํ ํญ๋ชฉ์ ๊ฒฐ์ ํ๋ค๋ฉด, ์๋ณ์๋ฅผ ์ ํํ ์ผ์นํ๋ ๊ฐ์ ์ฐพ๊ธฐ ์ํ ์ ์ฉ ํ๋์ ๋ณด๊ดํฉ๋๋ค. Elastic์ ์ด๋ฐ ๊ตฌ์กฐํ๋ ๊ฐ์ ์ฌ์ฉํ๋ keyword ํ๋๋ฅผ ์ค๋ช
ํฉ๋๋ค. ๊ฐ์์ SKU์ธ AX-BLUE๋ฅผ ๊ฒ์ํ๋๋ฐ ์ค๋ช
์ด ๋น์ทํ๋ค๋ ์ด์ ๋ก AX-GREEN ์ถ์ฒ์ผ๋ก ์ฌ์ฉ ๋ฐ๋์ด์๋ ์ ๋ฉ๋๋ค. Keyword ํ๋ ๋ ํผ๋ฐ์ค๋ฅผ ์ฐธ๊ณ ํ์ญ์์ค.
ํ๋จ ๊ธฐ์ค: ์ ํ์ด ์ ํํ ํญ๋ชฉ ์กฐํ๋ฅผ ๋ณด์ฅํด์ผ ํ๋ค๋ฉด, ์ธ์๋ ๊ณ ์ ์๋ณ์๋ ์ ํ ์ผ์น ์กฐํ๋ก ๋ณด๋ ๋๋ค. ํด๋น ํญ๋ชฉ์ ๋ฌธ์ ํด๊ฒฐ ์๋ด์ฒ๋ผ ์๋ณ์์ ๋ ๋์ ์๊ตฌ๊ฐ ๊ฒฐํฉ๋ ์ง๋ฌธ์๋ ํ์ด๋ธ๋ฆฌ๋ ๋ญํน์ ์ฌ์ฉํฉ๋๋ค.
RRF์ ๊ฐ์ค ์ ์, ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ป๊ฒ ํฉ์น ๊น์?
์๋ก ๋ค๋ฅธ ์ ์ ์ฒ๋๋ฅผ ๋ณด์ ํ์ง ์๊ณ ๋น๊ต ๊ธฐ์ค์ ๋ง๋ จํ๋ ค๋ฉด RRF๋ถํฐ ์์ํฉ๋๋ค. ๊ฐ์ค ์ ์๋ ๊ท ํ์ ์กฐ์ ํ ๋ผ๋ฒจ์ด ์๊ณ , ์ ์ ๊ฐ ๊ฒฉ์ฐจ๋ฅผ ๋ณด์กดํ ์ด์ ๊ฐ ์์ ๋ ๊ฒํ ํฉ๋๋ค.
RRF๋ ์ ์ ๋์ ์์๋ฅผ ์ฌ์ฉํฉ๋๋ค
**์ํธ ์์ ์ตํฉ(reciprocal rank fusion, RRF)**์ ๋ฌธ์๊ฐ ๋ฑ์ฅํ ๊ฐ ๋ชฉ๋ก์์ ๋ค์ ๊ธฐ์ฌ๋๋ฅผ ๋ํฉ๋๋ค.
RRF(๋ฌธ์) = ๊ฐ ๊ฒ์ ๊ฒฐ๊ณผ ๋ชฉ๋ก์ 1 / (c + ์์)๋ฅผ ๋ชจ๋ ๋ํ ๊ฐ.
์์๋ ์ฒซ ๋ฒ์งธ ์์น๋ถํฐ ์์ํฉ๋๋ค. ์ด๋ค ๋ชฉ๋ก์ ๋ฌธ์๊ฐ ์์ผ๋ฉด ๊ทธ ๋ชฉ๋ก์์๋ ์ ์๋ฅผ ๋ํ์ง ์์ต๋๋ค. Gordon V. Cormack, Charles L. A. Clarke, Stefan Bรผttcher๋ SIGIR 2009 ๋
ผ๋ฌธ์์ RRF๋ฅผ ์๊ฐํ์ต๋๋ค. ์ด๋ค์ ์คํ์์ ์์๋ฅผ 60์ผ๋ก ๊ณ ์ ํ์ต๋๋ค. ๋
ผ๋ฌธ์ ์ด ์์๋ฅผ k๋ผ๊ณ ํ๊ธฐํ์ง๋ง, ์ด ๊ธ์์๋ recall@k์ ๊ฒฐ๊ณผ ์์ ํผ๋ํ์ง ์๋๋ก c๋ผ๊ณ ๋ถ๋ฆ
๋๋ค.
RRF๋ ๋์ BM25 ์ ์์ ๋์ ๋ฒกํฐ ์ ์๊ฐ ๊ฐ์ ์๋ฏธ๋ฅผ ๊ฐ์ง ํ์๊ฐ ์์ด ํธ๋ฆฌํฉ๋๋ค. ๊ฐ ๋ชฉ๋ก์์์ ์์น๋ง ์ค์ํฉ๋๋ค. Pinecone์ RRF ๊ตฌํ์ ์ฒซ ์์๋ถํฐ ์ธ๋ ๋ฐฉ์๊ณผ ๋ชฉ๋ก์ ์๋ ๋ฌธ์์ ์ฒ๋ฆฌ๋ฅผ ๋ช ํํ ์ค๋ช ํฉ๋๋ค.
๋ค๋ง ์ด ๋ฐฉ์์ด ์ด๋ค ๊ฒฐ๊ณผ๋ฅผ ๋ง๋๋์ง ํ์ธํด์ผ ํฉ๋๋ค. ๊ฐ์์ ์์์ ๋ฌธ์ A๋ ํค์๋ ๋ชฉ๋ก์ ๋งจ ์์ ์๊ณ ๋ฒกํฐ ๋ชฉ๋ก์๋ ์์ต๋๋ค. ๋ฌธ์ B๋ ๋ ๋ชฉ๋ก์์ ๋ชจ๋ ๋ ๋ฒ์งธ์
๋๋ค. c = 60์ด๋ฉด A์ ์ ์๋ 1/61, B์ ์ ์๋ 2/62์
๋๋ค. B๊ฐ ์์ญ๋๋ค. ์ด๋ ๊ณต์์ผ๋ก ์ง์ ๊ณ์ฐํ ์์์ด๋ฉฐ ๊ฒ์ ๋ฒค์น๋งํฌ๊ฐ ์๋๋๋ค.
๊ฐ์ค ์ ์๋ ์ ์ ๊ฐ ์ฐจ์ด๋ฅผ ๋ณด์กดํฉ๋๋ค
๊ฐ์ค ์ ์ ์ตํฉ์ ๊ด๋ จ์ฑ ์ ์์ ์ฒ๋๋ฅผ ๋น๊ต ๊ฐ๋ฅํ ์ํ๋ก ๋ง๋ ๋ค ํฉ์นฉ๋๋ค. ํํ ์ฌ์ฉํ๋ ํํ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ ์ = alpha ร ์ ๊ทํํ ๋ฒกํฐ ์ ์ + (1 โ alpha) ร ์ ๊ทํํ ํค์๋ ์ ์.
๊ฐ์ค์น alpha๊ฐ ๋ ์ ์์ ๋น์ค์ ์กฐ์ ํฉ๋๋ค. ์์๊ฐ์ 0.5๋ก ์ ํ๋ฉด ๊ณ์๊ฐ ๊ฐ์์ง ๋ฟ, ๋ ๊ฒ์ ๋ฐฉ์์ ์ ์ฉ์ฑ์ด ๊ฐ๊ฑฐ๋ ์ต์ ์ ์ค์ ์ด๋ผ๋ ๋ป์ ์๋๋๋ค. ์ ๊ทํ์ ๊ฐ์ค์น ์ค ์ด๋ ํ๋๋ง ๋ฐ๋์ด๋ ์์๊ฐ ๋ฌ๋ผ์ง ์ ์์ผ๋ฏ๋ก ๋์ ํจ๊ป ๊ธฐ๋กํฉ๋๋ค.
Elasticsearch์ linear retriever๋ minmax ๊ฐ์ ์ ๊ทํ ๋ฐฉ์์ ์ ์ฉํ ๊ฐ์ค ํฉ์ ์ง์ํฉ๋๋ค. Weaviate์ ์๋ ์ ์ ์ตํฉ์ ๊ฐ ๊ฒฐ๊ณผ ์งํฉ ์์ ์๋์ ์ธ ์ ์ ๊ฒฉ์ฐจ๋ฅผ ๋ณด์กดํฉ๋๋ค. ์์ ๊ธฐ๋ฐ ์ตํฉ์ ๊ทธ ๊ฒฉ์ฐจ๋ฅผ ๋ฒ๋ฆฝ๋๋ค.
์ฒซ ๋น๊ต๋ RRF๋ก ์์ํ๊ณ , ํ๊ฐ์ฉ์ผ๋ก ๋ฐ๋ก ๋จ๊ฒจ ๋ ์ง์์์ ํจ๊ณผ๊ฐ ํ์ธ๋ ๋๋ง ๊ฐ์ค ์ตํฉ์ ์ ์งํฉ๋๋ค. ์์ BM25 ์ ์์ ๋ฒกํฐ ์ ์ฌ๋ ์ ์๋ฅผ ๊ทธ๋๋ก ๋ํ ๋ค ์๋ฏธ ์๋ ํฉ์ด๋ผ๊ณ ๊ฐ์ ํด์๋ ์ ๋ฉ๋๋ค. ํ๋ณด ๊น์ด, ์ฆ ํ๋ณด๋ฅผ ๋ช ๊ฐ๊น์ง ๊ฐ์ ธ์ค๋์ง๋ ๊ธฐ๋กํฉ๋๋ค. ์ ๊ทํํ ๋ชฉ๋ก์ ์ด๋ค ๊ฒฐ๊ณผ๊ฐ ๋ค์ด๊ฐ๋๋์ ๋ฐ๋ผ ์ ์ ๋ฒ์๊ฐ ๋ฌ๋ผ์ง ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์์ ์ธ์ ๋ฒกํฐ ๊ฒ์๋ณด๋ค ์ ๋ฆฌํ๊ฐ์?
ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์์ ๋ฒกํฐ ๊ฒ์์ด ๋์น ๊ด๋ จ ์๋ฃ๋ฅผ ํค์๋ ๊ฒ์์ด ์ฐพ๊ณ , ์ตํฉ ํ์๋ ๊ทธ ์๋ฃ๊ฐ ์ ์ฉํ ๋งํผ ๋์ ์์๋ฅผ ์ ์งํ ๋ ๋์์ด ๋ฉ๋๋ค. ์ด๋ ์ง์ ํ์ธํ ์ ์๋ ์กฐ๊ฑด์ด์ง, ์ธ์ ๋ ์ ํ๋๊ฐ ๋์์ง๋ค๋ ์ฃผ์ฅ์ด ์๋๋๋ค.
๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์ ์ฐ์ ์ํํด ๋ณผ ๋งํฉ๋๋ค.
- ๊ณ ๊ฐ ์ง์ ๊ฒ์: ์ ํํ ์ค๋ฅ ๋ฌธ์์ด, ํจ์๋ช , ๊ณ์ ๊ด๋ จ ์ฉ์ด๊ฐ ์ฆ์ ์ค๋ช ๊ณผ ํจ๊ป ๋ฑ์ฅํ๋ ๊ฒฝ์ฐ์ ๋๋ค.
- ์นดํ๋ก๊ทธ ๊ฒ์: ์ ํํ ์ ํ๋ช ์ด๋ SKU์ ํธํ์ฑ, ๊ต์ฒด ๋ถํ ๊ฐ์ ์๊ตฌ๊ฐ ์์ธ ๊ฒฝ์ฐ์ ๋๋ค.
- ์ฌ๋ด ์ง์ ๊ฒ์: ํ๋ก์ ํธ ์ด๋ฆ๊ณผ ์ฝ์ด๊ฐ ์์ฐ์ด ์ง๋ฌธ์ ์์ธ ๊ฒฝ์ฐ์ ๋๋ค.
Pinecone์ ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์ ๊ฐ์๋ ์๋ฏธ๋ฅผ ์ฐพ๋ ๋ฐ์ง ๋ฒกํฐ ๊ฒ์๊ณผ ํจ๊ป ์ฌ์ฉํ ํค์๋ ์ ํธ๋ก ์ ํ ์ฝ๋, ์ค๋ฅ ๋ฌธ์์ด, ์ด๋ฆ์ ๊ตฌ์ฒด์ ์ผ๋ก ๊ผฝ์ต๋๋ค.
์๋ณ์๋ง ์กฐํํ๋ค๋ฉด ์ ๋ขฐํ ์ ์๋ ์ ํ ์ผ์น ์กฐํ๋ถํฐ ๋ง๋ จํฉ๋๋ค. ํ์ฌ ๋ฌธ์ ์งํฉ๊ณผ ์ง์๋ฅผ ๋ฒกํฐ ๊ฒ์์ด ์ด๋ฏธ ์ ์ฒ๋ฆฌํ๋ค๋ฉด, ๊ฒ์ ๋ฌธ์ ๊ฐ ์๋ค๋ ๊ทผ๊ฑฐ๋ฅผ ํ์ธํ ๋ค ๋ค๋ฅธ ๊ฒฝ๋ก๋ฅผ ์ถ๊ฐํฉ๋๋ค.
์ค์ง์ ์ธ ํ๊ณ๋ ํ๋ณด์ ๊ด๋ จ ๋ฌธ์๊ฐ ํฌํจ๋๋ ๋ฒ์์ ๋๋ค. ์ตํฉ์ ๊ฐ ๊ฒ์ ๊ฒฝ๋ก๊ฐ ์ฐพ์์จ ๋ฌธ์์ ํฉ์งํฉ ์์์๋ง ์์๋ฅผ ์ ํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒฝ๋ก๋ ๊ด๋ จ ๊ตฌ์ ์ ์ฐพ์ง ๋ชปํ๋ค๋ฉด ์ตํฉ ๋ฐฉ์์ ๋ฐ๊ฟ๋ ๋์ด๋ฆด ์ ์์ต๋๋ค. ์ตํฉ ์ ์๋ ์์๋ ๊ตฌ์ ์ด ์ต์ข ๊ฒฐ๊ณผ์์ ๋น ์ก๋ค๋ฉด ๋ญํน๊ณผ ๊ฒฐ๊ณผ๋ฅผ ์๋ผ๋ด๋ ์ง์ ์ ์ดํด๋ด ๋๋ค.
ํ์ฌ ์ฌ์ฉํ๋ ์ ์ฅ์์ ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์์ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ
ํ์ฌ ์ ์ฅ์๊ฐ ํ์ํ ๊ธฐ๋ณธ ๊ฒ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค๋ฉด ๊ทธ๋๋ก ์ฌ์ฉํฉ๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ฒ์ ์ ๋ต์ ๋์์ ๋ฐ๊พธ๋ฉด ๋ฌด์์ด ๊ฐ์ ์ ๊ธฐ์ฌํ๋์ง ๊ฐ๋ ค๋ด๊ธฐ ์ด๋ ต์ต๋๋ค.
์๋ ํ๋ ๊ณต๊ธ์ฌ์ ์ฐ์ด์ด ์๋๋ผ, ๋ ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ์ด๋์์ ๊ฒฐํฉํ๋์ง ๊ตฌ๋ถํฉ๋๋ค.
Elasticsearch์์ ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์ ๊ตฌ์ฑํ๊ธฐ
Elasticsearch๋ ํ
์คํธ ๊ฒ์๊ณผ ๋ฒกํฐ ๊ฒ์์ ์ง์ํ๋ ๊ฒ์ ์์ง์
๋๋ค. rrf ๊ฒ์๊ธฐ ์๋์ standard ํ
์คํธ ๊ฒ์๊ธฐ์ knn ๋ฒกํฐ ๊ฒ์๊ธฐ๋ฅผ ๋ฐฐ์นํ ์ ์์ต๋๋ค. ๊ณต์ RRF ๊ฒ์๊ธฐ ๋ ํผ๋ฐ์ค์์ ์ด ๊ตฌ์กฐ์ ํ๋ณด ์๋๋ฅผ ์ค๋ช
ํฉ๋๋ค.
๊ธฐ์กด ์์ธ์์๋ ๊ฒ์ํ ํ ์คํธ์ ํด๋น ์๋ฒ ๋ฉ์ด ๊ฐ์ ๋ฌธ์ ID๋ฅผ ์ฌ์ฉํ๋๋ก ์ ์งํฉ๋๋ค. ๋ ๊ฒ์ ๊ฒฝ๋ก๊ฐ ๋์ผํ ๊ฒ์ ๋์ ์ฝํ ์ธ ๋ฅผ ์กฐํํ๊ฒ ํ ๋ค ์ตํฉํฉ๋๋ค. ํ ๋ํธ, ๊ถํ, ์ ํ ๋ฒ์ ์ ๋ฐ๋ฅธ ์ ํ๋ ๋ ๊ฒฝ๋ก์ ์ผ๊ด๋๊ฒ ์ ์ฉํฉ๋๋ค.
๋ค์ ์์ฒญ์ ES_URL๊ณผ ES_API_KEY๋ฅผ ์ค์ ํ ๋ค ์คํํ ์ ์์ต๋๋ค. ๊ธฐ์กด docs ์์ธ์ text ํ
์คํธ ํ๋์ embedding ๋ฐ์ง ๋ฒกํฐ ํ๋๊ฐ ์๊ณ , query-vector.json์ ์ง์์ ์ค์ ์๋ฒ ๋ฉ ๋ฐฐ์ด์ด ๋ค์ด ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ์ด ๋ฐฐ์ด์ ์์ธ๋ ๋ฌธ์์ ์ฌ์ฉํ ๋ชจ๋ธ๋ก ์์ฑํฉ๋๋ค. ๋ช
๋ น ์คํ์๋ jq์ curl์ด ํ์ํฉ๋๋ค.
jq -n --slurpfile v query-vector.json \
--arg q 'ERR_SESSION_EXPIRED after login' \
'{
size: 10,
retriever: {
rrf: {
retrievers: [
{standard: {query: {match: {text: $q}}}},
{knn: {
field: "embedding",
query_vector: $v[0],
k: 50,
num_candidates: 100
}}
],
rank_window_size: 50,
rank_constant: 60
}
}
}' > hybrid-request.json
curl --fail-with-body "$ES_URL/docs/_search" \
-H "Authorization: ApiKey $ES_API_KEY" \
-H 'Content-Type: application/json' \
--data-binary @hybrid-request.json์ด๋ ํ๊ฐ๋ฅผ ์ํ ์์ ์ค์ ์
๋๋ค. size๋ ์ต์ข
๊ฒฐ๊ณผ ์์ด๋ฉฐ, rank_window_size๋ ๊ฐ ํ์ ๊ฒ์๊ธฐ์ ๊ฒฐ๊ณผ ์ค ๋ช ๊ฐ๊น์ง ์ตํฉ์ ์ฐธ์ฌํ ์ ์๋์ง ์ ์ดํฉ๋๋ค. ์ด ์์์๋ ํํฐ๊ฐ ์์ผ๋ฏ๋ก, ์ ๊ทผ ๊ถํ์ ์ ์ดํ๋ ์ ํ๋ฆฌ์ผ์ด์
์ ์ ์ฉํ๋ ค๋ฉด ํด๋น ๊ฒ์ ๋์ ์ ํ์ ์ถ๊ฐํด์ผ ํฉ๋๋ค. Elastic ๋ฌธ์๋ ๊ฐ ํ์ ๊ฒ์๊ธฐ์ ๋ช
์ธ์ ๋ฐ๋ผ ์ ์ฉ๋๋ ์์ filter๋ฅผ ์ค๋ช
ํฉ๋๋ค.
์ฃผ์ํ ์ : ํ์ ๊ฒ์๊ธฐ์ ํ๋ณด ์๋๊ฐ ์ข์ผ๋ฉด, ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์์ผ๋ก ๋์ฐพ์ผ๋ ค๋ ๊ฒฐ๊ณผ ์์ฒด๊ฐ ํ๋ฝํ ์ ์์ต๋๋ค. ์ตํฉ ๋ฐฉ์์ ์กฐ์ ํ๊ธฐ ์ ์ ๊ฐ ๊ฒฝ๋ก์ ํ๋ณด์ ์ต์ข ๊ฒฐ๊ณผ๋ฅผ ๋น๊ตํฉ๋๋ค. linear retriever๋ก ์ ํํ๋ค๋ฉด ๊ฐ์ค์น์ ํจ๊ป ์ ๊ทํ๋ ์ค์ ํฉ๋๋ค.
Weaviate์์ ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์ ๊ตฌ์ฑํ๊ธฐ
Weaviate๋ ํ
์คํธ์ ๋ฒกํฐ ๊ฒ์์ ์ ๊ณตํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ด๋ฉฐ, collection.query.hybrid๋ก ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์์ ์คํํฉ๋๋ค. ์ดํ ๊ธฐ๋ฐ ๊ฒ์์๋ ์ฌ๋ฌ ํ๋๋ฅผ ์ง์ํ๋ ๋ณํ์ธ BM25F๋ฅผ ์ฌ์ฉํฉ๋๋ค. ํ์ด๋ธ๋ฆฌ๋ ์ง์ ๋ฌธ์๋ ๊ฒ์ํ ์์ฑ, ์ตํฉ ๋ฐฉ์ ์ ํ, ์ ์ ์ค๋ช
์ ๋ค๋ฃน๋๋ค.
์ ๋ชฉ, ์ค๋ฅ ํ
์คํธ, ์ ํ๋ช
์ฒ๋ผ ์ ์ฉํ ์ดํ ๋จ์๋ฅผ ๋ด์ ํ๋๋ฅผ query_properties๋ก ์ง์ ํฉ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์
์์ ์๋ฒ ๋ฉ์ ์์ฑํ๋ค๋ฉด ์ง์ ๋ฒกํฐ๋ฅผ ์ ๋ฌํ๊ณ , ๊ทธ๋ ์ง ์๋ค๋ฉด ์ปฌ๋ ์
์ ์ค์ ๋ ๋ฒกํฐํ ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ตํฉ ๋ฐฉ์์ ๋น๊ตํ ๋๋ fusion_type์ ๋ช
์์ ์ผ๋ก ์ง์ ํ๊ณ , ๊ฒฐ๊ณผ์ ์์๊ฐ ๋ฐ๋ ์ด์ ๋ฅผ ์ง๋จํ ๋๋ explain_score๋ฅผ ์์ฒญํฉ๋๋ค.
alpha๋ ๋ช
์์ ์ผ๋ก ์ค์ ํฉ๋๋ค. 0์ ํค์๋ ๊ฒ์์, 1์ ๋ฒกํฐ ๊ฒ์์ ์ ํํฉ๋๋ค. ํํ ๋ฌธ์๋ ์ด ๊ฐ์ ์๋ตํ์ ๋ ์ค์ ๋ก ์ ์ฉ๋๋ ๊ฐ์ค์น๊ฐ ํด๋ผ์ด์ธํธ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ค๊ณ ์๋ดํฉ๋๋ค. ๊ธฐ๋ณธ ์ตํฉ ๋ฐฉ์์ relativeScoreFusion์ด๋ฉฐ, rankedFusion๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. Weaviate์ ์ตํฉ ๋ ํผ๋ฐ์ค๋ฅผ ์ฐธ๊ณ ํ์ญ์์ค.
์ฃผ์ํ ์ : ๊ฐ์ค์น๋ฅผ ๋ฐ๊ฟ๋ ๊ฒ์ ๋์์์ ๋น ์ง ํ๋๋ ํผ์๋ ์๋ณ์ ํ ํฐ์ ๋ณต๊ตฌ๋์ง ์์ต๋๋ค. ์๋ฒ ๋ฉ ๋ชจ๋ธ์ ๊ต์ฒดํด์ผ ํ๋ค๊ณ ๊ฒฐ๋ก ๋ด๋ฆฌ๊ธฐ ์ ์ ์ดํ ๊ธฐ๋ฐ ๊ฒ์์ด ๋ฌด์์ ๊ธฐ์ฌํ๋์ง ํ์ธํฉ๋๋ค. ๊ฐ์ค์น ๋ฒ์์ ์ ๋์ธ ๋ฒกํฐ ์ ์ฉ ๊ฒ์๊ณผ ํค์๋ ์ ์ฉ ๊ฒ์์ ์ง๋จ ๊ธฐ์ค์ผ๋ก ์ผ์ ๋ค, ๊ฒฐํฉํ ์ค์ ์ ํ๊ฐํฉ๋๋ค.
Pinecone์์ ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์ ๊ตฌ์ฑํ๊ธฐ
๊ฒ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค Pinecone์ ์๋ก ๋ค๋ฅธ ํ์ด๋ธ๋ฆฌ๋ ๊ตฌ์ฑ์ ๋ฌธ์ํํ๊ณ ์์ต๋๋ค. ์๋ฒ์ ๋ฐ์งยทํฌ์ ๋ฒกํฐ ๊ฒฐํฉ๊ณผ ํด๋ผ์ด์ธํธ์ RRF๋ ๊ตฌํ์ด ๋ค๋ฅด๋ฏ๋ก, ์์๋ฅผ ๋ณต์ฌํ๊ธฐ ์ ์ ์ฌ์ฉํ ๋ฐฉ์์ ์ ํฉ๋๋ค. Pinecone์ ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์ ๊ฐ์๋ฅผ ์ฐธ๊ณ ํ์ญ์์ค.
BM25์ ๋ฐ์ง ๋ฒกํฐ ๊ฒ์์ ๊ฒฐํฉํ๋ ค๋ฉด Documents API ๋ฐฉ์์ผ๋ก ์ ๋ฌธ ๊ฒ์๊ณผ ๋ฐ์ง ๋ฒกํฐ ๊ฒ์์ ๊ฐ๊ฐ ์คํํ ๋ค, ์์๊ฐ ๋งค๊ฒจ์ง ๋ฌธ์ ID๋ฅผ ์ ํ๋ฆฌ์ผ์ด์ ์์ RRF๋ก ํฉ์นฉ๋๋ค. Pinecone์ RRF ๊ฐ์ด๋์ ์ด ํด๋ผ์ด์ธํธ ์ธก ๊ตฌํ์ด ๋์ต๋๋ค.
๋ด์ฅ ๊ธฐ๋ฅ์ผ๋ก ๋ฐ์ง ๋ฒกํฐ์ ํฌ์ ๋ฒกํฐ๋ฅผ ๊ฒฐํฉํ๋ ค๋ฉด Vectors API๋ฅผ ์ฌ์ฉํด ๊ฐ ๋ ์ฝ๋์ ๋ ํํ์ ํจ๊ป ์ ์ฅํ๊ณ ํ๋์ ์ง์์์ ๊ฒฐํฉํ ์ ์์ต๋๋ค. ๋จ์ผ ์์ธ ๊ฐ์ด๋๋ vector_type="dense"์ metric="dotproduct"๋ฅผ ์๊ตฌํฉ๋๋ค. ๋ ํํ์ ์๋์ ์ธ ์ํฅ๋ ฅ์ ํด๋ผ์ด์ธํธ์์ ์ง์ ๋ฒกํฐ์ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํด ์ ํฉ๋๋ค.
ํฌ์ ๋ฒกํฐ๋ ํํ ๋ฐฉ์์ผ ๋ฟ, BM25๋ก ์์ฑํ๋ค๋ ์ฆ๊ฑฐ๋ ์๋๋๋ค. ์ค๊ณ ๋ฌธ์์ ์ดํ ๋ชจ๋ธ์ด๋ ์ ๋ฌธ ๊ฒ์์ ์ ์ ๊ณ์ฐ ๋ฐฉ์์ ๋ช ์ํฉ๋๋ค.
์ฃผ์ํ ์ : ํค์๋๋ก ํํฐ๋งํ ๋ค ๋ฐ์ง ๋ฒกํฐ๋ก ์์๋ฅผ ๋งค๊ธฐ๋ ๋ฐฉ์์ ๋ ์ ํธ๋ฅผ ๋ชจ๋ ๋ญํน์ ๋ฐ์ํ๋ ๊ฒ๊ณผ ๋ค๋ฆ ๋๋ค. ํํฐ๋ ํ๋ณด๋ฅผ ์ ๊ฑฐํ๋ฏ๋ก, ์ด๋ฏธ ์ ์ธํ ๋์์ด ์ผ์น ๊ฒฐ๊ณผ๋ฅผ ๋์ด๋ฆด ์ ์์ต๋๋ค. ๋ฐ๋์ ์ถฉ์กฑํด์ผ ํ๋ ์กฐ๊ฑด์๋ ํํฐ๋ฅผ ์ฌ์ฉํ๊ณ , ์ด๋ ๊ฒ์ ๊ฒฝ๋ก์์๋ ๊ฒฐ๊ณผ๋ฅผ ๋ณดํค ์ ์์ด์ผ ํ๋ค๋ฉด ์ตํฉ์ ์ฌ์ฉํฉ๋๋ค.
RAG์์ ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์์ ์ด๋ค ์ญํ ์ ํ๋์?
ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์์ **๊ฒ์ ์ฆ๊ฐ ์์ฑ(retrieval-augmented generation, RAG)**์ ๊ฒ์ ๋จ๊ณ๋ฅผ ๋ฐ๊ฟ๋๋ค. RAG์์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ธ์ด ๋ชจ๋ธ์ ๋ต๋ณ ์์ฑ์ ์์ ๊ฒ์ํ ๊ทผ๊ฑฐ ์๋ฃ๋ฅผ ์ ๊ณตํฉ๋๋ค. ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์์ด ์์ฑ ๋จ๊ณ๋ฅผ ๋์ฒดํ๊ฑฐ๋ ๋ต๋ณ์ ์ ํ์ฑ์ ๋ณด์ฅํ์ง๋ ์์ต๋๋ค.
๊ฒ์ ๋จ์๋ ์ผ๊ด๋๊ฒ ์ ์งํฉ๋๋ค. ํค์๋ ๊ฒ์์ ๋ฌธ์ ์ ์ฒด๋ฅผ, ๋ฒกํฐ ๊ฒ์์ ๊ตฌ์ ์ ๋ฐํํ๋ค๋ฉด ์ตํฉ ์ ์ ID์ ๋์ ๊ด๊ณ๋ฅผ ์ ํด์ผ ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๊ฐ์ ์ถ์ฒ์ ์ฌ๋ฌ ๊ตฌ์ ์ด ํ๋ณด ๋ชฉ๋ก์ ์ฐจ์งํ๋ ๋์ ๋ค๋ฅธ ๊ด๋ จ ์ถ์ฒ๊ฐ ๋ฐ๋ ค๋ ์ ์์ต๋๋ค. ์ ์ฅ๊ณผ ๊ฒ์์ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ ๋ฒกํฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํด์ค์์ ๋ค๋ฃน๋๋ค.
์์ด์ ํฑ RAG๋ ์ด๋ค ๊ฒ์ ์์ ์ ํ ์ง, ๋ค์ ๊ฒ์ํ ์ง๋ฅผ ํ๋จํ๋ ๊ณผ์ ์ ์ถ๊ฐํฉ๋๋ค. ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์๊ธฐ๋ ๊ทธ ์์ ์ค ํ๋๊ฐ ๋ ์ ์์ต๋๋ค. ๊ณ ๊ฐ ์ง์ ๋ด์ด ์ ํํ ์ค๋ฅ ์ฝ๋๋ฅผ ๋์น๋ค๋ฉด, ์ค์ผ์คํธ๋ ์ด์ ์ ๋ํ๊ธฐ ์ ์ ๊ฒ์๊ธฐ๋ถํฐ ์์ ํ๊ณ ํ๊ฐํฉ๋๋ค.
๊ฒ์ ๋ฐฉ์์ ๋น๊ตํ๋ ๋์ ์์ฑ ๋ชจ๋ธ๊ณผ ํ๋กฌํํธ๋ ๊ณ ์ ํฉ๋๋ค. ์ ํํ ์ฉ์ด๋ฅผ ํฌํจํ ์ง์ ๊ทธ๋ฃน์ ๊ฒฐ๊ณผ๋ ๋์์ก์ง๋ง ๊ฐ์ ๋ป์ ๋ค๋ฅด๊ฒ ํํํ ์ง์์ ๊ฒ์ ์ฑ๋ฅ์ด ์ฌ์ ํ ๋ฎ๋ค๋ฉด, ๋์ผํ ๋ผ๋ฒจ๋ง ์ง์๋ก ์๋ฒ ๋ฉ ๋ชจ๋ธ์ ๋น๊ตํฉ๋๋ค. ์๋ฒ ๋ฉ, ์ฒญํน, ์ตํฉ์ ๋์์ ๋ฐ๊พธ๋ฉด ๋ฌด์์ด ๊ฒฐ๊ณผ๋ฅผ ๋ฐ๊ฟจ๋์ง ์ ์ ์์ต๋๋ค.
๋์ ์ ํ recall@k๋ก ์ฌํ์จ์ ๋น๊ตํ๋ ๋ฐฉ๋ฒ
๊ด๋ จ ๋ฌธ์๋ฅผ ๋ผ๋ฒจ๋งํ ์๊ท๋ชจ ์ง์ ์ธํธ๋ฅผ ๋ง๋ค๊ณ , ํค์๋ ์ ์ฉยท๋ฒกํฐ ์ ์ฉยทํ์ด๋ธ๋ฆฌ๋ ๊ฒ์์ ๊ฐ์ ์ ๋ต ๊ธฐ์ค์ผ๋ก ๋น๊ตํฉ๋๋ค. ์ ์ฐฝํ๊ฒ ์์ฑ๋ ๋ต๋ณ์ ๊ฒ์ ์ฑ๋ฅ ์งํ๊ฐ ์๋๋๋ค.
Recall@k = ์์ k๊ฐ ๊ฒฐ๊ณผ์์ ์ฐพ์ ๊ด๋ จ ID ์ รท ํด๋น ์ง์์ ๋ํด ๋ผ๋ฒจ๋งํ ์ ์ฒด ๊ด๋ จ ID ์. ์ง์๋ณ ๊ฐ์ ํ๊ท ํ๋ฉด ๋งคํฌ๋ก recall@k๊ฐ ๋ฉ๋๋ค. ๋ผ๋ฒจ์ด ๋ถ์์ ํ๋ค๋ฉด ์ด ๊ฒฐ๊ณผ๋ ์ด๋ฏธ ๊ด๋ จ์ฑ์ ํ์ ํ ํญ๋ชฉ์ ๊ธฐ์ค์ผ๋ก ํ ์ฌํ์จ์ด๋ผ๊ณ ๋ฐํ์ผ ํฉ๋๋ค. ๋ฌธ์ ์งํฉ์ ๋ชจ๋ ๊ด๋ จ ํญ๋ชฉ์ ๋ํ ์ฌํ์จ์ ์ ์ฆํ๋ ๊ฒ์ ์๋๋๋ค.
์์ ์ง์ ์ธํธ๋ถํฐ ๊ตฌ์ฑํฉ๋๋ค
๋ต๋ณ ๊ฐ๋ฅํ ์ง์ 60๊ฐ๋ก ์์ํฉ๋๋ค. ์ ํํ ์ฉ์ด๋ฅผ ํฌํจํ ์ง์ 20๊ฐ, ๊ฐ์ ๋ป์ ๋ค๋ฅด๊ฒ ํํํ ์ง์ 20๊ฐ, ๋ ํน์ฑ์ด ์์ธ ์ง์ 20๊ฐ๋ก ๋๋๋๋ค. ์ด๋ ๊ถ์ฅํ๋ ์์ ๋ถํ ๊ตฌ๋ถ์ด๋ฉฐ, ์ถฉ๋ถํ ํ๋ณธ ํฌ๊ธฐ๋ฅผ ๋ณด์ฅํ์ง๋ ์์ต๋๋ค. ๊ฐ๋ฅํ๋ฉด ์ค์ ๊ฒ์ ๊ธฐ๋ก์์ ๊ฐ์ ธ์ค๊ณ , ํ์ฌ ๊ฒ์์ ์คํจํ๋ ์ด๋ฆ, SKU, ์ค๋ฅ ๋ฌธ์์ด์ ํฌํจํฉ๋๋ค.
๊ฐ ๊ทธ๋ฃน์ ์ ๋ฐ์ ๊ฐ๋ฐ์ฉ์ผ๋ก, ๋๋จธ์ง ์ ๋ฐ์ ๋ณ๋์ ํ๊ฐ์ฉ์ผ๋ก ๋จ๊ฒจ ๋ก๋๋ค. ์๋์ ์ผ๋ก ๋ต๋ณํ ์ ์๊ฒ ๋ง๋ ์ง์ 6๊ฐ๋ ๋ณ๋๋ก ์ถ๊ฐํฉ๋๋ค. ์ด ์ง์๋ค์ ๋์์ ๊ฒํ ํ๋, ๊ด๋ จ ํญ๋ชฉ ์งํฉ์ด ๋น์ด ์์ด ๋ถ๋ชจ๊ฐ ์์ผ๋ฏ๋ก ์ฌํ์จ ๊ณ์ฐ์์๋ ์ ์ธํฉ๋๋ค.
๊ด๋ จ๋ ๊ฒ์ ๋จ์์ ๋ผ๋ฒจ์ ๋ถ์ ๋๋ค
๊ฐ ์ง์์ ID์ ๊ทธ๋ฃน, ๊ด๋ จ์ฑ์ด ํ์ธ๋ ๋ชจ๋ ๋ฌธ์ ๋๋ ๊ตฌ์ ์ ID๋ฅผ ๊ธฐ๋กํฉ๋๋ค. ์ธ ๊ฒ์ ๋ฐฉ์์ด ์ฐพ์ ํ๋ณด๋ฅผ ๋ชจ์ผ๊ณ , ์ด๋ ๋ฐฉ์๋ ์ฐพ์ง ๋ชปํ ์๋ ค์ง ์ ๋ต๋ ์ถ๊ฐํฉ๋๋ค. ์ด๋ค ๋ฐฉ์์ด ํ๋ณด๋ฅผ ๊ฐ์ ธ์๋์ง ๋ณด์ง ์์ ์ํ์์ ๊ด๋ จ์ฑ์ ํ์ ํฉ๋๋ค. ๋ณํ์ง ์๋ ID๋ฅผ ์ฌ์ฉํ๊ณ , ์ฒ์๋ถํฐ ๋๊น์ง ๋ฌธ์ ๋๋ ๊ตฌ์ ์ค ๊ฐ์ ๋จ์๋ฅผ ์ ์งํฉ๋๋ค.
๋น๊ต ์กฐ๊ฑด์ ๊ณ ์ ํฉ๋๋ค
๋ฌธ์ ์งํฉ์ ์ค๋ ์ท, ๊ถํ, ์๋ฒ ๋ฉ ๋ชจ๋ธ, ์ฒญํน์ ๋์ผํ๊ฒ ์ ์งํฉ๋๋ค. ์ต์ข ๊ฒฐ๊ณผ์ k๋ 10, ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์์ ๊ฐ ๊ฒฝ๋ก์์ ๊ฐ์ ธ์ฌ ํ๋ณด๋ 50๊ฐ๋ก ์์ํฉ๋๋ค. ์ด๋ ๊ฒํ ๋ฅผ ์์ํ ์ค์ ์ด์ง ์ต์ ๊ฐ์ด ์๋๋๋ค. ์ฒซ ๋น๊ต์์๋ ๋ฆฌ๋ญํน์ ๋๋๋ค.
๊ฐ ๋ฐฉ์์ ์ต์ข ID ๋ชฉ๋ก์ ์์๋๋ก ๋ด๋ณด๋ ๋๋ค. ์ตํฉ ์ ์ ํค์๋ ํ๋ณด ๋ชฉ๋ก๊ณผ ๋ฒกํฐ ํ๋ณด ๋ชฉ๋ก๋ ์ ์ฅํ๋ฉด, ํ๋ณด ๋๋ฝ ๋ฌธ์ ์ ๋ญํน ๋ฌธ์ ๋ฅผ ๊ตฌ๋ถํ ์ ์์ต๋๋ค.
์ค์ ์ ์กฐ์ ํ ๋ค ๋ณ๋ ํ๊ฐ ์ธํธ๋ก ๊ฒ์ฆํฉ๋๋ค
๊ฐ๋ฐ์ฉ ์ ๋ฐ์์ ์ตํฉ ๋ฐฉ์๊ณผ ํ๋ณด ๊น์ด๋ฅผ ์กฐ์ ํฉ๋๋ค. ์ฌ์ฉํ ์ค์ ์ ์ ํ ๋ค, ๋จ๊ฒจ ๋ ํ๊ฐ์ฉ ์ ๋ฐ์ ํ ๋ฒ ํ๊ฐํฉ๋๋ค. ์ ์ฒด ํ๊ท ๊ณผ ํจ๊ป ๋ชจ๋ ์ง์ ๊ทธ๋ฃน์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ณ ํ๊ณ , ์ฑ๋ฅ์ด ๋๋น ์ง ๊ฐ๋ณ ์ง์๋ฅผ ์ดํด๋ด ๋๋ค. ํ๊ท ์ด ์กฐ๊ธ ๋์์ก๋ค๋ ๊ฒ์ ์ถ๊ฐ๋ก ์ดํด๋ณผ ๊ทผ๊ฑฐ์ผ ๋ฟ, ํต๊ณ์ ์ฆ๋ช ์ ์๋๋๋ค.

๋ก์ปฌ์์ ์ฌํ์จ ํ๊ฐ ์คํฌ๋ฆฝํธ ์คํํ๊ธฐ
๋ค์ ์ฝ๋๋ฅผ evaluate_recall.py๋ก ์ ์ฅํฉ๋๋ค. Python 3 ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ง ์ฌ์ฉํฉ๋๋ค. qrels.jsonl์๋ ์ง์๋ง๋ค qid, slice, relevant ํ๋๋ฅผ ๊ฐ์ง JSON ๊ฐ์ฒด๋ฅผ ํ๋์ฉ ๊ธฐ๋กํฉ๋๋ค. ๊ฐ ๊ฒฐ๊ณผ ํ์ผ์ ์ง์ ID๋ฅผ ๋ฐํ๋ ID์ ์์ ์๋ ๋ชฉ๋ก์ ์ฐ๊ฒฐํฉ๋๋ค.
์๋ฅผ ๋ค์ด ๋ผ๋ฒจ ๋ ์ฝ๋๋ {"qid":"q-exact","slice":"exact","relevant":["guide-login"]}, ๊ฒฐ๊ณผ ํ์ผ์ ๋ด์ฉ์ {"q-exact":["guide-reset","guide-login"]} ํํ์ผ ์ ์์ต๋๋ค. ์ด๋ ํ์ ์์์ด๋ฉฐ, ํ
์คํธํ ์์คํ
์ ๊ฒ์ ๊ฒฐ๊ณผ๊ฐ ์๋๋๋ค. ๋ผ๋ฒจ๋งํ ๋ชจ๋ ์ง์๋ฅผ ๋ชจ๋ ๊ฒฐ๊ณผ ํ์ผ์ ํฌํจํ๊ณ , ๊ฒ์ ๊ฒฐ๊ณผ๊ฐ ์์ผ๋ฉด ๋น ๋ชฉ๋ก์ ์ฌ์ฉํฉ๋๋ค.
import json
import sys
from collections import defaultdict
from statistics import mean
qrels_path, bm25_path, vector_path, hybrid_path, cutoff = sys.argv[1:]
k = int(cutoff)
if k < 1:
raise ValueError("k must be positive")
with open(qrels_path, encoding="utf-8") as f:
labels = [json.loads(line) for line in f if line.strip()]
if not labels or len({r["qid"] for r in labels}) != len(labels):
raise ValueError("Labels must be nonempty with unique query IDs")
runs = {}
for name, path in (("bm25", bm25_path), ("vector", vector_path),
("hybrid", hybrid_path)):
with open(path, encoding="utf-8") as f:
runs[name] = json.load(f)
missing = {r["qid"] for r in labels} - runs[name].keys()
if missing:
raise ValueError(f"{name} is missing query IDs: {sorted(missing)}")
groups = defaultdict(list)
skipped = 0
for row in labels:
relevant = set(row["relevant"])
if not relevant:
skipped += 1
continue
scores = {}
for name, run in runs.items():
unique_ids = list(dict.fromkeys(run[row["qid"]]))
scores[name] = len(relevant & set(unique_ids[:k])) / len(relevant)
groups["overall"].append(scores)
groups["slice:" + row["slice"]].append(scores)
if not groups:
raise ValueError("No answerable queries to score")
for group, rows in sorted(groups.items()):
values = {name: mean(r[name] for r in rows) for name in runs}
delta = values["hybrid"] - values["vector"]
report = " ".join(f"{name}={v:.3f}" for name, v in values.items())
print(f"{group} n={len(rows)} recall@{k} {report} delta={delta:+.3f}")
print(f"Excluded no-answer queries: {skipped}")๋ณ๋๋ก ๋จ๊ฒจ ๋ ํ๊ฐ์ฉ ๋ผ๋ฒจ๊ณผ ๋ด๋ณด๋ธ ๊ฒฐ๊ณผ์ ์คํํฉ๋๋ค.
python3 evaluate_recall.py qrels.jsonl bm25.json vector.json hybrid.json 10์คํฌ๋ฆฝํธ๋ ์ค๋ณต ID๋ฅผ ์ ๊ฑฐํ ๋ค ์์ ๊ฒฐ๊ณผ๋ฅผ ์๋ผ๋ ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ๋์ผํ ์ค๋ณต ์ ๊ฑฐ ์ ์ฑ ์ ์ ์ฉํฉ๋๋ค. ๋ฒกํฐ ๊ฒ์ ๋๋น ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์์ ๋ณํ์ ํค์๋ ๊ฒ์ ๊ธฐ์ค๊ฐ์ ํจ๊ป ๋ณด์ฌ ์ฃผ๋ฏ๋ก, ์ฑ๋ฅ์ด ์ข์ ์ดํ ๊ธฐ๋ฐ ๊ฒ์์ด ๋น๊ต์์ ๋น ์ง์ง ์์ต๋๋ค.
๊ด๋ จ ์ง์ ๊ทธ๋ฃน์ ์ฑ๋ฅ์ด ๊ฐ์ ๋๊ณ , ๋๋น ์ง ๊ฒฐ๊ณผ๋ ์ ํ ์๊ตฌ์ฌํญ์ ํ์ฉํ ์ ์์ ๋ ๋ฐฐํฌํฉ๋๋ค. ํ๋ณด๋ ์ข์์ก๋๋ฐ ์ต์ข ์ฌํ์จ์ด ๊ทธ๋๋ก๋ผ๋ฉด ์ตํฉ ๋ฐฉ์์ด๋ ์ต์ข ๊ฒฐ๊ณผ ์๋ฅผ ์กฐ์ ํฉ๋๋ค. ์ต์ข ์ฌํ์จ์ด ๊ฐ์ ๋๋ค๋ฉด ๊ฒฐ๊ณผ ์์, ์์ฑ๋ ๋ต๋ณ์ ์ ํ์ฑ, ์ข ๋จ ๊ฐ ์ง์ฐ ์๊ฐ์ ๋ณ๋๋ก ๊ฒํ ํฉ๋๋ค. ์ฌํ์จ์ ์ด ํญ๋ชฉ๋ค์ ์ธก์ ํด ์ฃผ์ง ์์ต๋๋ค.
๊ณผ์ฅ๋ ๊ธฐ๋๋ฅผ ๊ฑท์ด๋ด๊ณ ๋ค์ ์์ ์ ์ ํ๊ธฐ
โํ์ด๋ธ๋ฆฌ๋๋ ๋ ๋ฐฉ์์ ์ฅ์ ๋ง ์ทจํ๋คโ๋ ๋ง์ ์ค์ ์์ง๋์ด๋ง ํ๋จ์ ๊ฐ๋ฆฝ๋๋ค. ์ ์ฉํ ์๋ฃ๋ฅผ ๋ ํญ๋๊ฒ ์ฐพ์ ์ ์์ง๋ง, ์ต์ข ๋ชฉ๋ก์ ์ํฅ์ ์ฃผ๋ ๊ฒ์ ๊ฒฝ๋ก๋ ํ๋ ๋์ด๋ฉ๋๋ค. RRF๋ ์ ํํ ์ผ์นํ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ค๋ก ๋ฐ ์ ์์ต๋๋ค. ๊ฐ์ค ์ตํฉ์์๋ ์ ์ ์ฒ๋๋ ์ ๊ทํ ๋์์ ์ฐจ์ด๋ก ํ์ชฝ์ด ์ ๋ฆฌํด์ง ์ ์์ต๋๋ค. ์ด๋ ๋ฐฉ์๋ ๋น ์ง ์๋ฌธ ์๋ฃ๋ฅผ ๋ณต๊ตฌํ์ง๋ ๋ชปํฉ๋๋ค.
๊ฐ๋ฐ์๋ ์ง๊ธ ์ ์ฉ์ ๊ฒํ ํด์ผ ํฉ๋๋ค. ๊ด๋ จ ์๋ ์ ํ ์ฉ์ด ๋ฌธ์๊ฐ ๋ฒกํฐ ํ๋ณด์ ์๋ค๋ ์ฌ์ค์ ํ์ธํ๋ค๋ฉด, ์ดํ ๊ธฐ๋ฐ ๊ฒ์ ๊ฒฝ๋ก๋ฅผ ์ถ๊ฐํฉ๋๋ค. ๋ฌธ์ ์๋ณ ์ฒด๊ณ์ ๊ถํ์ ์ผ๊ด๋๊ฒ ์ ์งํ๊ณ , ๋ผ๋ฒจ๋งํ ์ง์๋ก ๋น๊ตํฉ๋๋ค.
์ด์์๋ ๋ฐฐํฌ๋ฅผ ๋ฏธ๋ค์ผ ํฉ๋๋ค. ํ์ฌ ๋ฌธ์ ๊ฐ ์ค๋๋ ์ฝํ ์ธ , ๊ถํ ๋๋ฝ, ๊ด๋ จ์ฑ ๋ผ๋ฒจ ๋ถ์กฑ์ด๋ผ๋ฉด ์ด๋ฐ ์ ๊ฒฐ ์กฐ๊ฑด๋ถํฐ ํด๊ฒฐํ ๋ค ๊ฒ์ ์ ๋ต์ ๋น๊ตํฉ๋๋ค.
์ ๋ขฐํ ์ ์๋ ์๋ณ์ ์กฐํ๋ฅผ ๊ฐ์ถ ํ์ ๋น์ฅ ๋ฐ๊ฟ ํ์๊ฐ ์์ต๋๋ค. ๋ ํญ๋์ ํ์์ด ํ์ํด์ง ๋๊น์ง ์์ ์ ์ธ ์กฐํ ๊ฒฝ๋ก๋ฅผ ์ ์งํ๊ณ , ์์ฐ์ด ์ง๋ฌธ์ ๋ํด์๋ง ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์์ ๋ณ๋๋ก ํ๊ฐํฉ๋๋ค.
๋ค์ ์ฃผ ์ฒซ ์์ ์ผ๋ก ๊ฒ์์ ์คํจํ ์ง์๋ฅผ ๋ชจ์ผ๊ณ , ๋์์ผ ํ ์ถ์ฒ์ ๋ผ๋ฒจ์ ๋ถ์ธ ๋ค, ๊ธฐ์กด ๋ฒกํฐ ๊ฒ์๊ธฐ์ ํค์๋ ๊ฒ์ ๊ธฐ์ค์ ์ ๋๋ํ ์คํํด ๋ณด์ญ์์ค. ๊ฐ ๊ฒฝ๋ก๊ฐ ๋ฌด์์ ๋ณดํ๋์ง ํ์ธํ ๋ค์ ์ตํฉ์ ์ถ๊ฐํฉ๋๋ค. ๋ฐ๋ก ๋จ๊ฒจ ๋ ํ๊ฐ ์ง์์์ ํจ๊ณผ๋ฅผ ์ ์ฆํ ์ค์ ์ ์ ์งํฉ๋๋ค.
์์ฃผ ๋ฌป๋ ์ง๋ฌธ
BM25 ์์ฒด๊ฐ ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์์ธ๊ฐ์?
์๋๋๋ค. BM25๋ ์ดํ ๊ธฐ๋ฐ ๋ญํน ํจ์์ ๋๋ค. ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฒกํฐ ๊ฒ์ ๊ฒฝ๋ก์ ๊ฒฐ๊ณผ์ ๊ฒฐํฉํ๋ ๊ฒ์ด ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์์ ํ ํํ์ ๋๋ค.
ChatGPT๋ ์๋งจํฑ ๊ฒ์์ ์ฌ์ฉํ๋์?
์์ฑ๋ ๋ต๋ณ๋ง ๋ณด๊ณ ๊ฒ์ ์๊ณ ๋ฆฌ์ฆ์ ํ์ธํ ์๋ ์์ต๋๋ค. ์ธ์ด ๋ชจ๋ธ์ ํ์ฉํด ์ง์ ๊ตฌ์ถํ ์์คํ ์ด๋ผ๋ฉด BM25, ๋ฒกํฐ, RRF๋ฅผ ์ด๋ค๊ณ ์ถ์ธกํ๊ธฐ๋ณด๋ค ์ค์ ๋ก ์ค์ ๋ ๊ฒ์ ๊ฒฝ๋ก๋ฅผ ํ์ธํฉ๋๋ค.
์๋งจํฑ ๊ฒ์์ด๋ ๋ฌด์์ธ๊ฐ์? ์์๋ก ์ค๋ช ํด ์ฃผ์ธ์
โ์๊พธ ๋ก๊ทธ์์๋ฉ๋๋คโ ๊ฐ์ ์ง์๊ฐ ํํ์ด ๋ค๋ฅธ ์ธ์ ๋ง๋ฃ ์๋ด์ ์ฐ๊ฒฐ๋ ์ ์์ต๋๋ค. ์ด๊ฒ์ด ์๋ฏธ ๊ธฐ๋ฐ ๊ฒ์์ ๋๋ค. ์ ํํ ์ค๋ฅ ๋ฌธ์์ด์ ์ฐพ์ผ๋ ค๋ฉด ์ฌ์ ํ ์ดํ ๊ธฐ๋ฐ ๋งค์นญ์ด ํ์ํ ์ ์์ต๋๋ค.
ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์์ ์์๋ฅผ ๋ณผ ์ ์๋์?
ERR_SESSION_EXPIRED after login์ ๋ํด ํค์๋ ๊ฒ์ ๊ฒฝ๋ก๋ ์ค๋ฅ ๋ฌธ์์ด์ด ๊ทธ๋๋ก ์ผ์นํ๋ ์๋ฃ๋ฅผ ์ฐพ๊ณ , ๋ฒกํฐ ๊ฒ์ ๊ฒฝ๋ก๋ ๊ด๋ จ๋ ์ธ์
์๋ด๋ฅผ ์ฐพ์ต๋๋ค. ํ๋ณด๋ฅผ ํฉ์น ๋ค ๊ธฐ๋ํ ์ถ์ฒ๊ฐ ๋์ค๋์ง ๊ด๋ จ์ฑ ๋ผ๋ฒจ๊ณผ ๋์กฐํฉ๋๋ค.
ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์๊ณผ ๋ฒกํฐ ๊ฒ์์ ํต์ฌ ์ฐจ์ด๋ ๋ฌด์์ธ๊ฐ์?
๋ฒกํฐ ๊ฒ์๋ง ์ฌ์ฉํ๋ฉด ์๋ฒ ๋ฉ ์ ์ฌ๋๋ก ์๋ฃ๋ฅผ ์ฐพ์ต๋๋ค. ์ด ๊ธ์์ ์ค๋ช ํ ํ์ด๋ธ๋ฆฌ๋ ๋ฐฉ์์ ํค์๋ ๊ฒฝ๋ก๋ก๋ ๊ฒ์ํ ๋ค, ๋ ๊ฒฝ๋ก์ ๊ทผ๊ฑฐ๋ฅผ ํ๋์ ๊ฒฐ๊ณผ ๋ชฉ๋ก์ ํฉ์นฉ๋๋ค.
ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์๊ณผ ์๋งจํฑ ๊ฒ์์ ๊ฐ์ ๋ป์ธ๊ฐ์?
์๋๋๋ค. ์๋งจํฑ ๊ฒ์์ ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์์ ๊ตฌ์ฑํ๋ ํ ์์๊ฐ ๋ ์ ์์ต๋๋ค. ํ์ด๋ธ๋ฆฌ๋๋ ๊ฒ์ ์ ํธ์ ๊ฒฐํฉ์ ๋ปํ๋ฉฐ, ํน์ ํ ์ตํฉ ์๊ณ ๋ฆฌ์ฆ ํ๋๋ฅผ ๊ฐ๋ฆฌํค์ง๋ ์์ต๋๋ค.
Google Search๋ ์๋งจํฑ ๊ฒ์์ธ๊ฐ์?
Google Search๋ ๋ญํน ์์คํ ์ ์๋ฏธ ์ดํด๋ฅผ ํ์ฉํฉ๋๋ค. Google์ ๋ญํน ์์คํ ๊ฐ์ด๋๋ BERT์ ์ ๊ฒฝ๋ง ๋งค์นญ์ ์ค๋ช ํฉ๋๋ค. ๊ทธ๋ ๋ค๊ณ ์ ์ฒด ๊ตฌ์กฐ๊ฐ ์ด ๊ธ์์ ๋ค๋ฃฌ BM25์ ๋ฒกํฐ์ ๊ฒฐํฉ ๋ฐฉ์์ด๋ผ๋ ๋ป์ ์๋๋๋ค.
RAG์ ์๋งจํฑ ๊ฒ์์ ์ด๋ป๊ฒ ๋ค๋ฅธ๊ฐ์?
RAG๋ ๊ทผ๊ฑฐ ์๋ฃ๋ฅผ ๊ฒ์ํ๊ณ ๋ต๋ณ์ ์์ฑํ ๋ ํ์ฉํฉ๋๋ค. ์๋งจํฑ ๊ฒ์์ ๊ทธ ์๋ฃ๋ฅผ ์ ๊ณตํ ์ ์๋ ๊ฒ์ ๋ฐฉ์์ ๋๋ค. RAG ์ ํ๋ฆฌ์ผ์ด์ ์ ํค์๋ ๊ฒ์์ด๋ ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์์ ์ด๋ค ์๋ฆฌ๋ก ์๋ํ๋์?
์ด ๊ฐ์ด๋์ ๊ตฌ์กฐ์์๋ ๊ฒ์ ๊ฐ๋ฅํ ์ฝํ ์ธ ์ ํค์๋ ๊ฒ์๊ณผ ๋ฒกํฐ ๊ฒ์์ ์คํํ๊ณ , ๋ณํ์ง ์๋ ID๋ฅผ ๊ธฐ์ค์ผ๋ก ํ๋ณด๋ฅผ ํฉ์น ๋ค, RRF๋ ์๋์ ์ผ๋ก ์ค๊ณํ ๊ฐ์ค ์ ์ ๋ฐฉ์์ผ๋ก ์์๋ฅผ ์ ํฉ๋๋ค. ๋ฐฐํฌ ์ ์ ๋ผ๋ฒจ๋งํ ์ง์๋ก ์ต์ข ๊ฒฐ๊ณผ๋ฅผ ํ๊ฐํฉ๋๋ค.
- ๊ฒ์์ผ
- ์นดํ ๊ณ ๋ฆฌ
- Build
- ์ธ์ด










