이전글
이 글은 로컬 기반 AI 모델을 활용해 비용 없이 옵시디언에 RAG(Retrieval-Augmented Generation) 시스템을 구축하는 방법을 소개합니다.
사용 모델 및 라이브러리
- 벡터DB: Chroma
- 임베딩 모델: HuggingFace의 BAAI/bge-m3
- Rerank 모델: Cohere의 rerank-multilingual-v3.0
- AI 모델: Ollama EEVE-Korean-10.8B
구현 과정
임베딩 모델 불러오기
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 시스템을 구축하는 방법을 소개했습니다. 이 시스템을 통해 자신의 노트를 기반으로 개념을 질문하고, 조언을 얻으며, 정보를 검색할 수 있습니다.
옵시디언 관련 글
- 옵시디언 스팀잇 플러그인 업데이트: Dataview 코드 렌더링 기능 추가
- 옵시디언 PARA 방법론
- [개발] 옵시디언 노트 기반 RAG 시스템 구축하기 3
- [개발] 옵시디언 노트 기반 RAG 시스템 구축하기 2
- [개발] 옵시디언 노트 기반 RAG 시스템 구축하기 1
- [옵시디언] '네이버 책 검색 API'를 사용하여 독서노트 생성하기
- 옵시디언에서 유튜브 노트 빠르게 생성하기 with QuickAdd 플러그인
- 옵시디언 책 검색 플러그인 개발
- 옵시디언 스팀잇 플러그인 업데이트 v0.0.7
- 옵시디언 무료 퍼블리시하기 - 나만의 디지털 가든 만들기
- 옵시디언(Obsidian) 플러그인 개발 시작하는 방법
- 옵시디언(Obsidian) 스팀잇 플러그인 개발하기
[광고] STEEM 개발자 커뮤니티에 참여 하시면, 다양한 혜택을 받을 수 있습니다.
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
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
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
옵시디언에 로컬 AI 연결이 되니 엄청 좋네요!
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
내 노트에 AI가 연결되니 마치 나만의 두 번째 뇌가 생긴 것 같은 기분이 들어요. 정말 좋습니다. 이제 이걸 옵시디언 플러그인으로 개발할 일만 남았습니다.
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
'device': 'mps' for Apple Silicon Macs
오 저런 옵션이 있네요 T.T 맥실리콘 ^^
그래서 그래픽 카드도 이용하나 봅니다.
저는 cpu로 한번 시간날때 공부를 한번 해보아야겠습니다.
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
네 대부분 애플 실리콘 칩셋을 지원하더군요. 덕분에 맥북에서 AI를 잘 실행하고 있어요. ㅎㅎ
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit