-- 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);