사용툴 분석

chromadb

필만이 2024. 6. 18. 16:35

뭔데?

  • AI 기반의 오픈 소스 벡터 데이터베이스로 Apache 2.0 라이선스가 부여됨
  • Apache 2.0 라이선스는 오픈 소스 라이선스 중 하나로, 누구나 소프트웨어를 자유롭게 사용, 수정, 배포할 수 있도록 허용하는 라이선스

일반 적용 코드

from langchain_community.document_loaders import TextLoader
from langchain_openai.embeddings import OpenAIEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from langchain_community.vectorstores import Chroma


# 텍스트를 600자 단위로 분할
text_splitter = CharacterTextSplitter(chunk_size=600, chunk_overlap=0)

# TextLoader 를 통해 텍스트 파일을 로드
split_docs = TextLoader("data/appendix-keywords.txt").load_and_split(text_splitter)

# Chroma 를 통해 벡터 저장소 생성
chroma_db = Chroma.from_documents(split_docs, OpenAIEmbeddings())

# 유사도 검색(쿼리)
similar_docs = chroma_db.similarity_search("TF IDF 에 대하여 알려줘")
print(similar_docs[0].page_content)

 

OpenAIEmbeddings을 사용 코드

  • 정밀한 텍스트 임베딩 생성: OpenAI의 모델을 사용하면 고차원의 텍스트 데이터를 정교하게 임베딩할 수 있습니다. 이 임베딩은 텍스트의 깊은 의미적 특성을 포착하여, 단순 텍스트 매칭을 넘어서는 유사성과 관련성을 기반으로 한 검색이 가능합니다.
  • 최신 NLP 기술 활용: OpenAI의 임베딩 모델은 최신 자연어 처리(NLP) 기술을 반영하고 있으며, 이는 텍스트의 복잡한 의미를 이해하고, 그 의미를 벡터 공간에 매핑하는 데 탁월합니다.
# embedding_Vector 를 통해 유사도 검색
embedding_vector = OpenAIEmbeddings().embed_query("TF IDF 에 대하여 알려줘")
similar_docs = chroma_db.similarity_search_by_vector(embedding_vector)

print(similar_docs[0].page_content)

 

as_retreiver()

  • 벡터 저장소를 사용하여 문서를 검색하는 Retriever
# retriever 생성
retriever = chroma_db.as_retriever()

# similarity_search 를 통해 유사도 높은 1개 문서를 검색
relevant_docs = retriever.get_relevant_documents("VectorStore 에 대하여 알려줘")

print(f"문서의 개수: {len(relevant_docs)}")
print("[검색 결과]\n")
print(relevant_docs[0].page_content)

 

search_type

  • 매개변수에 검색 알고리즘을 지정
  • search_type='similarity'를 쓰면 vector store 의 유사도 알고리즘 기반으로 상위 K개의 문서를 검색
retriever = chroma_db.as_retriever(search_type="similarity", search_kwargs={"k": 2})
relevant_docs = retriever.get_relevant_documents("VectorStore, TF IDF 에 대하여 알려줘")
print(f"문서의 개수: {len(relevant_docs)}")
print("[검색 결과]\n")
for i in range(len(relevant_docs)):
    print(relevant_docs[i].page_content)
    print("===" * 20)

 

MMR 알고리즘
모임에 참석해 친구를 위해 새로운 사람들을 소개하는 상황을 상상해 보세요. 친구가 만나고 싶어하는 사람들의 특징(embedding vector)을 알고 있습니다.

MMR 방식을 적용하면 다음과 같은 접근법을 사용합니다:

  1. 모임에 있는 모든 사람들의 프로필(list of embedding vector)을 살펴봅니다.
  2. 친구의 관심사와 특성에 부합하는 사람을 찾아 소개합니다.
  3. 그 후, 다시 참여한 사람들을 살펴보되, 이번에는 이미 소개한 사람과는 다른 특성을 가진 사람을 찾습니다.
  4. 여기서 lambda mult 매개변수는 친구의 취향과 새로운 특성 사이의 균형을 조정하는 역할을 합니다.
  5. 이 과정을 친구가 만나길 원하는 사람들의 수(k 매개변수)에 도달할 때까지 반복합니다.
  6. 마지막으로, 친구가 만난 사람들의 목록을 제공합니다.
retriever = chroma_db.as_retriever(search_type="mmr", search_kwargs={"k": 2})
relevant_docs = retriever.get_relevant_documents(
    "VectorStore, TF IDF 에 대하여 알려줘")
print(f"문서의 개수: {len(relevant_docs)}")
print("[검색 결과]\n")
for i in range(len(relevant_docs)):
    print(relevant_docs[i].page_content)
    print("===" * 20)

 

search_kwargs

  • "k" 매개변수로 찾을 문서의 개수를 지정할 수 있습니다. 만약, {"k": 3} 지정한다면 3개의 유사도 높은 문서만 선택하겠다는 의미
  • score_threshold (최소 관련성 임계값): 문서가 반환되기 위한 최소 유사도 점수를 설정합니다. 이 값 이상의 유사도를 가진 문서만 결과로 포함됩니다.
  • fetch_k (MMR 알고리즘에 전달될 문서 수) 알고리즘에 전달될 문서의 수를 지정합니다. 이 값은 다양성을 고려하여 문서를 선택하는 데 사용됩니다. 기본값은 20입니다.
  • lambda_mult (결과의 다양성) 1에 가까울수록 다양성이 최소화되고, 0에 가까울수록 최대화됩니다. 기본값은 0.5로, 중간 수준의 다양성을 제공
  • filter (문서 필터링) 검색 결과를 특정 메타데이터 기준으로 필터링합니다. 예를 들어, {'filter': {'paper_title':'GPT-4 Technical Report'}}는 제목이 'GPT-4 Technical Report'인 문서만을 결과로 반환.
retriever = chroma_db.as_retriever(
    search_type="mmr", search_kwargs={"k": 2, "fetch_k": 10, "lambda_mult": 0.75}
)
relevant_docs = retriever.get_relevant_documents(
    "VectorStore, TF IDF 에 대하여 알려줘")
print(f"문서의 개수: {len(relevant_docs)}")
print("[검색 결과]\n")
for i in range(len(relevant_docs)):
    print(relevant_docs[i].page_content)
    print("===" * 20)

출처 : https://wikidocs.net/234013

'사용툴 분석' 카테고리의 다른 글

개발 환경과 유용한 툴 설명  (0) 2024.07.26
PsExec 이란?  (0) 2024.07.17
리눅스 폴더 구조  (0) 2024.07.10
윈도우 원격 실행 winRM  (1) 2024.07.05
ssh 접속 방식 이해  (0) 2024.07.04