[개발] 옵시디언 노트 기반 RAG 시스템 구축하기 3
이전글
이전 글에서 우리는 옵시디언 노트를 효과적으로 분할하는 방법을 살펴보았습니다. 문서의 청크 분할을 통해 정보를 세분화하여 관리할 수 있게 되었고, 이는 특히 대규모 노트 보관함에서 정보 검색 및 처리의 효율성을 크게 향상시켰습니다. 이번 글에서는 분할된 문서들을 임베딩하고, 그 임베딩을 사용하여 관련 문서를 검색하는 과정에 대해 설명하겠습니다.
문서 임베딩하기
임베딩 과정은 문서의 내용을 고차원 벡터 공간에 매핑하여, 문서 간의 의미적 유사성을 수치화하는 과정입니다. 이를 위해 우리는 HuggingFaceEmbeddings
와 Chroma
벡터 스토어를 사용합니다. HuggingFaceEmbeddings
는 주어진 문서를 벡터로 변환하는데 사용되며, BAAI/bge-m3
모델을 사용하여 이 작업을 수행합니다. Chroma.from_documents
함수는 이러한 임베딩을 기반으로 문서들을 벡터 데이터베이스에 저장합니다. 이 데이터베이스는 추후 문서 검색에 사용됩니다.
from langchain.vectorstores import Chroma
from langchain_community.embeddings import HuggingFaceEmbeddings
model_name = "BAAI/bge-m3"
model_kwargs = {'device': 'mps'} # Metal Performance Shaders(for Apple Silicon)
embedding = HuggingFaceEmbeddings(
model_name=model_name,
model_kwargs=model_kwargs,
encode_kwargs=model_kwargs,
show_progress=True
)
vectordb = Chroma.from_documents(
documents=char_split_docs,
embedding=embedding,
persist_directory='db'
)
vectordb.persist()
이 코드는 문서를 벡터로 변환하고, 그 결과를 'db'라는 디렉토리에 영구적으로 저장합니다. 이를 통해 우리는 문서들의 의미적 유사성을 기반으로 한 검색 기능을 구현할 수 있게 됩니다.
문서 검색하기
문서 임베딩이 완료되면, 이제 임베딩을 기반으로 문서 검색을 수행할 수 있습니다. 이 과정은 특정 쿼리에 대한 관련 문서를 찾는 것입니다. vectordb.as_retriever
함수는 벡터 데이터베이스를 검색 엔진으로 변환합니다. 이 검색 엔진은 주어진 쿼리를 벡터로 변환하고, 데이터베이스 내에서 가장 유사한 문서들을 찾아냅니다.
retriever = vectordb.as_retriever(search_kwargs={"k": 20})
retriever.get_relevant_documents("what is langchain?")
위 코드는 "what is langchain?"이라는 쿼리에 대해 가장 관련성이 높은 20개의 문서를 검색합니다. 이러한 검색 기능은 사용자가 빠르게 원하는 정보를 찾을 수 있게 해주며, 대규모 문서 보관함에서의 정보 접근성을 크게 향상시킵니다.
임베딩과 검색 과정을 통해, 우리는 옵시디언 노트를 기반으로 한 RAG(임베딩 기반 검색 및 검색) 시스템을 구축하는 방법을 살펴보았습니다.
Congratulations, your post has been upvoted by @upex with a 0.21% upvote. We invite you to continue producing quality content and join our Discord community here. Keep up the good work! #upex