상세 컨텐츠

본문 제목

SUPABASE에서 Vector Search 해보기

백도 황도지사

by 아서킴 2025. 4. 9. 17:56

본문

728x90

1. 원래 하려던 것

  Azure에 RAG를 짜잔하고 구성하려고 보니 벡터 DB와 검색 기능이 필요.

 

2. 하지 못한 것과 이유

  Azure Cognitive Search를 구성하려는데 비용이 생각보다 너무 비쌈 ($264/월)

  선생님 저 그냥 테스트할 건데 어떻게 싸게 안 될까요...

 

3. 대안

   가. Amazon OpenSearch Service => 간편하긴 하나 역시 싸진 않음

   나. FAISS => EC2 같은 데 올려서 사용할 수 있으나 그걸 또 언제 하나. 로컬 테스트하기는 좋아 보임.

   다. SUPABASE => 마침 또 수파베이스를 쓰고 있으니 찰떡일세.

 

4. AI가 써준 초안

  요즘 벡터 검색(Vector Search)이 핫한 키워드로 떠오르고 있습니다. OpenAI, HuggingFace 등에서 제공하는 임베딩 모델 덕분에 자연어 유사도 검색, 문서 검색, RAG(Retrieval-Augmented Generation) 등 다양한 분야에서 활용되고 있죠.

이번 글에서는 Supabase를 이용해 벡터 검색을 구현하는 방법을 소개하려고 합니다.

 


pgvector 설치하기

 

1. Database > Extentions

 

2. vector 검색 > 스위치 켜기

 

3. 기본적으로 extensions 스키마에 설치하라고 뜨는데, 안 바꾸는 걸 추천한다.
  (스키마 새로 만들어서 설치했다가 삽질 엄청 하고 결국 삭제 & 재설치 엔딩)

 

4. 깔끔하게 SQL Editor에서 설치할 수도 있다. [하지만 나는 GUI(옛날 말..)를 굳이 쓰고 싶다.]

create extension if not exists vector;

 

 


vector 속성 필드 만들어서 vector 값 저장하기

 

Text를 vector로 변환하는 작업은 여기서 다루지 않겠다.

저는 Azure text-embedding-3-small 을 사용함 (1536차원)

 

pg_vector를 설치하고 나면 필드 속성에 vector가 생긴다. 필드에 벡터 값을 잘 넣어주자.

 

 

 


Database Function 만들기

 

1. Database > Functions 에서 만들 수도 있지만, 쉽지 않다.

 

2. AI한테 SQL문을 작성해 달라고 하고, SQL Editor에서 실행해도 된다.
  // 함수 이름: vector_search 
  // 파라미터: query_vector (비교할 벡터 값)

  // 반환:  {id, summary, contents, similarity}

CREATE OR REPLACE FUNCTION public.vector_search(query_vector vector)
    RETURNS TABLE( // Response로 받을 형식
        item_id bigint,
        summary text,
        contents text,
        similarity double precision
    )
    LANGUAGE plpgsql
    AS $function$
    BEGIN
        RETURN QUERY  // 쿼리 작성
        SELECT 
            t1.id,
            t1.summary,
            t1.contents,
            (t2.embedding <=> query_vector) AS similarity  //유사도 측정(낮을수록=가까울수록 높은 유사도)
        FROM public.table2 t2
        JOIN public.table1 t1 ON t2.id = t1.id
        ORDER BY similarity
        LIMIT 5;
    END;
    $function$;

 

 

3. 하지만 코드 관리를 해야 하니, 클라이언트에 sql문을 작성하여 supabase CLI로 배포를 하도록 하자.

 

 


테스트

supabase.rpc 를 호출하는 javascript 코드

const { data: searchResults, error } = await supabase
    .rpc("vector_search", {
        query_vector: searchEmbedding,
    });

 

 

 

 

끗.

관련글 더보기