[개발] 옵시디언 노트 기반 RAG 시스템 구축하기 3

in #krsuccesslast month (edited)

이전글


이전 글에서 우리는 옵시디언 노트를 효과적으로 분할하는 방법을 살펴보았습니다. 문서의 청크 분할을 통해 정보를 세분화하여 관리할 수 있게 되었고, 이는 특히 대규모 노트 보관함에서 정보 검색 및 처리의 효율성을 크게 향상시켰습니다. 이번 글에서는 분할된 문서들을 임베딩하고, 그 임베딩을 사용하여 관련 문서를 검색하는 과정에 대해 설명하겠습니다.

문서 임베딩하기

임베딩 과정은 문서의 내용을 고차원 벡터 공간에 매핑하여, 문서 간의 의미적 유사성을 수치화하는 과정입니다. 이를 위해 우리는 HuggingFaceEmbeddingsChroma 벡터 스토어를 사용합니다. 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(임베딩 기반 검색 및 검색) 시스템을 구축하는 방법을 살펴보았습니다.

Posted using Obsidian Steemit plugin

Sort:  

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

Coin Marketplace

STEEM 0.29
TRX 0.12
JST 0.034
BTC 62759.93
ETH 3112.27
USDT 1.00
SBD 3.87