옵시디언 노트와 랭체인을 이용한 RAG 시스템 만들기

반응형


이 영상에서는 'LangChain’을 활용해 자신의 노트에 질문하는 방법을 소개합니다. Obsidian 메모 앱에서 노트를 로드하고 인덱스를 생성하여 자연어로 질문함으로써 원하는 정보를 쉽게 얻을 수 있습니다. 이 접근법은 메모의 복잡한 내용을 쉽게 탐색하고, 생각을 더 깊게 이해하는 데 도움을 줍니다. 메모 작성, 생각 정리, 그리고 생산성 향상에 있어 매우 효과적인 도구가 될 것입니다.


옵시디언 노트 가져오기

우선, Obsidian 앱에서 노트를 가져오는 방법부터 시작해 보겠습니다.
LangChain에서는 langchain_community.document_loaders 모듈의 ObsidianLoader 클래스를 사용하여 이를 수행할 수 있습니다.
아래의 코드는 사용자의 시스템에 저장된 옵시디언 노트를 로드하는 예제입니다.

from langchain_community.document_loaders import ObsidianLoader

loader = ObsidianLoader("/Users/anpigon/Memo")

docs = loader.load()

이 코드는 특정 경로(/Users/anpigon/Memo)에 저장된 옵시디언 노트를 로드합니다. docs 변수에는 로드된 노트의 내용이 저장됩니다.


인덱스 만들기

노트를 로드한 후에는, 노트의 내용을 효율적으로 검색할 수 있도록 인덱스를 생성해야 합니다. 여기서는 벡터스토어(VectorStore) 인덱스 생성 방법을 사용하며, 이를 위해 먼저 ChromaDB를 설치합니다.

pip install --quiet chromadb

ChromaDB 설치 후, LangChain의 langchain_community.embeddings 모듈에서 HuggingFaceEmbeddings 클래스를 사용하여 한국어 임베딩 모델(jhgan/ko-sroberta-multitask)을 통해 노트의 내용을 벡터로 변환합니다. 그런 다음, langchain.indexes 모듈의 VectorstoreIndexCreator 클래스를 사용하여 인덱스를 생성합니다.

from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain.indexes import VectorstoreIndexCreator

# embedding 모델을 명시적으로 지정하지 않으면, 
# 기본적으로 langchain의 기본 임베딩 모델(OpenAI의 text-embedding-ada-002)를 사용합니다.
# index = VectorstoreIndexCreator().from_loaders([loader])

# HuggingFace의 임베딩 모델을 사용하려면, 
# HuggingFaceEmbeddings 클래스에 모델 이름을 지정해 인스턴스를 생성합니다.
embeddings = HuggingFaceEmbeddings(model_name="jhgan/ko-sroberta-multitask")
index = VectorstoreIndexCreator(embedding=embeddings).from_loaders([loader])

OpenAI의 임베딩 모델을 사용하려면, OPENAI_API_KEY 가 필요합니다.


질문하기

마지막으로, 생성된 인덱스를 사용하여 특정 질문에 대한 답변을 검색해 보겠습니다. 여기서는 Google의 gemini-pro AI 모델을 사용하여 질문("습관이란 무엇인가요?")에 대한 답변을 생성합니다.

from langchain_google_genai import ChatGoogleGenerativeAI

query = "습관이란 무엇인가요?"

# llm 모델을 명시적으로 지정하지 않으면, 
# 기본적으로 langchain의 기본 모델(OpenAI의 gpt-3.5-turbo-instruct)를 사용합니다.
# index.query_with_sources(query)

# Google의 Generative AI 모델인 "gemini-pro"를 사용하여 쿼리를 실행합니다.
llm = ChatGoogleGenerativeAI(model="gemini-pro")
index.query_with_sources(query, llm=llm)

이 코드는 사용자가 정의한 질문에 대한 답변을 검색하고, 그 결과를 반환합니다. 반환된 결과는 질문, 답변, 그리고 사용된 소스 정보를 포함합니다.

{'question': '습관이란 무엇인가?',
 'answer': '습관이란 반복적으로 하는 행위가 되풀이되어 생기는, 비교적 고정된 반응 양식을 말합니다.\n',
 'sources': '20220913 습관이란 무엇인가.md'}

Ollama를 사용하는 방법

LangChain을 활용하는 또 다른 방법으로는 Ollama 도구를 사용하는 것입니다. Ollama는 다양한 AI 모델을 로컬 환경에서 쉽게 실행할 수 있도록 지원하는 도구입니다. 아래 예제는 Ollama 를 이용하여 질문에 대한 답변을 인덱스에서 검색하는 코드입니다.

from langchain_community.llms import Ollama

llm = Ollama(model="mistral")

query = "습관이란 무엇인가요?"
index.query_with_sources(query, llm=llm)

마치며

이 예제를 통해, 옵시디언 노트를 가져와서 인덱스를 생성하고, 생성된 인덱스를 활용해 질문에 대한 답변을 검색하는 전체 과정을 살펴보았습니다. 이 방법을 사용하면, 복잡한 노트의 내용을 쉽게 탐색하고, 필요한 정보를 빠르게 찾을 수 있습니다.


References

Links

or

[카카오페이로 후원하기] [토스페이로 후원하기]

반응형