Vector Search ๋ฒค์น˜๋งˆํฌ (pgvector, elasticsearch, qdrant)

Vector Search๋ฅผ ์•ฝ๊ฐ„ ์‹คํ—˜์ ์œผ๋กœ ๋„์ž…ํ•ด๋ณผ ํ•„์š”๊ฐ€ ์žˆ์—ˆ๋Š”๋ฐ, ๋ฆฌ์†Œ์Šค๋ฅผ ๋Œ€๋žต์ ์œผ๋กœ ์–ผ๋งˆ๋‚˜ ์š”๊ตฌํ•˜๋Š”์ง€, ์„ฑ๋Šฅ์€ ์–ด๋–ค์ง€ ๋“ฑ์„ ํ™•์ธํ•ด๋ณด๋ ค๊ณ  ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ฒค์น˜๋งˆํฌ๋ฅผ ๊ตฌ์„ฑํ•ด์„œ ๋Œ๋ ค๋ดค๋‹ค.

์˜ˆ์ƒ๋˜๋Š” ์ดˆ๊ธฐ ๋ฐ์ดํ„ฐ ํฌ๊ธฐ๋Š” 1000๋งŒ๊ฐœ ์ •๋„.
๋ฒกํ„ฐ์˜ ํฌ๊ธฐ๋Š” 256, dot product๋ฅผ ์‚ฌ์šฉํ•  ์˜ˆ์ •์ด์—ˆ๋‹ค.
์ฒ˜๋ฆฌ ์‹œ๊ฐ„์€ ๋น ๋ฅด๋ฉด ๋น ๋ฅผ์ˆ˜๋ก ์ข‹์ง€๋งŒ, ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„๋งŒ ๋ณด์žฅ๋˜๋”๋ผ๋„ ์ถฉ๋ถ„ํ–ˆ๋‹ค.

์‹œ์Šคํ…œ ๋ฆฌ์†Œ์Šค๋„ ์ ์œผ๋ฉด ์ ์„์ˆ˜๋ก ์ข‹์•˜๋‹ค. ํ™•์‹คํ•œ ์œ ์šฉ์„ฑ์ด ์•„์ง ๊ฒ€์ฆ๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ, ์ผ๋‹จ ๊ฐ€๋ณ๊ฒŒ ์‹œ์ž‘ํ•ด์„œ ๋ฐ์ดํ„ฐ์…‹๊ณผ ์‚ฌ์šฉ๋Ÿ‰์ด ์ฆ๊ฐ€ํ•œ ๋‹ค์Œ์— ๋ณธ๊ฒฉ์ ์œผ๋กœ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ๋„ ๊ฒ€ํ† ํ•ด๋ณผ๋งŒํ–ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋‹จ์ผ ๋…ธ๋“œ์—, ๋ฉ”๋ชจ๋ฆฌ๋Š” 8GB, CPU๋Š” ๋‹จ์ผ์ฝ”์–ด๋กœ ๊ฐ€์ •ํ•˜๊ณ  ์–ผ๋งˆ๋‚˜ ์ž˜ ๋ฒ„ํ‹ฐ๋Š”์ง€๋ฅผ ๊ฒ€์ฆํ–ˆ๋‹ค.

ํ›„๋ณด๋Š” PostgreSQL(pgvector), Elasticsearch ์ •๋„๋‹ค.
milvus ๊ฐ™์€ ์ „๋ฌธ vectordb๋„ ์ƒ๊ฐ์€ ํ•ด๋ดค์ง€๋งŒ, ์ถฉ๋ถ„ํ•œ ์‚ฌ์šฉ๋Ÿ‰์ด ์ƒ๊ธด ๋’ค์— ์˜ฎ๊ฒจ๋„ ๋ฌด๋ฐฉํ•˜๋‹ค๊ณ  ํŒ๋‹จํ–ˆ๋‹ค.

ํ…Œ์ŠคํŠธ์— ์‚ฌ์šฉํ•œ ์ „์ฒด ์†Œ์Šค์ฝ”๋“œ๋Š” ๊นƒํ—™์— ์žˆ๋‹ค.
https://github.com/myyrakle/benchmarks/tree/master/vector_search




๋ฒกํ„ฐ ์ƒ์„ฑ

