티스토리 뷰
Supabase 삽입, 업서트 및 검색 워크플로우 매뉴얼
Supabase 워크플로우 개요
이 n8n 워크플로우는 Supabase 벡터 데이터베이스에서 문서 데이터를 관리하도록 설계되었습니다. Supabase 인스턴스 준비, 새 문서 삽입, 기존 문서 업데이트(업서트), 그리고 채팅 쿼리를 기반으로 관련 정보를 검색하는 필수 단계를 다룹니다. 또한 문서 삭제를 처리하는 방법에 대한 참고 사항도 포함되어 있습니다.
Supabase 준비
워크플로우를 실행하기 전에 Supabase 데이터베이스에 특정 구성이 필요합니다:
- pgvector 확장: Supabase 프로젝트의 Database > Extensions에서 pgvector 확장을 활성화하세요. 'vector'를 검색하여 활성화합니다.
- 테이블 스키마: 대상 테이블에 다음 열이 있는지 확인하세요. VECTOR 차원(예: 1536)은 임베딩 모델의 출력과 일치해야 합니다(예: OpenAI의 text-embedding-3-small은 1536차원을 사용합니다).
- ALTER TABLE "YOUR TABLE NAME" ADD COLUMN embedding VECTOR(1536), ADD COLUMN metadata JSONB, ADD COLUMN content TEXT;
- 정책: 애플리케이션에 대한 읽기 및 쓰기 액세스를 허용하도록 적절한 Authentication > Policies를 설정하세요.
- match_documents 함수: Supabase SQL 편집기에서 사용자 지정 함수를 생성하세요. 이 함수는 검색 중 Vector Store 노드에 중요합니다. 이 함수의 VECTOR 차원도 임베딩 모델과 일치해야 합니다.
- CREATE OR REPLACE FUNCTION public.match_documents( filter JSONB, match_count INT, query_embedding VECTOR(1536) ) RETURNS TABLE ( id BIGINT, content TEXT, metadata JSONB, embedding VECTOR(1536), similarity FLOAT ) LANGUAGE plpgsql AS $$ BEGIN RETURN QUERY SELECT v.id, v.content, v.metadata, v.embedding, 1 - (v.embedding <=> match_documents.query_embedding) AS similarity FROM "YOUR TABLE NAME" v WHERE v.metadata @> filter ORDER BY v.embedding <=> match_documents.query_embedding LIMIT match_count; END; $$;
데이터 삽입
워크플로우의 이 섹션은 Supabase 벡터 스토어에 새 문서를 추가하는 것을 처리합니다:
- Google Drive: Google Drive에서 파일(예: EPUB 책)을 다운로드합니다.
- Default Data Loader: Google Drive 파일에서 바이너리 데이터를 로드하며, epubLoader로 지정됩니다.
- Embeddings OpenAI Insertion: 로드된 문서 콘텐츠에 대해 text-embedding-3-small OpenAI 모델을 사용하여 임베딩을 생성합니다.
- 중요: 벡터 호환성을 보장하려면 삽입, 업서트 및 검색에 동일한 임베딩 모델을 사용하는 것이 중요합니다.
- Insert Documents: 처리된 문서를 생성된 임베딩과 함께 지정된 Supabase 테이블(예시에서는 Kadampa)에 삽입합니다.
데이터 업서트
워크플로우의 이 부분은 Supabase 벡터 스토어에서 기존 문서를 업데이트하는 방법을 보여줍니다:
- Placeholder (File/Content to Upsert): 이 노드는 업서트하려는 콘텐츠에 대한 플레이스홀더 역할을 합니다. 현재는 메타데이터로 타임스탬프를 생성합니다. 실제 시나리오에서는 여기에 실제 문서 콘텐츠를 공급할 것입니다.
- Embeddings OpenAI Upserting: 업서트할 콘텐츠에 대한 임베딩을 생성하며, 다시 text-embedding-3-small OpenAI 모델을 사용합니다.
- Update Documents: 새 콘텐츠와 임베딩을 사용하여 지정된 id(예: 1)를 가진 Supabase 테이블(예시에서는 n8n)의 문서를 업데이트합니다.
데이터 검색
이 섹션은 사용자 쿼리를 기반으로 Supabase에서 관련 문서를 검색하고 응답을 생성하는 데 중점을 둡니다:
- When chat message received: 이 트리거 노드는 채팅 메시지가 수신될 때 워크플로우를 시작합니다. 사용자에게 초기 인사를 제공합니다.
- OpenAI Chat Model: 응답 생성을 위해 OpenAI 채팅 모델을 사용하도록 구성됩니다.
- Embeddings OpenAI Retrieval: 들어오는 채팅 쿼리에 대해 OpenAI 임베딩 모델을 사용하여 임베딩을 생성합니다.
- Retrieve by Query: 이것은 핵심 검색 단계입니다. Supabase Vector Store 노드를 사용하여 Kadampa 테이블을 쿼리합니다. (준비 단계에서 정의된) match_documents 함수를 활용하여 쿼리 임베딩을 기반으로 가장 유사한 문서를 찾아 최대 10개의 상위 결과를 검색합니다.
- Vector Store Retriever: 검색된 문서를 Question and Answer Chain으로 전달합니다.
- Question and Answer Chain: 사용자의 질문과 검색된 문서를 바탕으로 포괄적인 답변을 구성합니다.
- Customize Response: 생성된 응답에서 text를 추출하여 최종 채팅 응답을 위한 output 필드에 할당합니다.
데이터 삭제 (중요 참고 사항)
제공된 워크플로우는 n8n에 현재 벡터 데이터베이스에서 레코드를 삭제하는 내장 Supabase 노드가 없음을 언급합니다. 대신 HTTP Request 노드를 사용하는 것을 제안합니다:
- 메서드: DELETE 요청을 사용합니다.
- Supabase API Endpoint: https://<your-supabase-ref>.supabase.co/rest/v1/<your-vector-table>과 같은 URL을 구성합니다.
- 헤더:
- apikey: Supabase API 키.
- Authorization: Supabase JWT가 포함된 Bearer 토큰.
- 쿼리 매개변수: 삭제할 레코드를 지정합니다(예: ?id=eq.<your-record-id>). 이전 "Retrieve Rows from Table" 노드에서 레코드 ID를 동적으로 가져올 수 있습니다.
- 권한: Supabase 정책이 API를 통한 삭제를 허용하는지 확인하세요.
이 상세한 설명이 워크플로우를 이해하는 데 도움이 되기를 바랍니다! 이 과정의 어떤 부분에 대해 궁금한 점이 있거나 추가 설명이 필요하면 알려주세요.
'LLM' 카테고리의 다른 글
| RAG 기반 업무관리시스템 구축계획서 (2) | 2025.07.27 |
|---|---|
| 업무 관리 시스템 RAG 챗봇 (1) | 2025.07.25 |
| streamlit 애플리케이션 쿠버네티스 배포 (0) | 2025.07.24 |