New to Nutbox?

옵시디언 노트 기반 RAG 시스템 구축하기 4 (마지막)

7 comments

anpigon
70
13 days ago3 min read

이전글


이 글은 로컬 기반 AI 모델을 활용해 비용 없이 옵시디언에 RAG(Retrieval-Augmented Generation) 시스템을 구축하는 방법을 소개합니다.

사용 모델 및 라이브러리

구현 과정

임베딩 모델 불러오기

from langchain_community.embeddings import HuggingFaceEmbeddings

model_name = "BAAI/bge-m3"
model_kwargs = {'device': 'mps'} # 'device': 'cuda' for GPU, 'device': 'cpu' for CPU, 'device': 'mps' for Apple Silicon Macs

embedding = HuggingFaceEmbeddings(
    model_name=model_name, 
    model_kwargs=model_kwargs, 
    encode_kwargs=model_kwargs,
    show_progress=True
)

벡터DB 불러오기

from langchain_community.vectorstores import Chroma

# 벡터DB를 불러옵니다.
vector_store = Chroma(persist_directory="db", embedding_function=embedding)

# 벡터DB를 검색기로 변환합니다.
retriever = vector_store.as_retriever(search_kwargs={"k": 20})

Rerank 모델을 불러오기

from langchain_cohere import CohereRerank

# Cohere의 Rerank 모델을 불러옵니다.
compressor = CohereRerank(model="rerank-multilingual-v3.0")

LLM 모델 불러오기

from langchain_community.llms import Ollama

# Ollma에서 AI 모델을 불러옵니다.
llm = Ollama(model="EEVE-Korean-10.8B")

필요한 함수 작성

from langchain.chains import RetrievalQA
from langchain.retrievers.contextual_compression import ContextualCompressionRetriever


def query_docs(query: str) -> dict:
    compression_retriever = ContextualCompressionRetriever(
        base_compressor=compressor, 
        base_retriever=retriever
    )

    chain = RetrievalQA.from_chain_type(
        llm=llm,
        chain_type="stuff",
        retriever=compression_retriever,
        return_source_documents=True,
        verbose=True,
    )

    return chain({"query": query})


def chatbot(query):
    response = query_docs(query)
    if response and "result" in response:
        answer = response["result"].strip()
        source_docs_string = ""
        if response and "result" in response and "source_documents" in response:
            answer = response["result"]
            sources = response["source_documents"]
            source_info = "\n출처:\n" + "\n".join(
                [f"- {src.metadata['path']}" for src in sources]
            )
            return f"{answer.strip()}\n{source_info}"
    else:
        return "No relevant documents found."


while True:
    user_query = input("User: ")
    response = chatbot(user_query)
    print("Chatbot:", response)

활용 예시

1. 내 노트 기반으로 개념 질문하기

질문: 인생이란?

2. 내 노트 기반으로 조언 얻기

질문: 인생을 살아가는데 한가지 조언을 해준다면?

3. 내 노트 기반으로 정보 검색하기

질문: 유튜브 영상을 요약해주는 AI 도구를 알려주세요.

마치며

벡터DB 검색 기반으로 대답하기 때문에 전체 노트를 요약하거나 노트를 정리하는 작업은 어려울 수 있습니다. 주로 검색 용도로 활용하는 것이 좋겠습니다.

이상으로 비용 없이 로컬 기반 AI 모델을 활용해 옵시디언에 RAG 시스템을 구축하는 방법을 소개했습니다. 이 시스템을 통해 자신의 노트를 기반으로 개념을 질문하고, 조언을 얻으며, 정보를 검색할 수 있습니다.


옵시디언 관련 글

Posted using Obsidian Steemit plugin

Comments

Sort byBest