[개발] 옵시디언 노트 기반 RAG 시스템 구축하기 1steemCreated with Sketch.

in #krsuccess3 months ago (edited)

오늘날 디지털 시대에서 정보의 양이 기하급수적으로 증가함에 따라, 생산성을 추구하는 사람, 작가, 연구원, 그리고 디지털 노트를 효율적으로 관리하고자 하는 모든 이들에게 데이터의 효과적인 관리와 검색이 점점 더 중요해지고 있습니다. 이러한 맥락에서, 로컬 폴더에 저장된 일반 텍스트 Markdown 파일을 기반으로 하는 강력한 지식 관리 도구인 Obsidian은 그 유연성과 확장성으로 많은 사용자들에게 사랑받고 있습니다. 그러나 노트 보관함의 크기가 커짐에 따라, 데이터를 분석하거나 활용할 때 필요한 노트를 검색하고 처리하는 데 드는 노력도 함께 증가하고 있습니다.

obsidian-smart-connections 플러그인을 활용하고 있음에도 불구하고, 사용 가능한 임베딩 모델이 한국어를 지원하지 않아 한계를 느끼고 있습니다. 이 플러그인에 대한 더 자세한 활용 방법은 잔향님의 블로그 글, "인공지능이 내용상 관련도 높은 노트를 찾아주는 Smart Connections 옵시디언(Obsidian) 플러그인"에서 찾아볼 수 있습니다.

이러한 상황을 개선하고자, 저는 Python의 LangChain과 LLM을 이용하여 Obsidian 노트를 로드하고 처리하는 새로운 방법을 모색하고 있으며, 이를 통해 RAG 시스템을 구축하는 데 집중하고 있습니다.

한국어 임베딩 모델로는 BAAI/bge-m3jhgan/ko-sroberta-multitask를 고려하고 있으며, 답변 생성 AI로는 Orion-14B-Chat-RAG를 사용할 계획입니다.

LangChain은 Obsidian 노트를 손쉽게 불러올 수 있는 ObsidianLoader 클래스를 제공합니다. 이 클래스를 상속받아 MyObsidianLoader 클래스를 만들고, 필요한 기능을 추가하여 커스텀했습니다. MyObsidianLoader는 로딩 과정에서 특정 폴더를 제외하는 기능을 추가함으로써, 템플릿, 이미지 디렉토리, 아카이브 등 노트와 비노트 파일 혹은 폴더를 혼합하여 보관하는 사용자들에게 매우 유용할 것입니다. 이를 통해 보다 효율적인 데이터 관리와 분석이 가능해질 것으로 기대합니다.

import os
from pathlib import Path
from typing import List
from langchain_core.documents import Document
from langchain_community.document_loaders import ObsidianLoader

class MyObsidianLoader(ObsidianLoader):
    def load(self, exclude_folders: List[str] = None) -> List[Document]:
        """Load documents, excluding files in specified folder paths."""
        if exclude_folders is None:
            exclude_folders = []
        exclude_folders = set(exclude_folders)  # Convert to set for efficient lookups

        paths = [
            path for path in Path(self.file_path).rglob("*.md")
            if not any(exclude_folder in path.parts for exclude_folder in exclude_folders)
            and not str(path.relative_to(self.file_path)).startswith('.')
        ]

        docs = []
        for path in paths:
            with open(path, encoding=self.encoding) as f:
                text = f.read()

            front_matter = self._parse_front_matter(text)
            tags = set(self._parse_document_tags(text))
            dataview_fields = self._parse_dataview_fields(text)
            text = self._remove_front_matter(text)
            metadata = {
                "source": path.name,
                "path": str(path),
                "created": path.stat().st_ctime,
                "last_modified": path.stat().st_mtime,
                "last_accessed": path.stat().st_atime,
                **self._to_langchain_compatible_metadata(front_matter),
                **dataview_fields,
            }

            front_matter_tags = front_matter.get("tags", [])
            if front_matter_tags is None:
                front_matter_tags = []

            combined_tags = tags.union(set(front_matter_tags))
            if combined_tags:
                metadata["tags"] = ",".join(combined_tags)

            docs.append(Document(page_content=text, metadata=metadata))

        return docs

# Set the path to your Vault
vault_path = "/path/to/내 옵시디언 경로"

# Define the folders you want to exclude
exclude_folders = ["Templates", "textgenerator", "Excalidraw", "Archive", "Anki"]

# Initialize the loader and load the desired directories
loader = MyObsidianLoader(vault_path)
docs = loader.load(exclude_folders)

Posted using Obsidian Steemit plugin

Sort:  

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

This post was upvoted by @upex upvoting Services with 0.30%. To learn more Join our Discord community here.
image

수고 많으십니다. 화이팅!

@응원해

도리안님 응원 감사합니다.


안녕하세요.
이 글은 SteemitKorea팀(@dorian-lee)님께서 저자이신 @anpigon님을 응원하는 글입니다.
소정의 보팅을 해드렸습니다 ^^ 항상 좋은글 부탁드립니다
SteemitKorea팀에서는 보다 즐거운 steemit 생활을 위해 노력하고 있습니다.
이 글은 다음날 다시 한번 포스팅을 통해 소개 될 예정입니다. 감사합니다!

@anpigon 님 ^^ 늘 좋은글 잘 읽고 있습니다.
RAG는 뭐의 약자일까요 ^^

RAG는 Retrieval-Augmented Generation의 약자이고, 데이터 검색을 통해 AI답변을 향상시키는 기술을 말해요. 요즘 제가 관심있게 탐구하고 있는 주제에요.

감사합니다. ^^ 그리고, 한가지 더 궁금한점이 있습니다. 맥북을 사용하시는 것으로 알고 있는데, Mac에서는 AI를 활용할때 그래픽 카드의 GPU를 활용할때 다른 방법이 있나요 아니면 CPU만으로 수행하시는건가요?
저는 윈도우를 사용하고 있고, 그래픽카드가 AMD 인데 GPU를 활용할 방법이 있을까요?

Coin Marketplace

STEEM 0.28
TRX 0.13
JST 0.033
BTC 61450.33
ETH 2982.28
USDT 1.00
SBD 3.60