Chroma
Chroma는 오픈소스 임베딩 데이터베이스로, Python, LangChain, VectorDB, 및 LLM을 활용하여 지식, 정보, 기술을 LLM 앱에 통합할 수 있게 해줍니다. 이를 통해 사용자는 RAG 파이프라인 구축 및 embedding 기술을 적용하 여 LLM 앱을 쉽게 구축할 수 있습니다.
Chroma 활용
RAG 파이프라인 구축
Embedding을 활용하여 다량의 데이터에서 세부적인 검색 가능
Chroma DB를 활용하여 DB를 로컬에 저장하고 변경된 부분만 갱신하는 기능 구현 가능
Collection을 사용하면 다수의 collection을 통합하여 데이터 관리를 용이하게 함
Chroma collection 사용해 보기
생성
Python을 사용한 Chroma Client로 collection 생성 및 Obsidian의 markdown 문서를 collection에 추가하는 과정을 보여줍니다.
COLLECTION_NAME = 'obsidian_md_db'
# Persistent Chroma Client 시작
persistent_client = chromadb.PersistentClient()
# 임베딩 함수 설정 (Chroma의 기본 임베딩 함수)
embedding_function = SentenceTransformerEmbeddings(model_name="all-MiniLM-L6-v2")
# 이미 COLLECTION_NAME이라는 이름의 컬렉션이 있는지 확인
collections = persistent_client.list_collections()
is_collection_exist = any(collection.name == COLLECTION_NAME for collection in collections)
if is_collection_exist:
# 기존에 생성된 collection이 존재
collection = persistent_client.get_collection(COLLECTION_NAME)
else:
# 기존에 생성된 collection이 존재하지 않음
# 새로운 collection을 생성
collection = persistent_client.get_or_create_collection(COLLECTION_NAME)
# data 폴더에 있는 모든 .md 파일의 경로를 가져옴
md_files = glob.glob('data/*.md')
# 각 파일을 읽어서 collection에 추가합
# chunk_size = 1000, chunk_overlap = 50 으로 분할하여 embedding을 수행
for md_file in md_files:
loader = TextLoader(md_file)
docs = loader.load()
tokenized_docs = get_tokenized_text(docs[0].page_content)
for doc in tokenized_docs:
collection.add(ids=[str(uuid.uuid1())], metadatas=docs[0].metadata, documents=doc.page_content)
검색
collection에 존재하는 문서를 다양한 방법으로 검색하는 방법을 설명합니다.
자연어 검색
단어 검색
특정 문서에서만 검색
기타 검색 옵션
query = "ChatGPT 음성 영어회화 설정방법"
# similarity search 와 유사한 결과
results = collection.query(
query_texts=[query],
n_results=5, # 검색 결과의 개수
)
# 검색된 문서들의 내용들을 출력
print(results['documents'])
# 검색된 문서들의 metadata들을 출력
# 문서의 경로, 파일명, 기타 정보들을 출력할 수 있음
print(results['metadatas'])
# 검색된 문서들을 바탕으로 ChaGPT에 질문
result = process_query_llm(query, results['documents'])
print(result)
# 특정 문서에 있는 내용에서만 검색
results = collection.query(
query_texts=[query],
n_results=5,
where={
"source": {
"$eq": "data/AI Agent 만들기.md"
}
}
)
result = process_query_llm(query, results['documents'])
print(result)
삭제
특정 경로에 있는 markdown 파일에서 파생된 데이터를 삭제하는 방법을 설명합니다.
collection.delete(
where={
"source": {
"$eq": "data/AI Agent 만들기.md"
}
}
)
정리
이 프로젝트의 원래 목표는 Obsidian 데이터의 세부적인 검색 및 처리 기능 구현이었습니다. 현재는 이 기능의 기본적인 R&D만을 진행할 수 있었습니다. 향후에는 사용자가 커스텀할 수 있는 검색 기능과 변경된 파일에 대한 데이터만을 갱신하는 기능을 추가할 계획입니다. 이 기능들이 성공적으로 구현되면, Obsidian 플러그인으로 개발하는 것을 고려하고 있습니다.