Chromadb - 01 (Getting Started)
참조: https://docs.trychroma.com/getting-started
Chromadb?
ChromaDB는 벡터(vector) 데이터를 저장하고 쿼리(query)할 수 있는 데이터베이스입니다. 주로 임베딩(embedding) 데이터의 저장 및 검색에 적합하게 설계되었습니다. 텍스트나 기타 데이터 형식을 벡터 형태로 변환하여 저장하고, 이를 기반으로 의미론적으로 유사한 데이터를 검색할 때 아주 유용하여 자연어 처리와 관련된 분야에서 벡터 데이터베이스는 중요한 역할을 합니다. ChromaDB는 이러한 기능을 제공하는 벡터 데이터베이스이며 AI 응용 프로그램의 필요성에 부응하여 필수적인 도구로 자리잡고 있습니다.
추가로 임베딩(embedding)이란 개념을 간단히 설명하겠습니다. 임베딩은 단어나 문장을 벡터로 변환하는 것을 말합니다. 예를 들어 ‘사과’라는 단어를 벡터로 변환하면 아래와 같습니다.
[0.1, 0.2, 0.3, 0.4, 0.5]
이렇게 변환된 벡터는 ‘사과’라는 단어의 의미를 담고 있습니다. 이렇게 변환된 벡터를 저장하고 검색하는 것이 Chromadb의 역할입니다.
Chromadb 설치
사전 준비 사항
Chromadb는 SQKLite를 기반으로 설계되었습니다. SQLite를 설치해야 합니다.
- Python 3.6 이상의 환경이 구성되어 있어야 합니다.
- SQLite 3.35 이상 버전을 요구합니다.
SQLite는 우선 접어 두고 대부분의 경우 Python은 3.6이상 버전을 사용하고 있을 것이라고 생각하고 설치를 진행 합니다. SQLite는 문제는 진행 하면서 확인하겠습니다.
pip install chromadb
Client 생성
Chromadb에 접속 하기 위한 Client를 생성합니다.
import chromadb
chroma_client = chromadb.Client()
Chromadb의 공식 사이트의 가이드를 따라 Chromadb를 설치하고 위의 코드를 작성하고 실행하면 아래와 같은 에러가 발생합니다. 참고로 제 경우는 ubuntu 20.04 의 python은 3.10 버전을 사용하고 있습니다. ubuntu 20.04에서 python3.10 설치하는 방법은 제 블로그를 참고 하시면 됩니다. windows에서는 별 문제 없이 설치가 되는 것 같습니다.
Traceback (most recent call last):
File "/home/dev01/app/chat_pdf_app/src/ubn_chat_pdf/chromadb_temp.py", line 1, in <module>
import chromadb
File "/home/dev01/app/chat_pdf_app/chat_pdf/lib/python3.10/site-packages/chromadb/__init__.py", line 79, in <module>
raise RuntimeError(
RuntimeError: Your system has an unsupported version of sqlite3. Chroma requires sqlite3 >= 3.35.0.
Please visit https://docs.trychroma.com/troubleshooting#sqlite to learn how to upgrade.
이 오류를 처리하기 위해 많은 시행 착오를 격었습니다. 결론적으로 아주 간단한 방법이 있었습니다.
먼저 pysqlite3-binary
를 설치합니다.
pip install pysqlite3-binary
그리고 소스 코드에 아래와 같이 추가합니다.
__import__('pysqlite3') # pysqlite3 모듈을 임포트
import sys
# 기본 sqlite3 모듈을 pysqlite3로 대체 - 후속 코드에서 sqlite3를 참조할 때 pysqlite3를 사용
sys.modules['sqlite3'] = sys.modules.pop('pysqlite3')
import chromadb
chroma_client = chromadb.Client()
이제 정상적으로 작동합니다.
Collection 생성
데이터를 저장하기 위해 Collection을 생성합니다.
__import__('pysqlite3')
import sys
sys.modules['sqlite3'] = sys.modules.pop('pysqlite3')
import chromadb
chroma_client = chromadb.Client()
# Collection 생성을 위해 추가된 코드
collection = chroma_client.create_collection(name="my_collection")
my_collection
이란 이름의 Collection이 생성됩니다.
앞으로는 추가된 코드를 제외하고는 생략하겠습니다.
Document 추가
생성한 Collection에 Document를 추가합니다.
collection.add(
documents=["This is a document", "This is another document"],
metadatas=[{"source": "my_source"}, {"source": "my_source"}],
ids=["id1", "id2"]
)
collection.add(
: Collection에 새로운 Document를 추가하는 메서드입니다.documents
: 추가할 Document들의 리스트입니다.metadatas
: Document의 메타데이터를 담고 있는 리스트입니다.ids
: Document의 ID(고유 식별자)를 담고 있는 리스트입니다.
오류 없이 실행이 되었으면 정상적으로 Document가 추가된 것입니다.
embedding 값을 이미 알고 있을 때
공식 사이트의 가이드에서는 embedding 값을 이미 알고 있을 때 아래와 같이 추가할 수 있다고 합니다.
collection.add(
embeddings=[[1.2, 2.3, 4.5], [6.7, 8.2, 9.2]],
documents=["This is a document", "This is another document"],
metadatas=[{"source": "my_source"}, {"source": "my_source"}],
ids=["id1", "id2"]
)
정상적으로 실행이 됩니다. 하지만 아래 코드(Document 검색
)에서 오류가 발생합니다.
chromadb.errors.InvalidDimensionException: Embedding dimension 384 does not match collection dimensionality 3
embedding
의 차원이 documents
의 차원과 일치하지 않아서 오류가 발생합니다. embedding
의 차원은 documents
의 차원과 일치해야 합니다. 계속 진행 하시면 이해가 되실 것 같습니다.
Document 검색
위에서 추가한 Document를 검색해 보겠습니다.
results = collection.query(
query_texts=["This is a query document"],
n_results=2
)
print(results)
collection.query(
: Collection에서 Document를 검색하는 메서드입니다.query_texts
: 검색할 Document들의 리스트입니다.n_results
: 검색 결과로 반환할 Document의 개수입니다.
검색 결과는 아래와 같습니다.
{'ids': [['id1', 'id2']], 'distances': [[0.7111214399337769, 1.0109773874282837]], 'metadatas': [[{'source': 'my_source'}, {'source': 'my_source'}]], 'embeddings': None, 'documents': [['This is a document', 'This is another document']], 'uris': None, 'data': None}
ids
: 검색된 Document의 ID(고유 식별자)를 담고 있는 리스트입니다.distances
: 검색된 Document와 검색어의 유사도를 담고 있는 리스트입니다.metadatas
: 검색된 Document의 메타데이터를 담고 있는 리스트입니다.embeddings
: 검색된 Document의 임베딩 값을 담고 있는 리스트입니다. None이 반환되었습니다. 이 부분은 다음에 설명하겠습니다.documents
: 검색된 Document를 담고 있는 리스트입니다.
해시태그: #Chromadb #Client #Collection #Document #Query #pysqlite3 #sqlite3
댓글남기기