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

in blog •  5 months ago  (edited)

이전글


이 글은 로컬 기반 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

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  

[광고] STEEM 개발자 커뮤니티에 참여 하시면, 다양한 혜택을 받을 수 있습니다.

image.png

Congratulations, your post has been upvoted by @upex with a 0.20% upvote. We invite you to continue producing quality content and join our Discord community here. Keep up the good work! #upex

옵시디언에 로컬 AI 연결이 되니 엄청 좋네요!

내 노트에 AI가 연결되니 마치 나만의 두 번째 뇌가 생긴 것 같은 기분이 들어요. 정말 좋습니다. 이제 이걸 옵시디언 플러그인으로 개발할 일만 남았습니다.

'device': 'mps' for Apple Silicon Macs

오 저런 옵션이 있네요 T.T 맥실리콘 ^^

그래서 그래픽 카드도 이용하나 봅니다.

저는 cpu로 한번 시간날때 공부를 한번 해보아야겠습니다.

네 대부분 애플 실리콘 칩셋을 지원하더군요. 덕분에 맥북에서 AI를 잘 실행하고 있어요. ㅎㅎ