๋จผ์ € ํ…Œ์ŠคํŠธ์— ์‚ฌ์šฉํ•  ๋ฒกํ„ฐ์—ด 1000๋งŒ๊ฐœ๋ฅผ ์‚ฌ์ „์— ์ƒ์„ฑํ–ˆ๋‹ค.

use rand::Rng;
use std::error::Error;
use std::fs::OpenOptions;
use std::io::{BufWriter, Write};
use std::time::Instant;

const NUM_VECTORS: usize = 10_000_000;
const VECTOR_DIM: usize = 256;
const OUTPUT_FILE: &str = "vectors.txt";

fn main() -> Result<(), Box<dyn Error>> {
    println!(
        "Generating {} vectors of dimension {}...",
        NUM_VECTORS, VECTOR_DIM
    );
    let start_time = Instant::now();

    let file = OpenOptions::new()
        .create(true)
        .write(true)
        .truncate(true)
        .open(OUTPUT_FILE)
        .unwrap();
    let mut writer = BufWriter::new(file);

    let mut randomizer = rand::rng();

    for i in 0..NUM_VECTORS {
        let vector: Vec<f32> = (0..VECTOR_DIM)
            .map(|_| randomizer.random_range(-1.0..1.0))
            .collect();

        let magnitude: f32 = vector.iter().map(|&val| val * val).sum::<f32>().sqrt();

        // ๊ฐ ์š”์†Œ๋ฅผ ํฌ๊ธฐ๋กœ ๋‚˜๋ˆ„์–ด ์ •๊ทœํ™”
        let normalized_vector: Vec<half::f16> = vector
            .iter()
            .map(|&val| half::f16::from_f32(val / magnitude))
            .collect();

        // ๋ฒกํ„ฐ๋ฅผ ๋ฌธ์ž์—ด ๋ ˆ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜
        let record: Vec<String> = normalized_vector
            .iter()
            .map(|&val| val.to_string())
            .collect();

        // ์ง„ํ–‰ ์ƒํ™ฉ ํ‘œ์‹œ (์„ ํƒ ์‚ฌํ•ญ, ์„ฑ๋Šฅ์— ์•ฝ๊ฐ„ ์˜ํ–ฅ ์ค„ ์ˆ˜ ์žˆ์Œ)
        if (i + 1) % 1_000_000 == 0 {
            println!("Generated {} vectors...", i + 1);
        }

        let row_string = record.join(",");

        // ํŒŒ์ผ์— ๋ฒกํ„ฐ ๋ฌธ์ž์—ด์„ append๋กœ ์ €์žฅ
        writer.write_all(row_string.as_bytes())?;
        writer.write_all(b"\n")?;
    }

    let duration = start_time.elapsed();
    println!(
        "Successfully generated and saved {} vectors to {}",
        NUM_VECTORS, OUTPUT_FILE
    );
    println!("Total time taken: {:?}", duration);

    Ok(())
}

๋ฝ‘์œผ๋‹ˆ๊นŒ 7๊ธฐ๊ฐ€ ์ •๋„์˜ ํ…์ŠคํŠธ๊ฐ€ ๋‚˜์™”๋‹ค.




DB ์„ค์ •

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” pgvector(hnsw์šฉ), pgvector(ivfflat์šฉ), elasticsearch ์ •๋„๋งŒ ๊ณ ๋ คํ–ˆ๋‹ค.

๋„์ปค ์ปจํ…Œ์ด๋„ˆ ๊ธฐ๋ฐ˜์œผ๋กœ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์„ ๊ตฌ์„ฑํ–ˆ๋‹ค.

services:
  pgvector-IVFFlat:
    image: pgvector/pgvector:0.8.0-pg17
    container_name: pgvector-ivfflat
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=q1w2e3r4
      - POSTGRES_DB=postgres
    ports:
      - "15432:5432"
    volumes:
      - pg-IVFFlat:/var/lib/postgresql/data
    deploy:
      resources:
        limits:
          cpus: "1"
          memory: 8096M

  pgvector-HNSW:
    image: pgvector/pgvector:0.8.0-pg17
    container_name: pgvector-hnsw
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=q1w2e3r4
      - POSTGRES_DB=postgres
    ports:
      - "15433:5432"
    volumes:
      - pg-HNSW:/var/lib/postgresql/data
    deploy:
      resources:
        limits:
          cpus: "1"
          memory: 8096M

