Basic Example - Vector
이 예제에서는 AkasicDB 확장을 로드하고, 카테고리 필터를 적용한 벡터 유사도 검색까지의 전체 워크플로우를 보여줍니다.
1. 확장 로드
CREATE EXTENSION IF NOT EXISTS akasicdb;
SELECT akasicdb_admin.initialize();
- AkasicDB의 모든 타입과 함수를 데이터베이스에 등록합니다.
- 이 과정은 관리자 권한을 가진 계정으로만 수행할 수 있습니다.
2. 테이블 생성
CREATE TABLE items (
id bigserial PRIMARY KEY,
name text,
category text,
embedding vector(3) NOT NULL
);
category컬럼 추가로 필터링 예제를 구현합니다.- 임베딩은 3차원 벡터(
vector(3)) 타입을 사용합니다.
3. 튜토리얼 데이터 생성
INSERT INTO items (name, category, embedding)
SELECT
'item_' || i,
(ARRAY['fruit','vegetable','grain'])[floor(random()*3)::int+1],
ARRAY[random(), random(), random()]::real[]
FROM generate_series(1,100) AS s(i);
- 임의의 레코드를 100개를 생성합니다.
- 카테고리는
fruit,vegetable,grain중 무작위로 지정됩니다. - 임베딩은 임의의 3차원 벡터값으로 생성됩니다.
4. HNSW 인덱스 생성
CREATE INDEX ON items USING vectoron (embedding vector_l2_ops);
- 이 예제에서는 기본 HNSW 알고리즘을 사용합니다.
- 인덱스를 생성한 것으로 인해 벡터 검색 시 빠른 근접 이웃 탐색을 지원합니다.
5. 벡터 유사도 검색
-- 탐색 깊이 설정
SET vectoron.hnsw_ef_search = 64;
-- 'fruit' 카테고리 내 상위 2개 검색
SELECT
id,
name,
category,
embedding <-> '[0.15,0.15,0.35]'::vector AS distance
FROM items
WHERE category = 'fruit'
ORDER BY distance
LIMIT 2;
vectoron.hnsw_ef_search으로 검색 품질(Recall)을 조절할 수 있습니다.category = 'fruit'조건으로fruit카테고리만 검색합니다.<->연산자로 제곱 유클리드 거리 기준으로 질의 결과를 정렬합니다.
이 과정을 통해 AkasicDB에서 벡터 검색과 RDBMS 필터링을 결합하는 방법을 쉽게 이해할 수 있습니다.