pgvector๋?
1. pgvector ์ ์
`pgvector`๋ PostgreSQL์์ ๋ฒกํฐ ๋ฐ์ดํฐ(์: ์๋ฒ ๋ฉ)๋ฅผ ํจ์จ์ ์ผ๋ก ์ ์ฅํ๊ณ ๊ฒ์ํ ์ ์๋๋ก ๋์์ฃผ๋ ํ์ฅ(extension)์ด๋ค.
ํนํ, ๋จธ์ ๋ฌ๋๊ณผ AI ๊ด๋ จ ์ ํ๋ฆฌ์ผ์ด์
์์ ์ ์ฌํ ๋ฐ์ดํฐ๋ฅผ ๋น ๋ฅด๊ฒ ์ฐพ๋ ์ต๊ทผ์ ์ด์ ๊ฒ์(Nearest Neighbor Search, NNS)์
๋ง์ด ์ฌ์ฉ๋๋ค.
2. pgvector์ ์ฃผ์ ๊ธฐ๋ฅ
๋ฒกํฐ ๋ฐ์ดํฐ ์ ์ฅ
- `pgvector`๋ `vector` ํ์ ์ ์ ๊ณตํ์ฌ ๋ฒกํฐ ๋ฐ์ดํฐ๋ฅผ ์ง์ ์ ์ฅํ ์ ์์
- ์: `vector(1536)` → OpenAI์ `text-embedding-ada-002` ๋ชจ๋ธ์์ ์์ฑํ 1536์ฐจ์์ ๋ฒกํฐ๋ฅผ ์ ์ฅ ๊ฐ๋ฅ
์ ์ฌ๋ ๊ฒ์(Nearest Neighbor Search, NNS)
- ๊ฑฐ๋ฆฌ ๊ณ์ฐ์ ๊ธฐ๋ฐ์ผ๋ก ํ ์ ์ฌํ ๋ฒกํฐ ๊ฒ์ ์ง์
- ์ง์ํ๋ ๊ฑฐ๋ฆฌ ๋ฉํธ๋ฆญ:
- `L2 distance (Euclidean distance, <->)`
- `cosine distance ( <=>)`
- `inner product distance ( <#>)`
ํจ์จ์ ์ธ ๊ฒ์ ์ธ๋ฑ์ค
- `IVFFlat (Inverted File with Flat Search)` ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ฌ ๋๋์ ๋ฒกํฐ ๊ฒ์ ์๋ ํฅ์
- `HNSW (Hierarchical Navigable Small World)` ์ธ๋ฑ์ค๋ ์ง์(์ต๊ทผ ์ถ๊ฐ๋จ)
3. pgvector ์ค์น ๋ฐ ์ฌ์ฉ๋ฒ
1๏ธโฃ ํ์ฅ ์ค์น
CREATE EXTENSION IF NOT EXISTS vector;
2๏ธโฃ ํ ์ด๋ธ ์์ฑ (์: 3์ฐจ์ ๋ฒกํฐ ์ ์ฅ)
CREATE TABLE items ( id SERIAL PRIMARY KEY, embedding vector(3) );
3๏ธโฃ ๋ฐ์ดํฐ ์ฝ์
INSERT INTO items (embedding) VALUES ('[1,2,3]'), ('[4,5,6]'), ('[7,8,9]');
4๏ธโฃ ์ ์ฌ๋ ๊ฒ์
- `L2 ๊ฑฐ๋ฆฌ(์ ํด๋ฆฌ๋ ๊ฑฐ๋ฆฌ)` ๊ธฐ๋ฐ ๊ฒ์
SELECT *, embedding <-> '[1,2,3]' AS distance FROM items ORDER BY distance LIMIT 5;
- `์ฝ์ฌ์ธ ์ ์ฌ๋` ๊ธฐ๋ฐ ๊ฒ์
SELECT *, embedding <=> '[1,2,3]' AS distance FROM items ORDER BY distance LIMIT 5;
4. IVFFlat ์ธ๋ฑ์ค ์์ฑ (๋น ๋ฅธ ๊ฒ์)
๋๋์ ๋ฒกํฐ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๊ฒฝ์ฐ, `IVFFlat` ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๋ฉด ์๋๋ฅผ ํฌ๊ฒ ํฅ์ํ ์ ์์
CREATE INDEX ON items USING ivfflat (embedding vector_l2_ops) WITH (lists = 100);
- `lists = 100`: ๋ฒกํฐ๋ฅผ 100๊ฐ์ ํด๋ฌ์คํฐ๋ก ๋๋(ํ๋ ๊ฐ๋ฅ)
5. pgvector ํ์ฉ ์์
- AI ์ถ์ฒ ์์คํ : ์ ์ฌํ ์ ์ /์ํ ์ถ์ฒ (์: ๋ฐ์ดํธ์ฝ์ค ์ถ์ฒ, ์ฌํ์ง ์ถ์ฒ)
- ์์ฐ์ด ์ฒ๋ฆฌ(NLP): ๋ฌธ์ ๊ฒ์, ์ฑ๋ด ์๋ต ์์ฑ
- ์ด๋ฏธ์ง ๊ฒ์: ๋น์ทํ ์ด๋ฏธ์ง ์ฐพ๊ธฐ
- ์์ฑ ๋ถ์: ์ ์ฌํ ์์ฑ ํจํด ๊ฒ์
6. pgvector vs ๋ค๋ฅธ ๋ฒกํฐ DB ๋น๊ต
๋น๊ต ํญ๋ชฉ | `pgvector` | `FAISS` | `Milvus` |
๊ธฐ๋ฐ DB | PostgreSQL | ๋ ๋ฆฝํ | ๋ ๋ฆฝํ |
ํ์ฅ์ฑ | ๋ฎ์ | ๋์ | ๋์ |
์ธ๋ฑ์ค | IVFFlat, HNSW | IVF, HNSW | IVF, HNSW |
ํธ๋์ญ์ ์ง์ | โ | โ | โ |
SQL ์ง์ | โ | โ | ์ผ๋ถ |
์ ์ฌ๋ ๊ฒ์ ์๋ | ๋๋ฆผ | ๋น ๋ฆ | ๋น ๋ฆ |
- pgvector๋ PostgreSQL์ ๊ทธ๋๋ก ํ์ฉํ๋ฉด์ ๋ฒกํฐ ๊ฒ์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ๊ฒ์ด ์ฅ์
- ๋ฐ๋ฉด, FAISS๋ Milvus ๊ฐ์ ์ ๋ฌธ ๋ฒกํฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋นํด ๊ฒ์ ์๋๋ ๋๋ฆด ์ ์์
7. pgvector์ ์ฌํ ์ผ์ ์ถ์ฒ ์์คํ
๐ ์ฌ์ฉ์๊ฐ ๊ณํ ์ค์ธ AI ๊ธฐ๋ฐ ์ฌํ ์ผ์ ์ถ์ฒ ์ฑ๋ด์์ `pgvector` ํ์ฉ ๊ฐ๋ฅ์ฑ
โ ๊ตฌ๊ธ API๋ฅผ ์ด์ฉํด ์ฅ์ ์ ๋ณด๋ฅผ ๋ฒกํฐํํ๊ณ , ์ด๋ฅผ `pgvector`์ ์ ์ฅํ๋ฉด ์ ์ฌํ ์ฅ์ ๊ฒ์ ๊ฐ๋ฅ
โ ์๋ฅผ ๋ค์ด, ์ฌ์ฉ์๊ฐ ์ ํธํ๋ ์ฌํ์ง ์๋ฒ ๋ฉ์ ๊ธฐ๋ฐ์ผ๋ก ๋น์ทํ ๋ถ์๊ธฐ์ ์ฅ์ ์ถ์ฒ ๊ฐ๋ฅ
์์ ๊ตฌ์กฐ
- `txt_folder`์ ์ ์ฅ๋ ์ฅ์ ์ ๋ณด๋ฅผ ๋ฒกํฐ ์๋ฒ ๋ฉ์ผ๋ก ๋ณํ (`OpenAI embeddings API` ๋ฑ ํ์ฉ)
- `pgvector`์ ์ ์ฅ ํ, ์ฝ์ฌ์ธ ์ ์ฌ๋๋ฅผ ์ด์ฉํด ์ ์ฌ ์ฅ์ ์ถ์ฒ
8. ๊ฒฐ๋ก
`pgvector`๋ PostgreSQL ํ๊ฒฝ์์ AI ๊ธฐ๋ฐ ์ถ์ฒ ์์คํ ์ ๋ง๋ค ๋ ๋งค์ฐ ์ ์ฉํ ๋๊ตฌ์ด๋ค~
- PostgreSQL์ ๊ทธ๋๋ก ์ฌ์ฉํ๋ฉด์ ๋ฒกํฐ ๋ฐ์ดํฐ ์ ์ฅ & ๊ฒ์ ๊ฐ๋ฅ
- ์ฌํ ์ถ์ฒ, ๊ฒ์, NLP, ์ด๋ฏธ์ง ๋ถ์ ๋ฑ ๋ค์ํ ๋ถ์ผ์ ์ ์ฉ ๊ฐ๋ฅ
- `IVFFlat` ์ธ๋ฑ์ค๋ฅผ ํ์ฉํ๋ฉด ๋๋ ๋ฐ์ดํฐ์์๋ ์ฑ๋ฅ ํฅ์ ๊ฐ๋ฅ
'Data Base ๐๏ธ > SQL ๐๏ธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[241114] ์์ ๋ณด๋ค ์ฝ๊ณ ๋น ๋ฅธ SQL 4์ฃผ-5~7 ๊ฐ์ (4) | 2024.11.14 |
---|---|
[241113] ์์ ๋ณด๋ค ์ฝ๊ณ ๋น ๋ฅธ SQL 4์ฃผ์ฐจ-1~4 ๊ฐ์ (2) | 2024.11.13 |
[241112] ์์ ๋ณด๋ค ์ฝ๊ณ ๋น ๋ฅธ SQL 3์ฃผ์ฐจ-4~7 ๊ฐ์ ๋ฐ ์์ (4) | 2024.11.12 |
[241111] ์์ ๋ณด๋ค ์ฝ๊ณ ๋น ๋ฅธ SQL 3์ฃผ์ฐจ-1~3 ๊ฐ์ (1) | 2024.11.12 |
[241111] ์์ ๋ณด๋ค ์ฝ๊ณ ๋น ๋ฅธ SQL 2์ฃผ์ฐจ-5~6 ๊ฐ์ ๋ฐ ์์ (1) | 2024.11.11 |