volumes:
  esdata:
    driver: local
  pg-IVFFlat:
    driver: local
  pg-HNSW:
    driver: local




๋ฐ์ดํ„ฐ ์ดˆ๊ธฐํ™”

์ธ๋ฑ์Šค๋ฅผ ์ „๋ถ€ ๊ตฌ์„ฑํ•ด๋†“์€ ์ƒํƒœ์—์„œ ๋งŒ๋“ค์–ด๋’€๋˜ ๋ฒกํ„ฐ 1000๋งŒ๊ฐœ๋ฅผ ๋ฐ€์–ด๋„ฃ์—ˆ๋‹ค.

๋‹จ์ˆœ์„ฑ์„ ์œ„ํ•ด ์ˆœ์ง„ํ•˜๊ฒŒ ํ•˜๋‚˜์”ฉ ์ˆœ์„œ๋Œ€๋กœ ๋„ฃ๋Š” ๋ฐฉ์‹์„ ์ทจํ–ˆ๋‹ค.

๊ทธ๋ ‡๊ฒŒ ํ–ˆ์„๋•Œ

pgvector(IVFFLAT)๋Š” 9์‹œ๊ฐ„ ์ •๋„ ๊ฑธ๋ ธ๊ณ 

pgvector(hnsw)๋Š” ํŠนํžˆ๋‚˜ ์˜ค๋ž˜ ๊ฑธ๋ ธ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ๋ณ‘๋ชฉ์— ๊ฑธ๋ฆฐ๊ฑด์ง€ ๋ญ”์ง€๋Š” ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค.

ํ™•์‹คํ•œ๊ฑด ์ „๋ฐ˜์ ์ธ ๋ฆฌ์†Œ์Šค ์†Œ๋ชจ๋Ÿ‰์ด ์••๋„์ ์œผ๋กœ ๋งŽ์•˜๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๋””์Šคํฌ I/O๋„ ๋ฌด์Šจ ํ…Œ๋ผ๊ธ‰์œผ๋กœ ์†Œ๋ชจํ–ˆ๋‹ค.


pgvector(hnsw)๋Š” 3์ผ ์ •๋„ ๊ฑธ๋ ธ๋‹ค.


elasticsearch๋Š” 25์‹œ๊ฐ„์ด ๊ฑธ๋ ธ๋‹ค.


ํ‰์ƒ์‹œ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰์€ ๋Œ€๋žต ์ด๋ ‡๋‹ค.
ivfflat์ด ์œ ๋… ๋ฆฌ์†Œ์Šค๋ฅผ ์ ๊ฒŒ ๋จน๋Š” ํŽธ์ด๊ธด ํ•˜๋”๋ผ.


qdrant๋Š” ์‚ฝ์ž… ์†๋„๋Š” ์ค€์ˆ˜ํ•˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰๋„ ๋‚ฎ์•˜๋Š”๋ฐ, ๊ฐ€๋” CPU๊ฐ€ ํ›… ์น˜๊ณ  yellow๊ฐ€ ๋œจ๋Š” ๊ตฌ๊ฐ„์ด ์žˆ์—ˆ๋‹ค. ๋ญ”๊ฐ€ ๋ชจ์•„์„œ ํ•œ๋ฒˆ์— ๋””์Šคํฌ์— ์••์ถ•ํ•˜๊ฑฐ๋‚˜ ํ•˜๋Š” ํŒจํ„ด์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™๋‹ค.




๋‹ค๋งŒ

์‹ค์ œ ์‘์šฉ ํ™˜๊ฒฝ์—์„œ๋Š” ์ดˆ๊ธฐํ™”์— ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์ด ์ด์™€๋Š” ํฌ๊ฒŒ ๋‹ค๋ฅผ ๊ฒƒ์ด๋‹ค.

