119_ChatBot_v2 / database.py
muyeong's picture
Upload database.py with huggingface_hub
6c2ddf8 verified
"""
Supabase 데이터베이스 연동 모듈
- 문서 저장 및 검색
- 벡터 유사도 검색 (pgvector)
"""
from supabase import create_client
from config import SUPABASE_URL, SUPABASE_KEY
from typing import List, Dict, Optional
# Supabase 클라이언트 초기화
supabase = create_client(SUPABASE_URL, SUPABASE_KEY) if SUPABASE_URL and SUPABASE_KEY else None
def save_document(title: str, content: str, embedding: List[float], category: str = "일반") -> bool:
"""문서를 데이터베이스에 저장"""
if not supabase:
return False
try:
supabase.table("documents").insert({
"title": title,
"content": content,
"embedding": embedding,
"category": category
}).execute()
return True
except Exception as e:
print(f"문서 저장 오류: {e}")
return False
def search_documents(query_embedding: List[float], top_k: int = 3) -> List[Dict]:
"""벡터 유사도 기반 문서 검색"""
if not supabase:
return []
try:
# Supabase RPC 함수 호출 (pgvector 유사도 검색)
result = supabase.rpc(
"match_documents",
{
"query_embedding": query_embedding,
"match_count": top_k
}
).execute()
return result.data if result.data else []
except Exception as e:
print(f"문서 검색 오류: {e}")
return []
def get_all_documents(category: Optional[str] = None) -> List[Dict]:
"""모든 문서 조회"""
if not supabase:
return []
try:
query = supabase.table("documents").select("id, title, content, category")
if category:
query = query.eq("category", category)
result = query.execute()
return result.data if result.data else []
except Exception as e:
print(f"문서 조회 오류: {e}")
return []
def save_chat_history(user_message: str, bot_response: str, session_id: str) -> bool:
"""채팅 기록 저장"""
if not supabase:
return False
try:
supabase.table("chat_history").insert({
"session_id": session_id,
"user_message": user_message,
"bot_response": bot_response
}).execute()
return True
except Exception as e:
print(f"채팅 기록 저장 오류: {e}")
return False