[VectorDB] ChromaDB 정리
RAG를 적용하기 위해서 필요한 것이 이미 문서를 DB화 한 상태가 필요함.
문서 DB에서 질문에 가장 유사한 내용을 추출하여 LLM prompt에 넣어줌으로써 LLM에게 환각을 방지하고, 보다 정확한 답변을 생성해 내기 위해 사용.
그럼, 질문(Q)과 비슷한 내용은 어떻게 비교할 것인가? NLP에서 문자는 Vector로 표현하게 되고, Vector로 표현하게 해주는 것을 임베딩(Embedding)이라 한다.
문서 내 내용을 모두 임베딩하여 저장을 한 후, 들어온 질문(Q)와 가장 유사하다고 판단되는 문장들을 뽑아내 사용하는 방식이다.
즉, DB는 Vector를 저장해야 사용할 수 있는데, 대표적인 VectorDB는 ChromaDB, Faiss가 대표적인 것 같다.
ChromaDB 사용법 정리
1. ChromaDB 생성
import chromadb
# 크로마DB instance 생성
cdb = chromadb.Client()
# 실질적 DB 생성 및 초기화
collection = cdb.create_collection(name="my_collection")
2. 데이터 넣기 ( add )
# 데이터 추가
collection.add(
documents=[
"This is a document about pineapple",
"This is a document about oranges"
],
ids=['1','2'],
)
add 함수를 이용하여 chromaDB에 데이터를 넣어줄 수 있습니다.
단, 주의할 사항이 있습니다. " ids값은 반드시 들어가야 하며 문자형이여야 한다. "
documents만큼 ids가 반드시 필요합니다.
3. 데이터 확인 ( get )
collection.add(
documents=[
"This is a document about pineapple",
"This is a document about oranges"
],
ids=[str(uuid4()),str(uuid4())],
)
collection.get()
get 함수를 이용하면 DB안에 들어있는 데이터 전체를 볼 수 있다.
*Note
크로마DB는 VectorDB라는 이야기를 많이들 한다. Vector DB라고 들으면 텍스트의 Vector를 저장을 해야하는데 .get()을 통해 보면 'embeddings' : None 이라는 부분이 보인다. 그외의 데이터는 잘 보여지는 것을 알 수 있다.
그럼 embeddings 값이 저장이 안되는건가? 라는 의심을 하게 만들어서 찾아보았다.
결론은 단순히 '안보여주는 것' 일 뿐이다. 즉, 상식처럼 Vector Embedding값이 저장되는 DB이다.
그럼 어떻게 embedding 값을 볼 수 있을까?
get을 사용할때, include 파라미터에 embeddings를 넣어주면 뽑히는 것을 알 수 있다. 하지만, 여기서 조심해야할 것은 기존에 나왔던 documents, metadatas가 나오지 않는 것을 볼 수 있는데, 그 이유는 파라미터에 넣지 않아서 그런다.
include 파라미터의 dafault는 documents, metatdatas기 때문에 .get()만 했을때 embeddings가 나오지 않았던 것이다.
4. 검색( query )
collection.query(
query_texts=["오늘 날씨 어때"], # Chroma will embed this for you
n_results=2, # how many results to return,
)
chromaDB에서 검색은 .query()를 이용하여 진행할 수 있다. 쿼리로 입력된 텍스트를 Embedding을 거쳐 DB에 저장된 Embedding 값들과 유사도를 비교하여 최종적으로 거리가 멀지않은 ( 의미가 가장 가까운 ) 문장을 추출해준다.
이렇게 4가지 함수를 이용해 ChromaDB를 다뤄보았다. 추가적으로 조건 검색, 제거 같은 것들은 해당 내용에 포함되지 않으니 공식 문서에서 찾아 적용해보길 바란다.
https://docs.trychroma.com/docs/overview/introduction
Introduction - Chroma Docs
docs.trychroma.com