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를 이용해 벡터 검색을 구현하는 방법을 소개하려고 합니다.
1. Database > Extentions
2. vector 검색 > 스위치 켜기
3. 기본적으로 extensions 스키마에 설치하라고 뜨는데, 안 바꾸는 걸 추천한다.
(스키마 새로 만들어서 설치했다가 삽질 엄청 하고 결국 삭제 & 재설치 엔딩)
4. 깔끔하게 SQL Editor에서 설치할 수도 있다. [하지만 나는 GUI(옛날 말..)를 굳이 쓰고 싶다.]
create extension if not exists vector;
Text를 vector로 변환하는 작업은 여기서 다루지 않겠다.
저는 Azure text-embedding-3-small 을 사용함 (1536차원)
pg_vector를 설치하고 나면 필드 속성에 vector가 생긴다. 필드에 벡터 값을 잘 넣어주자.
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,
});
끗.
o1 쓰다가 50만원 나온 이야기 (0) | 2025.04.21 |
---|---|
AI와 대화할 때 한번에 많은 양의 텍스트를 주고 받는 꼼수는 없을까? (1) | 2025.04.10 |
사용자가 AI를 학습시킬 수 있다는 오해에 대해 (0) | 2025.04.04 |
Azure OpenAI API 404 Resource not found (0) | 2025.03.28 |
회사 이야기 (장르는 판타지) - 2 (0) | 2024.05.25 |