| -- DDL |
|
|
| -- 1. pgvector νμ₯μ΄ μλ€λ©΄ λ¨Όμ μμ±ν΄μΌ ν©λλ€. |
| CREATE EXTENSION IF NOT EXISTS vector; |
|
|
| -- 2. ν
μ΄λΈ μμ± |
| CREATE TABLE t_test_textembedding ( |
| id BIGSERIAL PRIMARY KEY, -- PK (μλ μ¦κ°) |
| title VARCHAR(500) NOT NULL, -- μ λͺ© |
| title_embedding VECTOR(768), -- μ λͺ© μλ² λ© (768μ°¨μ) |
| content TEXT NOT NULL, -- λ΄μ© |
| content_embedding VECTOR(768), -- λ΄μ© μλ² λ© (768μ°¨μ) |
| created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP -- μμ±μΌ |
| ); |
|
|
| -- 3. (μ ν) λ²‘ν° κ²μ μ±λ₯μ λμ΄κΈ° μν μΈλ±μ€ μμ± (HNSW μκ³ λ¦¬μ¦, μ½μ¬μΈ μ μ¬λ κΈ°μ€) |
| CREATE INDEX idx_title_embedding ON t_test_textembedding USING hnsw (title_embedding vector_cosine_ops); |
| CREATE INDEX idx_content_embedding ON t_test_textembedding USING hnsw (content_embedding vector_cosine_ops); |
|
|
|
|
| -------------------------------- |
|
|
| -- 1. pgvector νμ₯μ΄ μλ€λ©΄ λ¨Όμ μμ±ν΄μΌ ν©λλ€. |
| CREATE EXTENSION IF NOT EXISTS vector; |
|
|
| -- 2. ν
μ΄λΈ μμ± |
| CREATE TABLE t_test_imgembedding ( |
| id BIGSERIAL PRIMARY KEY, -- PK (μλ μ¦κ°) |
| title VARCHAR , |
| url VARCHAR , |
| mimetype VARCHAR , |
| img_embedding VECTOR(1280), -- λ΄μ© μλ² λ© (768μ°¨μ) |
| created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP -- μμ±μΌ |
| ); |
|
|
| -- 3. (μ ν) λ²‘ν° κ²μ μ±λ₯μ λμ΄κΈ° μν μΈλ±μ€ μμ± (HNSW μκ³ λ¦¬μ¦, μ½μ¬μΈ μ μ¬λ κΈ°μ€) |
| CREATE INDEX idx_test_imgembedding ON t_test_imgembedding USING hnsw (img_embedding vector_cosine_ops); |
|
|
|
|
|
|
|
|
| ---------------------------------- |
|
|
|
|
| // title_embedding_arr, content_embedding_arrλ |
| // ONNX λͺ¨λΈμμ μΆμΆν 768κ°μ μ«μκ° λ΄κΈ΄ λ°°μ΄(Array)μ
λλ€. |
|
|
| let insertData = await db.query( |
| ` |
| INSERT INTO t_test_textembedding (title, title_embedding, content, content_embedding) |
| VALUES ($1, $2, $3, $4) |
| RETURNING id, title, created_at; |
| `, |
| [ |
| title, |
| JSON.stringify(title_embedding_arr), // DB λλΌμ΄λ² νΈνμ±μ μν΄ λ¬Έμμ΄ ν¬λ§· '[...]' μΌλ‘ λ³ν |
| content, |
| JSON.stringify(content_embedding_arr) |
| ] |
| ); |
|
|
| console.log('μμ±λ λ°μ΄ν°:', insertData.rows[0]); |
|
|
|
|
|
|
| ----------------------------------------- |
|
|
|
|
| // query_embedding_arrλ μ¬μ©μμ κ²μμ΄λ₯Ό ONNX λͺ¨λΈμ λλ € λμ¨ μλ² λ© λ°°μ΄μ
λλ€. |
|
|
| let searchResult = await db.query( |
| ` |
| SELECT |
| id, |
| title, |
| content, |
| -- μ½μ¬μΈ 거리λ 0μ κ°κΉμΈμλ‘ μ μ¬νλ―λ‘, μ§κ΄μ μΈ 'μ μ¬λ μ μ'λ₯Ό μν΄ 1μμ λΊλλ€. |
| 1 - (content_embedding <=> $1) AS similarity_score |
| FROM t_test_textembedding |
| -- μ μ¬λ μκ³κ° μ€μ (μ: μ νλ μ μκ° 0.5 μ΄μμΈ κ²λ§) |
| WHERE 1 - (content_embedding <=> $1) > 0.5 |
| ORDER BY content_embedding <=> $1 ASC |
| LIMIT 5; |
| `, |
| [JSON.stringify(query_embedding_arr)] |
| ); |
|
|
| console.log('μ μ¬ν λ°μ΄ν° λͺ©λ‘:', searchResult.rows); |