from langchain_community.vectorstores import Chroma
vector_store = Chroma(
persist_directory=persist_directory, # 기존에 vectordb가 있으면 해당 위치의 vectordb를 load하고 없으면 새로 생성합니다.
embedding_function=embeddings, # 새롭게 데이터가 vectordb에 넣어질때 사용할 임베딩 방식을 정합니다, 저희는 위에서 선언한 embeddings를 사용합니다.
collection_name = collection_name, # india라는 이름을 정해줌으로써 나중에 vector store 관리 가능
collection_metadata = {'hnsw:space': 'cosine'}, # cosine 말고 l2 가 default / collection_metadata를 통해 유사도 검색에 사용될 공간('hnsw:space')을 'cosine'으로 지정하여, 코사인 유사도를 사용
)
Chroma를 통해 벡터DB를 만들 경우 아래 이미지와 같이 폴더와 파일이 생성된다. 이게 뭔지 알아보자.
디렉토리 구조
chroma.sqlite3는 다음 4가지 유형의 데이터가 포함되어 있습니다.
1. Sysdb : tenant, database, collection 그리고 segment 정보를 저장하는 역할인 Chroma system database 입니다.
tenants : 시스템의 모든 테넌트를 포함한다. 일반적으로 single tenant (default_tenant)로 초기화된다.
database : 테넌트당 모든 database를 포함한다. 일반적으로, single database ( default_tenant와 관련된 default_database)로 초기화된다.
collections : database당 모든 collections를 포함한다.
collection_metadata : 각 collection과 관련된 모든 메타데이터를 포함한다. collection의 메타데이터는 사용자가 지정한 key-value 쌍과 HNSW index 파라메타를 저장하는 hnsw:* keys로 두성된다.
segments : collection 당 모든 segments를 포함한다. 각 collection에는 metadata와 vector라는 2개의 segments가 있다.
segment_metadata : 각 segment와 관련된 모든 metadata를 포함한다. 이 테이블에는 vector segment에 대한 HNSW index parameters를 저장하는 hnsw:* keys가 포함되어 있다.
일단 여기까지 정확히 모르겠지만, 코드를 살펴보면 collection_name과 collection_metadata를 지정한 부분이 있다.
2. WAL
write-ahead log는 database에 대한 모든 변경사항을 저장하는 table이다. 이는 data의 내구성을 보장하고 충돌 시 복구할 수 있는지 확인하는 데 사용된다. WAL은 아래와 같이 구성된다.:
embeddings_queue: Chroma에 수집된 모든 데이터를 포함한다. table의 각 행은 collection에 대한 작업 (add, update, delete, upsert)을 나타냅니다. 행에는 operation을 replay하고 data consistency(일관성)을 보장하기 위한 모든 필수 정보 (embedding, document, metadata, associated relationship to a collection)가 포함되어 있다.
max_seq_id : metadata segment에 대한 WAL replay starting point로 사용되는 metadata segment의 maximum sequence ID를 유지한다.
3. Metadata Segment
metadata segment는 Chroma에 저장된 모든 metadata와 documents를 저장하는 table이다.
metadata segment는 다음과 같이 구성된다:
embeddings
embedding_metadata : 각 documents 및 documents의 embedding과 관련된 모든 metadata를 포함한다.
embedding_fulltext_search : document full-text search index (문서 전체 텍스트 검색 색인). 이것은 가상 table이며 sqlite를 검사하면 embedding_fulltext_search_ 로 시작하는 일련의 table로 나타낸다. 이것은 FTS5 테이블이며 Chroma에 저장된 문서에 대한 full-text search queries (전체 텍스트 검색 쿼리)에 사용된다.
4. Migrations
mirgrations table에는 chroma.sqlite3 database에 적용된 모든 schema migrations를 포함한다.
이렇게 chroma.sqlite 파일의 구조를 알아보았는데, 읽어봐선 잘 모르겠다. 그래서 DB Browser for SQLite를 통해 한번 시각적으로 확인해 보았다.
아하, persist_directory에 정한 폴더 안에 chroma.sqlite3 말고 생성되는 폴더의 이름이 segment_id이구나
그리고 key와 str_value가 collection_metadata 정할때, 정해지는 구나
def init_vectorDB(self, persist_directory=config["chroma"]["persist_dir"], collection_name = 'india'):
"""vectorDB 설정"""
embeddings = OpenAIEmbeddings(model=config["embed_model"]["model_name"]) # VectorDB에 저장될 데이터를 임베딩할 모델을 선언합니다.
vector_store = Chroma(
persist_directory=persist_directory, # 기존에 vectordb가 있으면 해당 위치의 vectordb를 load하고 없으면 새로 생성합니다.
embedding_function=embeddings, # 새롭게 데이터가 vectordb에 넣어질때 사용할 임베딩 방식을 정합니다, 저희는 위에서 선언한 embeddings를 사용합니다.
collection_name = collection_name, # india라는 이름을 정해줌으로써 나중에 vector store 관리 가능
collection_metadata = {'hnsw:space': 'cosine'}, # cosine 말고 l2 가 default / collection_metadata를 통해 유사도 검색에 사용될 공간('hnsw:space')을 'cosine'으로 지정하여, 코사인 유사도를 사용
)
return vector_store
collect_name으로 india 또는 korea를 하면 이렇게 name이 정해지는구나