์ผ๋‹จ ๋ฒกํ„ฐ ์ž„๋ฒ ๋”ฉ์„ ๋ชจ๋ธ๋กœ๋ถ€ํ„ฐ ๋ฐ›์•„์˜ค๋Š” ๋”œ๋ ˆ์ด๊ฐ€ ์กด์žฌํ•  ๊ฒƒ์ด๋‹ค. ์ด๊ฑด ๋А๋ ค์งˆ ์ˆ˜ ์žˆ๋Š” ์š”์ธ์ด๋‹ค.

๋ณดํ†ต์˜ DB ํ™˜๊ฒฝ์—์„œ๋Š” ์ด๋ณด๋‹ค ๋ฆฌ์†Œ์Šค๊ฐ€ ๋„‰๋„‰ํ•  ๊ฒƒ์ด๋‹ค. ๋‚˜๋Š” 1cpu๋กœ ๋นก์„ธ๊ฒŒ ๊ฑธ์–ด๋†”์„œ ์Šค๋กœํ‹€๋ง์ด ๊ณผํ•˜๊ฒŒ ๊ฑธ๋ ธ์„ ๊ฒƒ์ด๋‹ค. ๋ณดํ†ต ๋ฉ”๋ชจ๋ฆฌ๋ฅผ 8 ์žก์œผ๋ฉด ์ฝ”์–ด๋Š” 2~4๊ฐœ์ฏค ๋„ฃ๋Š”๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€์‹œ์—๋„ batch ๋‹จ์œ„๋กœ ๋ชจ์•„์„œ insert๋ฅผ ํ•˜๋ฉด ์ฒ˜๋ฆฌ์‹œ๊ฐ„์„ ์ข€ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.

(pgvector์˜ ๊ฒฝ์šฐ) ์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“ค๊ธฐ ์ „์— ๋ฒกํ„ฐ๋ฅผ ๋ฐ€์–ด๋„ฃ๊ณ , ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” ์ƒํƒœ์—์„œ ์ธ๋ฑ์Šค๋ฅผ ํ•œ๋ฒˆ์— ์ƒ์„ฑํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์›Œ์ปค ๋ฉ”๋ชจ๋ฆฌ ์ถฉ๋ถ„ํžˆ ์ฃผ๊ณ  ๋Œ๋ฆฌ๋ฉด ์ด๋ณด๋‹ค๋Š” ๋นจ๋ฆฌ ๋  ๊ฒƒ์ด๋‹ค.


์ž, ๊ทธ๋Ÿผ ์ค€๋น„๊ฐ€ ๋์œผ๋‹ˆ ๋ฒค์น˜๋ฅผ ์ ๋‹นํžˆ ์ฐ”๋Ÿฌ๋ณด๊ฒ ๋‹ค.




๋””์Šคํฌ ์‚ฌ์šฉ๋Ÿ‰

๋””์Šคํฌ ์‚ฌ์šฉ๋Ÿ‰์€ DB๋ณ„๋กœ ์ฐจ์ด๊ฐ€ ์ข€ ๋‚˜๊ธด ํ–ˆ๋‹ค.

elasticsearch๊ฐ€ ๊ฐ€์žฅ ๋งŽ์€ ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ–ˆ๊ณ 


qdrant๊ฐ€ ๊ทธ๋ž˜๋„ ๋ฒกํ„ฐ ์ „๋ฌธ์ด๋ผ๊ณ  ๊ฐ€์žฅ ์ปดํŒฉํŠธํ•˜๊ฒŒ ์ผ๋‹ค.




pgvector(IVFFLAT) ๋ฒค์น˜๋งˆํฌ

๋กœ์ง์— ๋ณ„๋กœ ํŠน๋ณ„ํ•œ ๋ถ€๋ถ„์€ ์—†๋‹ค.

์ฟผ๋ฆฌ๋Š” 100๋ฒˆ ์ •๋„๋งŒ ์ฐ”๋Ÿฌ๋ณด๊ฒŒ ํ–ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๋™์‹œ์ฒ˜๋ฆฌ ํƒœ์Šคํฌ๋А 16๊ฐœ ์ •๋„๋งŒ ์žก์•˜๋‹ค.


๊ฐ€์ ธ์˜ฌ ๋ฐ์ดํ„ฐ๋Š” 10๊ฐœ๋กœ ์žก์•˜๋‹ค.


