From d152674d1dc73960a5a51f00aa5b46571056ece7 Mon Sep 17 00:00:00 2001 From: SOHYEON Date: Sat, 1 Feb 2025 18:21:52 +0900 Subject: [PATCH 1/2] add DocumentManagerInterface --- 09-VectorStore/utils/vectordbinterface.py | 222 +++++++++++++--------- 1 file changed, 134 insertions(+), 88 deletions(-) diff --git a/09-VectorStore/utils/vectordbinterface.py b/09-VectorStore/utils/vectordbinterface.py index 5a4074896..5be1a2e02 100644 --- a/09-VectorStore/utils/vectordbinterface.py +++ b/09-VectorStore/utils/vectordbinterface.py @@ -1,120 +1,166 @@ from abc import ABC, abstractmethod -from typing import Any, Dict, Optional, List +from typing import Any, Dict, Optional, List, Iterable from langchain_core.documents import Document - -# ========================================== -# 1️⃣ 인덱스 관리 인터페이스 -# ========================================== -class IndexManagerInterface(ABC): +class DocumentManagerInterface(ABC): """ - 인덱스 관리 인터페이스 + 문서 insert/update (upsert, upsert_parallel) + 문서 search by query (search) + 문서 delete by id, delete by filter (delete) """ @abstractmethod - def create_index( - self, - index_name: str, - dimension: int, - metric: str = "dotproduct", - pod_spec=None, - **kwargs - ) -> Any: - """인덱스를 생성하고 반환합니다. 즉, index_name으로 인덱스를 생성하고 생성이 완료되면 index_name을 반환하고, 없다면 None을 반환합니다.""" + def upsert(self, texts: Iterable[str], metadatas: Optional[list[dict]] = None, ids: Optional[List[str]] = None, **kwargs: Any + ) -> None: + """문서를 업서트합니다. """ pass @abstractmethod - def list_indexs(self) -> Any: - """인덱스 리스트를 반환합니다""" + def upsert_parallel(self, texts: Iterable[str], metadatas: Optional[list[dict]] = None, ids: Optional[List[str]] = None + , batch_size: int = 32, workers: int = 10, **kwargs: Any + ) -> None: + """병렬로 문서를 업서트합니다.""" pass @abstractmethod - def get_index(self, index_name: str) -> Any: - """인덱스를 조회합니다. 즉, index_name을 가진 인덱스가 있는지 조회하고, 있다면 index_name을 반환하고, 없다면 None을 반환합니다.""" + def search(self, query: str, k: int = 10, **kwargs: Any) -> List[Document]: + """쿼리를 수행하고 관련 문서를 반환합니다. + 기본 기능: query (문자열) -> 비슷한 문서 k개 반환 + + cosine_similarity 써치하는 것 의미 **문제될 경우 이슈제기 + + -그외 기능 (추후 확장) + metatdata search + 이미지 서치할 때 벡터 받는 것 + """ pass @abstractmethod - def delete_index(self, index_name: str) -> None: - """인덱스를 삭제합니다. 즉, index_name을 가진 인덱스를 삭제합니다.""" - pass + def delete(self, ids: Optional[list[str]] = None, filters: Optional[dict] = None, **kwargs: Any + ) -> None: + """필터를 사용하여 문서를 삭제합니다. + ids: List of ids to delete. If None, delete all. Default is None. + filters: Dictionary of filters (querys) to apply. If None, no filters apply. -# ========================================== -# 2️⃣ 문서 업서트 인터페이스 -# ========================================== -class DocumentManagerInterface(ABC): - """ - 문서 관리 인터페이스 (upsert, upsert_parallel) - """ - - @abstractmethod - def upsert_documents( - self, index_name: str, documents: List[Dict], **kwargs - ) -> None: - """문서를 업서트합니다.""" + """ pass - @abstractmethod - def upsert_documents_parallel( - self, - index_name: str, - documents: List[Dict], - batch_size: int = 32, - max_workers: int = 10, - **kwargs - ) -> None: - """병렬로 문서를 업서트합니다.""" - pass -# ========================================== -# 3️⃣ 문서 조회 및 삭제 인터페이스 -# ========================================== -class QueryManagerInterface(ABC): - """ - 문서 검색 및 삭제 인터페이스 (query, delete_by_filter) - """ +# deprecated +# # ========================================== +# # 1️⃣ 인덱스 관리 인터페이스 +# # ========================================== +# class IndexManagerInterface(ABC): +# """ +# 인덱스 관리 인터페이스 +# """ - @abstractmethod - def query( - self, index_name: str, query_vector: List[float], top_k: int = 10, **kwargs - ) -> List[Document]: - """쿼리를 수행하고 관련 문서를 반환합니다.""" - pass +# @abstractmethod +# def create_index( +# self, +# index_name: str, +# dimension: int, +# metric: str = "dotproduct", +# pod_spec=None, +# **kwargs +# ) -> Any: +# """인덱스를 생성하고 반환합니다. 즉, index_name으로 인덱스를 생성하고 생성이 완료되면 index_name을 반환하고, 없다면 None을 반환합니다.""" +# pass - @abstractmethod - def delete_by_filter(self, index_name: str, filters: Dict, **kwargs) -> None: - """필터를 사용하여 문서를 삭제합니다.""" - pass +# @abstractmethod +# def list_indexs(self) -> Any: +# """인덱스 리스트를 반환합니다""" +# pass +# @abstractmethod +# def get_index(self, index_name: str) -> Any: +# """인덱스를 조회합니다. 즉, index_name을 가진 인덱스가 있는지 조회하고, 있다면 index_name을 반환하고, 없다면 None을 반환합니다.""" +# pass -# ========================================== -# 4️⃣ 통합 인터페이스 (VectorDBInterface) -# ========================================== -class VectorDBInterface( - IndexManagerInterface, DocumentManagerInterface, QueryManagerInterface, ABC -): - """ - 벡터 데이터베이스의 통합 인터페이스 - - 인덱스 관리 - - 문서 업서트 - - 문서 검색 및 삭제 - """ +# @abstractmethod +# def delete_index(self, index_name: str) -> None: +# """인덱스를 삭제합니다. 즉, index_name을 가진 인덱스를 삭제합니다.""" +# pass - @abstractmethod - def connect(self, **kwargs) -> None: - """DB 연결을 초기화합니다.""" - pass - @abstractmethod - def preprocess_documents(self, documents: List[Document], **kwargs) -> List[Dict]: - """LangChain Document 객체를 특정 DB에 맞는 형식으로 변환합니다.""" - pass +# # ========================================== +# # 2️⃣ 문서 업서트 인터페이스 +# # ========================================== +# class DocumentManagerInterface(ABC): +# """ +# 문서 관리 인터페이스 (upsert, upsert_parallel) +# """ - @abstractmethod - def get_api_key(self) -> str: - """DB 연결을 위한 API 키 또는 인증 정보 반환""" - pass +# @abstractmethod +# def upsert_documents( +# self, index_name: str, documents: List[Dict], **kwargs +# ) -> None: +# """문서를 업서트합니다.""" +# pass + +# @abstractmethod +# def upsert_documents_parallel( +# self, +# index_name: str, +# documents: List[Dict], +# batch_size: int = 32, +# max_workers: int = 10, +# **kwargs +# ) -> None: +# """병렬로 문서를 업서트합니다.""" +# pass + + +# # ========================================== +# # 3️⃣ 문서 조회 및 삭제 인터페이스 +# # ========================================== +# class QueryManagerInterface(ABC): +# """ +# 문서 검색 및 삭제 인터페이스 (query, delete_by_filter) +# """ + +# @abstractmethod +# def query( +# self, index_name: str, query_vector: List[float], top_k: int = 10, **kwargs +# ) -> List[Document]: +# """쿼리를 수행하고 관련 문서를 반환합니다.""" +# pass + +# @abstractmethod +# def delete_by_filter(self, index_name: str, filters: Dict, **kwargs) -> None: +# """필터를 사용하여 문서를 삭제합니다.""" +# pass + + +# # ========================================== +# # 4️⃣ 통합 인터페이스 (VectorDBInterface) +# # ========================================== +# class VectorDBInterface( +# IndexManagerInterface, DocumentManagerInterface, QueryManagerInterface, ABC +# ): +# """ +# 벡터 데이터베이스의 통합 인터페이스 +# - 인덱스 관리 +# - 문서 업서트 +# - 문서 검색 및 삭제 +# """ + +# @abstractmethod +# def connect(self, **kwargs) -> None: +# """DB 연결을 초기화합니다.""" +# pass + +# @abstractmethod +# def preprocess_documents(self, documents: List[Document], **kwargs) -> List[Dict]: +# """LangChain Document 객체를 특정 DB에 맞는 형식으로 변환합니다.""" +# pass + +# @abstractmethod +# def get_api_key(self) -> str: +# """DB 연결을 위한 API 키 또는 인증 정보 반환""" +# pass # ========================================== From 5fcc498f24dbfd901a97bdce93b2f0835ea81f16 Mon Sep 17 00:00:00 2001 From: SOHYEON Date: Thu, 6 Feb 2025 16:00:45 +0900 Subject: [PATCH 2/2] =?UTF-8?q?vectordbinterface.py=20=EC=97=85=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 클래스명 변경 --- 09-VectorStore/utils/vectordbinterface.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/09-VectorStore/utils/vectordbinterface.py b/09-VectorStore/utils/vectordbinterface.py index 5be1a2e02..47a5e806b 100644 --- a/09-VectorStore/utils/vectordbinterface.py +++ b/09-VectorStore/utils/vectordbinterface.py @@ -2,7 +2,7 @@ from typing import Any, Dict, Optional, List, Iterable from langchain_core.documents import Document -class DocumentManagerInterface(ABC): +class DocumentManager(ABC): """ 문서 insert/update (upsert, upsert_parallel) 문서 search by query (search)