Chroma DB를 활용한 다량 문서 처리 방법

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에 존재하는 문서를 다양한 방법으로 검색하는 방법을 설명합니다.

    1. 자연어 검색

    2. 단어 검색

    3. 특정 문서에서만 검색

    4. 기타 검색 옵션

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 플러그인으로 개발하는 것을 고려하고 있습니다.

6

(채용) 콘텐츠 마케터, AI 엔지니어, 백엔드 개발자

지피터스의 수 천개 AI 활용 사례 데이터를 AI로 재가공 할 인재를 찾습니다

👉 이 게시글도 읽어보세요