์ตœ๋Œ€ ๋ ˆ์ดํ„ด์‹œ๊ฐ€ 300ms ์ •๋„๊นŒ์ง€ ๋‚˜์™€์„œ์—„์ฒญ ๋น ๋ฅด๋‹ค๊ณ  ํ•  ์ •๋„๋Š” ์•„๋‹ˆ์—ˆ์ง€๋งŒ, ํ‰๊ท  ์ฒ˜๋ฆฌ์†๋„๋Š” ํฌ๊ฒŒ ๋‚˜์˜์ง€ ์•Š์•˜๋‹ค.

DB์ธก์˜ CPU ๋ฆฌ์†Œ์Šค ์••๋ฐ•์€ ์•ฝ๊ฐ„ ์žˆ์—ˆ๋‹ค.




pgvector(HNSW) ๋ฒค์น˜๋งˆํฌ

hnsw๋Š” ๊ฝค๋‚˜ ๋น ๋ฅด๊ณ  ์•ˆ์ •์ ์ด์—ˆ๋‹ค.

ํ™•์‹คํžˆ ๋ ˆ์ดํ„ด์‹œ๊ฐ€ lvfflat์— ๋น„ํ•ด์„œ ์งง๊ณ  ์•ˆ์ •์ ์ด์—ˆ๋‹ค.




elasticsearch ๋ฒค์น˜๋งˆํฌ

elasticsearch๋„ ๋น„์Šทํ•˜๊ฒŒ ๊ตฌ์„ฑํ•ด์„œ ๋ฒค์น˜๋ฅผ ๋•Œ๋ ธ๋‹ค.

์ƒ๊ฐํ–ˆ๋˜ ๊ฒƒ ๋ณด๋‹ค๋Š” ๋ ˆ์ดํ„ด์‹œ๊ฐ€ ์ €์กฐํ–ˆ๋‹ค.

์ƒค๋“œ๋ฅผ ๋‚˜๋ˆ„๊ณ , ์ •ํ™•๋„๋ฅผ ๋‚ฎ์ถ”๊ณ , ์„ฑ๋Šฅ์„ ๋†’์ด๊ฒŒ๋” ์˜ต์…˜์„ ์กฐ์ •ํ•˜๋ฉด ์„ฑ๋Šฅ์ด ๋” ๋‚˜์˜ค๊ฒ ์ง€๋งŒ, ์ผ๋‹จ์€ ์—ฌ๊ธฐ์„œ ๊ธฐ๋ณธ์ ์ธ ๋‹จ์ผ๋…ธ๋“œ ํ…Œ์ŠคํŠธ๋กœ ๋งˆ๋ฌด๋ฆฌํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.




qdrant ๋ฒค์น˜๋งˆํฌ

qdrant๋Š” ์ „์šฉ VectorDB์ธ ๊ฒƒ์— ๋น„ํ•ด ํ‰๊ท  ์ฒ˜๋ฆฌ๋Ÿ‰์€ ์ƒ๊ฐ๋ณด๋‹ค ๊ทธ๋ฆฌ ๋น ๋ฅด์ง€๋Š” ์•Š์•˜๋‹ค.

3์ž๋ฆฌ ๋ฐ€๋ฆฌ์ดˆ ์ •๋„๋กœ ์ฒ˜๋ฆฌ๊ฐ€ ๋˜์—ˆ๋‹ค.


๊ทธ๋ฆฌ๊ณ  ๋Œ๋•Œ CPU ๋ฆฌ์†Œ์Šค๋ฅผ ์กฐ๊ธˆ ๋จน๊ธด ํ–ˆ๋‹ค.

์ด๊ฒƒ๋„ ํšจ์œจ์ ์œผ๋กœ ์“ฐ๋ ค๋ฉด ์˜ต์…˜ ์กฐ์ •์ด ํ•„์š”ํ•  ๊ฒƒ ๊ฐ™๋‹ค.




์ •๋ฆฌ

