File size: 3,107 Bytes
60d8678 1abde86 60d8678 1abde86 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | -- 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); |