Spaces:
Running
Running
| -- 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); |