[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