-
Notifications
You must be signed in to change notification settings - Fork 6
Lang2SQL on Chat service
Lang2SQL 프로젝트를 진행하면서 고성능 프론티어 모델이나 값비싼 API를 활용하지 못하는 점이 늘 아쉬웠습니다. 이러한 고민은 "어떻게 하면 경제적으로 Lang2SQL을 사용할 수 있을까?"라는 질문으로 이어졌고, 별도의 API 비용 없이 많은 사람이 사용하는 채팅 서비스에서 동작한다면 저렴하게 서비스를 운영할 수 있겠다는 아이디어로 발전했습니다.
#MCP #Supabase #Agentic #MCP_super_assistant
기존 Lang2SQL에서는 데이터베이스의 테이블 정보를 검색할 수 있는 RAG(Retrieval Augmented Generation) 기능이 구현되어 있었습니다. 당시 RAG의 Vector DB는 Faiss로 구현되었지만, 이번 기회에 Supabase의 PostgreSQL을 활용하여 Vector DB를 구축하고, RAG를 수행하는 코드를 MCP(Model Context Protocol)로 만들어 활용성을 높였습니다.
하지만 아쉽게도 현재 MCP를 공식적으로 지원하는 서비스는 Anthropic의 Claude가 유일하여 ChatGPT, Gemini, Grok 등 다른 LLM 사용자들은 MCP의 이점을 누리기 어려운 상황입니다. 이러한 문제를 해결하기 위해 MCP SuperAssistant 서비스가 등장했습니다.
MCP SuperAssistant는 Chrome 확장 프로그램으로 설치하여 사용할 수 있습니다. 이 확장 프로그램은 각 채팅 서비스(예: ChatGPT) 내에서 클라이언트 역할을 수행하며, 서버에서 사용 가능한 MCP 도구들을 확인하고 연동하는 기능을 제공합니다.
작동 원리를 간단히 설명하자면, 채팅 서비스 내에서 직접 MCP가 동작하는 것이 아니라, MCP 활용을 위한 프롬프트를 자동으로 텍스트 파일 형태로 생성하고 이를 채팅에 첨부하여 MCP 도구 호출(tool calling)을 유도합니다. 이후 도구 호출이 감지되면 확장 프로그램이 이를 인지하고 사용자에게 함수 실행 권한을 요청합니다. 사용자가 승인하면 함수가 실행되고, 그 결과 역시 프롬프트 형태로 변환되어 다음 명령으로 이어져 최종적으로 사용자가 요청한 내용이 해결되는 방식입니다.
Supabase는 애플리케이션 백엔드를 손쉽게 구축하고 관리할 수 있도록 지원하는 오픈소스 플랫폼입니다. 백엔드의 핵심 요소인 데이터베이스를 시작으로 Edge function, Authentication 등 다양한 기능을 별도의 서버 구축 없이 구현할 수 있게 돕습니다. 이번 프로젝트에서는 Supabase의 데이터베이스 기능을 활용하며, 특히 PostgreSQL 기반이므로 pgvector 확장 기능을 사용하여 RAG를 위한 Vector DB를 구성합니다.
기존 Vector DB(Faiss)에서 Documents 추출
기존에 langchain
으로 저장된 Faiss Vector DB를 로드할 때는 임베딩 함수가 필요합니다. 여기서는 실제 임베딩을 수행하지 않고 Document 객체만 추출하기 위해 fake_embeddings
함수를 정의하여 활용합니다. 이후 추출된 Document 객체들을 리스트에 저장합니다.
from typing import List
from langchain_community.vectorstores import FAISS
from langchain.schema import Document # Document 타입을 명시적으로 import
def fake_embeddings(texts: List[str] = None, embeddings: List[float] = None): # 파라미터명과 타입을 보다 명확히 수정
# 이 함수는 실제 임베딩을 반환하지 않고, FAISS 로드 시 형식적으로만 사용됩니다.
return None
# <vector_db_path>를 실제 Faiss DB가 저장된 경로로 변경해야 합니다.
index = FAISS.load_local(
"<vector_db_path>", fake_embeddings, allow_dangerous_deserialization=True
)
docstore_dict = index.docstore._dict
docs = list()
for doc_id, document in docstore_dict.items():
docs.append(document)
추출된 Document를 임베딩하여 Supabase에 업로드
먼저 필요한 라이브러리를 설치합니다.
pip install supabase langchain-openai
이제 추출한 docs
를 OpenAI 임베딩 모델을 사용해 임베딩하고 Supabase에 업로드합니다.
from supabase import create_client, Client # Client 타입을 명시적으로 import
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import SupabaseVectorStore
# Supabase 접속 정보 (실제 값으로 대체 필요)
supabase_url = "<insert_your_supabase_url>"
supabase_key = "<insert_your_supabase_key>"
supabase: Client = create_client(supabase_url, supabase_key)
# OpenAI API 키 (실제 값으로 대체 필요)
openai_api_key = "<insert_your_openai_api_key>"
embeddings = OpenAIEmbeddings(
model="text-embedding-3-small", openai_api_key=openai_api_key
)
# Document와 임베딩 값을 Supabase에 업로드
vectorstore = SupabaseVectorStore.from_documents(
docs,
embeddings,
client=supabase,
table_name="documents", # Supabase에 생성될 테이블명
)