Python을 이용한 Chromadb를 쓰게 된 이유는....
이전에 Node를 사용해서 Pinecone에 Vector Store를 진행해서 유사도 연습을 했었는데
free tier로 사용하다보니깐 의외로 Read 할당량을 너무 많이 써서 금방 limit에 걸리더라구여...
그래서!
Vector Store를 어떻게 처리하면 좋을까 하다가 Chromadb를 이용해서 그냥 로컬에 저장해서 테스트를 해보려고
시도해봤습니다. 윈도우, 맥 둘다 있어서 둘 다 시도 해봤는데 Chromadb 들어가기에 앞서.. 약간(?)의 문제를 얘기하려합니다.
Window 에서 Chromadb | Mac 에서 Chromadb |
1. 버전을 최신버전으로 사용 가능하다. 2. 대신 포트포워딩 부분에서 안되는 부분이 생길 수 있다 -> 제가 그랬습니다 ㅜㅜ |
1. 맥 자체의 문제인지 모르겠지만, 0.3.23 버전 위로 올라가질 않는다 -> 지원하지 않는 부분들이 존재하나봐요.. 2. 대신 포트포워딩은 잘 풀린다 |
처음에는
Window로 Flask를 이용해서 진행했습니다.
Window 진행 시 사용한 라이브러리 : Flask, gunicorn, chromadb, openai , python-dotenv 정도 입니다.
단순히, CRUD api 를 생성 해서 진행 했습니다.
chromadb를 사용은 기본적으로
import chromadb
client = chromadb.PersistentClient(path="./data")
# crud 형식을 보여주기 위한 그냥 형태
@create('/create')
collection.add(
ids=[str(data.id)],
documents=[data.document],
embeddings=[embedding],
metadatas=[metadata]
)
@read('/read')
# id 값으로 검색 (include 조건은 여러개 가능 ex) embeddings, documents)
id_data = collection.get(ids=[id], include=["embeddings"])
# embedding 값으로 검색
document = collection.query(
query_embeddings=id_data["embeddings"], # embedding 검색 시 필수
n_results=10,
# where={"metadata_field": "is_equal_to_this"}, # optional filter where절은 무조건 하나만 데이터가 가능
# where_document={"$contains":"search_string"} # optional filter
)
@update('/update')
collection.update(
ids=["doc1"],
embeddings=[[...]], # 새로운 임베딩 벡터
documents=["새로운 문서 내용"],
metadatas=[{"source": "updated"}]
)
@delete('/delete')
#id 값으로 삭제
collection.delete(
ids=["my_doc_id_1", "my_doc_id_2"]
)
# 특정 조건으로 삭제
collection.delete(
where={"특정 키": "특정 값"}
)
이런 형식으로 됩니다. 정말 간단하더라구요.
대신 조심해야하는 부분이, 만약 chromadb에 create 할 당시에 처음 들어간 데이터의 차원이 256 차원이다
그럼 그 다음부터 들어오는 차원도 똑같이 맞춰주셔야 합니다. 안 그럼 데이터가 안들어가요
즉, 여러 차원을 섞어서 데이터를 저장 할 수 없습니다.
이렇게 준비를 다하고 Window에서 포트포워딩이 제대로 안되어서.... Mac으로 갈아타게 되었습니다.
근데, 제가 듣기로는 chromadb 버전이 0.4 버전 이상부터 메모리가 아닌 폴더안에 데이터로 저장이 가능한걸로 알고 있는데 Mac에서는 0.3.23 버전 위로 도저히 올릴 방법이 없어서 도커를 쓰게됐습니다... (어차피 Mac 스팩이 괜찮아서 로컬서버로 돌리려구요)
혹시라도 Mac 쓰시는 분들은 메모리에 저장하실건지.. 데이터를 저장하실건지 잘 확인하셔야해요
0.3 버전에서는 chromadb.client() 만 쓸 수 있고 0.4 버전이상은 chromadb.PersistentClient() 사용이 된다고 하더라구요!!
Docker에 올려서 사용한 Python 라이브러리는 : fastapi, uvicorn, chromadb, openai, python-dotenv
데이터를 가져오는 부분에 있어서 flask + gunicorn 쓰는데 오류가 생겨서 fastapi + uvicorn 형태로 변경했습니다.
flask와 fastapi 는 사용 방식 차이가 있기 때문에 이 부분은 꼭 확인해서 사용해주세요!!
'잡다한 지식' 카테고리의 다른 글
[Linux] 파일에 권한 정보 (0) | 2025.05.16 |
---|---|
[Vector] Pinecone 벡터 (0) | 2025.04.15 |
[SQL] mediumtext 가 준 교훈.. (0) | 2025.03.21 |
[JS] Promise 종류 (0) | 2024.11.20 |
[SPF] SPF 레코드 (0) | 2024.11.12 |