2 분 소요

Chromadb 공식 사이트

참조: 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

댓글남기기