ํŠน์ดํ•˜๊ฒŒ๋„ ๋ ˆ์ดํ„ด์‹œ๋งŒ ๋ณด์ž๋ฉด pgvector-hnsw๊ฐ€ ๊ฝค๋‚˜ ๋นจ๋ž๋‹ค. elasticsearch์™€ qdrant ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” ๋ญ”๊ฐ€ ๋ฆฌ์†Œ์Šค ์š”๊ตฌ๋Ÿ‰์ด ๋” ๋งŽ์•„์„œ์ธ์ง€ ๋ชจ๋ฅด๊ฒ ๋Š”๋ฐ, ์ด ์ •๋„ ๊ฐ๋ฐ•ํ•œ ์‚ฌ์–‘์—์„œ๋Š” ์•„์ฃผ ๊ทธ๋ ‡๊ฒŒ ๋น ๋ฅด์ง€๋Š” ๋ชปํ–ˆ๋‹ค.

๋‹ค๋งŒ qdrant๊ฐ€ ๋ ˆ์ดํ„ด์‹œ๋ณด๋‹ค๋Š” ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์— ์žˆ์–ด์„œ ์žฅ์ ์ด ๋‘๋“œ๋Ÿฌ์ง„ ๊ฒƒ ๊ฐ™๋‹ค. 1000๋งŒ๊ฐœ ๋„ฃ์—ˆ๋Š”๋ฐ๋„ ํ‰์ƒ์‹œ ๋ฉ”๋ชจ๋ฆฌ ์ ์œ ์œจ์ด 1๊ธฐ๊ฐ€ ์กฐ๊ธˆ ๋„˜๋Š” ์ˆ˜์ค€์ด๋”๋ผ. ๋‹ค๋ฅธ DB๋“ค์€ ํ‰์ƒ์‹œ์—๋„ ๋ฉ”๋ชจ๋ฆฌ์˜ ๋Œ€๋ถ€๋ถ„์„ ์ผ๋Š”๋ฐ, ๋ฆฌ์†Œ์Šค ํšจ์œจ์„ฑ ์ž์ฒด๋Š” ์••๋„์ ์ด์—ˆ๋‹ค.

์ถ”๊ฐ€ DB ๊ตฌ์„ฑ์„ ๋ฐ˜๊ธฐ์ง€ ์•Š๋Š”๋‹ค๋ฉด pgvector-ivfflat๋„ ๊ฝค๋‚˜ ์“ธ๋งŒํ•œ๊ฑฐ๊ฐ™๋‹ค. ๋ฐ์ดํ„ฐ ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ๋•Œ ์˜ต์…˜์„ ์กฐ์ •ํ•˜๋Š”๊ฒŒ ๊นŒ๋‹ค๋กญ๊ณ , ๋ ˆ์ดํ„ด์‹œ๊ฐ€ ์กฐ๊ธˆ ํŠ€๋‹ค๋Š” ๋‹จ์ ์€ ์žˆ๋‹ค.

์ดˆ๊ธฐ๋ฒ„์ „์—์„œ "์‚ฌ์ „ ํ•„ํ„ฐ๋ง" ๊ฐ™์€ ๊ณ ๊ธ‰๊ธฐ๋Šฅ์ด ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๋ฉด pgvector๋„ ๊ณ ๋ คํ•ด๋ณผ๋งŒํ•œ ๊ฒƒ ๊ฐ™๋‹ค.
๊ธฐ์กด์— ๊ฒ€์ƒ‰์—”์ง„์œผ๋กœ elasticsearch๋ฅผ ์“ฐ๋˜ ์ƒํ™ฉ์ด๋ฉด elasticsearch ๋˜ํ•œ ๊ณ ๋ คํ•ด๋ด„์งํ•˜๋‹ค.

ํ•˜์ง€๋งŒ ๋‘˜๋‹ค ์“ฐ์ง€ ์•Š์•˜๊ฑฐ๋‚˜, ์ •๋ง ์ˆ˜์ฒœ๋งŒ์„ ๋„˜์–ด๊ฐ€๋Š” ๋ฐ์ดํ„ฐ์…‹์„ ์ ์€ ๋ฆฌ์†Œ์Šค๋กœ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด qdrant๊ฐ€ ์ข‹์€ ์„ ํƒ์ผ ๊ฒƒ ๊ฐ™๊ธด ํ•˜๋‹ค.



์ฐธ์กฐ
https://blog.naver.com/sssang97/223839344102
https://blog.naver.com/sssang97/223802994977