[Qdrant] prefetch: Score boosting
๋ฒกํฐ ๊ฒ์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๋ ฌ ๊ธฐ๋ฐ์ ๊ฒ์์ด๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ณธ์ง์ ์ผ๋ก ๊ฒ์์ ๋ํด ์ฐ์ ์์ ๊ธฐ๋ฐ์ ์ ๋ ฌ์ ๋ง๋๊ธฐ๊ฐ ์ด๋ ค์ด ๋ถ๋ถ์ด ์กด์ฌํ๋ค.
๊ทธ๋ผ์๋ ๋ถ๋ช ์ ๋ ฌ์ ๊ธฐ๋ฐํ ํํฐ๊ฐ ํ์ํ ๋น์ฆ๋์ค ์์ค ์๊ตฌ์ฌํญ์ ์์ ์ ์๊ณ , Qdrant๋ ๊ทธ๋ฅผ ์ํ ์ปค์คํ ์ ๋ ฌ ๊ธฐ๋ฅ๋ ์ ๊ณตํ๋ค.
https://qdrant.tech/articles/vector-search-resource-optimization/
๋์ ๋ฐฉ์ ์์ฒด๋ ์ง๊ด์ ์ด๋ค. prefetch๋ผ๊ณ ํ๋ ์ ์ฒ๋ฆฌ ์ฟผ๋ฆฌ๋ฅผ ๋จผ์ ์คํํด์ ์ค์บํ ๋ค์์, ๋ฉ์ธ ์ฟผ๋ฆฌ๋ก ํ์ฒ๋ฆฌ๋ฅผ ํ๋ ์์ผ๋ก ๋์ํ๋ค.
ํ์ด๋ก๋ ๊ฐ์ ๊ธฐ์ค์ผ๋ก score๋ฅผ ๋ถ์ฌํ๋ค๋ฉด, ํ์ด๋ก๋ ์ธ๋ฑ์ค๋ฅผ ํ์ฉํ ์ฌ์ง๊ฐ ์๋ค.
๋ฐ์ดํฐ ์ธํ
๋์ ํ์ธ์ ์ํด์ ์ ๋นํ ์ฐ๊ฒจ๋ฃ์ด๋ณด๊ฒ ๋ค.
PUT /collections/products
{
"vectors": {
"size": 4,
"distance": "Dot"
}
}PUT /collections/products/points
{
"points": [
{
"id": 1,
"payload": {
"color": "blue",
"price": 10000
},
"vector": [1,1,1,1]
},
{
"id": 2,
"payload": {
"color": "red",
"price": 5000
},
"vector": [1,2,1,1]
},
{
"id": 3,
"payload": {
"color": "blue",
"price": 20000
},
"vector": [1,1,2,2]
},
{
"id": 4,
"payload": {
"color": "yellow",
"price": 4000
},
"vector": [1,2,3,1]
},
{
"id": 5,
"payload": {
"color": "blue",
"price": 4500
},
"vector": [1,1,1,1]
},
{
"id": 6,
"payload": {
"color": "black",
"price": 15000
},
"vector": [1,1,1,1]
},
{
"id": 7,
"payload": {
"color": "white",
"price": 2000
},
"vector": [1,1,1,1]
},
]
}
์ง์ด๋ฃ๊ณ
์ฟผ๋ฆฌ๋ฅผ ๋ ๋ ค๋ณด๋ฉด
POST /collections/products/points/query
{
"query": [2,2,2,2],
"with_vector": true,
"with_payload": true
}
qdrant๋ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ง๋ค ๋ฒกํฐ ๊ฒ์์ ์ ์ฌ๋ ์ ์, score๋ผ๋ ๊ฒ์ ๋ด๋ ค์ค๋ค.
๋ฒกํฐ๋ง๋ค ๋ค ๋น๊ตํด์ ์ ์ฌ๋๋ฅผ ๋งค๊ธฐ๊ณ , ์ ์ฌ๋๊ฐ ๋์ ์์ผ๋ก ๋ฟ๋ ค์ฃผ๋ ํํ์ธ ๊ฒ์ด๋ค.
์ ๊ธฐ์ ์ฐ๋ฆฌ๊ฐ ํ ๊ฒ์, ์ score์ ๋ค๋ฅธ custom store๋ฅผ ๋ถ์ฌํ๋ ๊ฒ์ด๋ค.
prefetch ์ ์ ์ฌ์ฉํ๊ณ , ํ์ formula ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ฉด ์ต์ข
score๊ฐ ์ง๊ณ๋๋ ๋ฐฉ์์ ์ง์ ํ ์ ์๋ค.
์๋ฅผ ๋ค์ด, ๋ค์ ์ฟผ๋ฆฌ๋ color๊ฐ yellow๋ red์ธ ๊ฐ์ ๋ํด์ score 10์ ์ ๋ํด์ค๋ค.
POST /collections/products/points/query
{
"prefetch": {
"query": [
2,
2,
2,
2
]
},
"query": {
"formula": {
"sum": [
"$score",
{
"mult": [
10,
{
"key": "color",
"match": {
"any": ["yellow", "red"]
}
}
]
}
]
}
},
"with_vector": true,
"with_payload": true
}
๋๋ ค๋ณด๋ฉด, ์ค์ ๋ก 10์ ์ ๋ํด์ red์ yellow๊ฐ ์์ ๊ฒฐ๊ณผ๋ก ๋์ค๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์ ๊ธฐ์ mult๋ ๊ณฑ์
์์ด๊ณ , ์กฐ๊ฑด์ ์ ์ผ์นํ๋ฉด 1 ๊ฐ์ ๋ฐํํ๋ค. ๊ทธ๋์ 10*1์ ์ด ๋ํด์ง ๊ฒ์ด๋ค.
๊ทธ ์ด์ธ์ ์กฐ๊ฑด์ ๊ฑฐ๋ ๋ถ๋ถ๋ค์ payload ํํฐ ์ฌ์ฉ๋ฒ๊ณผ ๋๋ฑํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๊ฒ๋ payload index๋ฅผ ๊ฑฐ๋ ๊ฒ์ด ์ข๋ค. ์ธ๋ฑ์ค๋ฅผ ํ์ฉํ ์ ์๋ค.
์ฐธ์กฐ
https://qdrant.tech/documentation/concepts/hybrid-queries/#score-boosting
https://api.qdrant.tech/v-1-14-x/api-reference/search/query-points