Chatbot 프로젝트/LangChain
7. RAG를 위한 LangChain의 핵심 구성 요소 및 실습[Vector Stores]
조찬국
2024. 11. 24. 20:02
728x90
1. Vector Stores의 개념
elsatic search, redis, mongo db, postgreSQL의 기존 데이터베이스와 달리 chroma, pinecone, faiss 같은 벡터 DB는 고차원적인 벡터 데이터를 다루는 것에 가장 유용하다. 기존 DB는 구조를 가지는 정형화된 반면, 벡터 DB는 비정형적인 db(몽고 DB)같은 DB들이 뜨다가, 벡터 임베딩을 다루는 DB들이 점차 증가하게 되었다. vector library는 DB로서의 기능(CRUD)은 없다. 이는 벡터 임베딩을 임시적으로 저장하고, 내가 원하는 유사도가 높은 임베딩을 찾아내는 그런 검색에 특화된 라이브러리이다.
FAISS는 메타에서 만든 라이브러리인데, 이것만 잘 활용해도 RAG 시스템을 구축하는데 문제가 없다.
다만, 장기적으로 서비스를 제대로 구축하기 위해서는 벡터 DB를 운영해야한다.
2. Vector Stores 실습
2.1. Chroma Store (vector DB)
pip install -q chromadb
import os
from langchain.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_openai import OpenAIEmbeddings
from langchain.vectorstores import Chroma
os.environ["OPENAI_API_KEY"] = "YOUR API KEY"
openai_embedding=OpenAIEmbeddings(model = 'text-embedding-3-small')
loader = PyPDFLoader(r"/content/drive/MyDrive/마소캠퍼스/대한민국 헌법.pdf")
pages = loader.load_and_split()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=0)
docs = text_splitter.split_documents(pages)
db = Chroma.from_documents(docs, openai_embedding)
db = Chroma.from_documents(docs, openai_embedding)
=>
from_documents(Document 객체, 임베딩 모델): 임베딩 모델에 의해 자동으로 Document 객체를 임베딩한 후에 Chroma Vector DB에 저장한다.
query = "대통령의 임기는?"
#유사 문서 검색
docs = db.similarity_search(query)
print(docs[0])
#유사 문서 검색 및 유사도 출력
db.similarity_search_with_score(query)
<결과>
해당 코드는 문장간의 거리를 나타낸다. 즉, 점수가 높으면 높을수록 거리가 더 멀다는 의미이므로 가장 점수가 낮은 문장이 질문 문장과 유사도가 높다고 판단하는것이다.
2.2. Chroma에 저장되어있던 Docs 전부 지우기
Chroma().delete_collection()
2.3. 로컬 저장소에 ChromaDB 저장
from langchain.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import Chroma
loader = PyPDFLoader(r"/content/drive/MyDrive/마소캠퍼스/대한민국 헌법.pdf")
pages = loader.load_and_split()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=0)
docs = text_splitter.split_documents(pages)
#HuggingfaceEmbedding 함수로 Open source 임베딩 모델 로드
model_name = "jhgan/ko-sroberta-multitask"
ko_embedding= HuggingFaceEmbeddings(
model_name=model_name
)
#save to disk
db2 = Chroma.from_documents(docs, ko_embedding, persist_directory="./chroma_db")
<결과>
2.3. 로컬 저장소에 ChromaDB 불러오기
# load from disk
db3 = Chroma(persist_directory="./chroma_db", embedding_function=ko_embedding)
query = "대통령의 임기는?"
result = db3.similarity_search(query)
print(result[0].page_content)
728x90