Data & Research

[LLM & RAG] Langchain 기초 - Embedding/저장

물박사의 저장공간 2025. 4. 1. 23:10

1. Embedding

LangChain에서 지원하는 주요 Embedding 모델은 아래와 같습니다. 

1) Hugging Face Embedding

Hugging Face에서는 Transformers 모델을 사용하여 문서 임베딩을 생성할 수 있습니다. Hugging Face의 모델들은 여러 종류의 사전 훈련된 모델을 제공하며, 그 중 일부는 BERT, RoBERTa, DistilBERT, T5, GPT 등 다양한 종류의 임베딩을 제공합니다.

 

2) Google Generative Embedding

Google의 Generative Embedding은 특정 NLP 작업에서 효율적인 임베딩을 생성하는 모델입니다. Google API를 통해 Embedding을 생성할 수 있으며, 특히 T5, BERT와 같은 사전 훈련된 모델을 기반으로 합니다.

 

3) OpenAI Embedding

OpenAI의 GPT-3 모델을 기반으로 한 임베딩은 생성형 모델에서의 벡터 표현을 제공합니다. OpenAI의 임베딩은 특히 텍스트 생성 및 검색 태스크에서 유용합니다.

 

from langchain.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import FAISS
from langchain.text_splitter import CharacterTextSplitter
from langchain.document_loaders import TextLoader

# 1. 텍스트 파일 로드
loader = TextLoader("example.txt")
docs = loader.load()

# 2. 텍스트 분할
splitter = CharacterTextSplitter(chunk_size=200, chunk_overlap=50)
split_docs = splitter.split_documents(docs)

# 3. Hugging Face 모델을 사용한 임베딩 생성
embedding_model = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")
vector_store = FAISS.from_documents(split_docs, embedding_model)

 

 

2. Vector DB 저장

벡터 저장소는 Faiss(Facebook AI Similarity Search), Chroma, Elasticsearch, Pinecone 등 다양하게 존재하는데요, 목적(속도, 비용, 클라우드 지원 여부가 각각 다릅니다)에 맞게 선택해서 vector DB에 저장해야겠죠? 위의 예시 마지막 줄이 사실은 Vector DB저장 코드였습니다. 

Vector DB 특징
FAISS 로컬에서 빠르게 벡터 검색 수행
ChromaDB LangChain과 쉽게 연동 가능
Pinecone 클라우드 기반 대규모 검색 지원
Weaviate AI 기반으로 스칼라+벡터 검색 가능

 

FAISS (Facebook AI Similarity Search) 사용 예시

from langchain.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import FAISS
from langchain.text_splitter import CharacterTextSplitter
from langchain.document_loaders import TextLoader

# 1. 문서 로드
loader = TextLoader("example.txt")
docs = loader.load()

# 2. 문서 분할
splitter = CharacterTextSplitter(chunk_size=200, chunk_overlap=50)
split_docs = splitter.split_documents(docs)

# 3. HuggingFace Embedding 사용
embedding_model = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")

# 4. FAISS 벡터 저장소에 문서 저장
vector_store = FAISS.from_documents(split_docs, embedding_model)

# 5. 저장된 DB를 로컬에 저장
vector_store.save_local("faiss_index")

# 6. 저장된 DB를 불러오기
new_vector_store = FAISS.load_local("faiss_index", embedding_model)

# 7. 벡터 검색 수행
query = "What is LangChain?"
results = new_vector_store.similarity_search(query, k=3)
for res in results:
    print(res.page_content)

 

ChromaDB 사용 예시

from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.document_loaders import TextLoader
from langchain.text_splitter import CharacterTextSplitter

# 1. 문서 로드
loader = TextLoader("example.txt")
docs = loader.load()

# 2. 문서 분할
splitter = CharacterTextSplitter(chunk_size=200, chunk_overlap=50)
split_docs = splitter.split_documents(docs)

# 3. OpenAI Embeddings 사용
embedding_model = OpenAIEmbeddings()

# 4. ChromaDB에 저장
vector_store = Chroma.from_documents(split_docs, embedding_model, persist_directory="chroma_db")

# 5. 저장된 DB 불러오기
new_vector_store = Chroma(persist_directory="chroma_db", embedding_function=embedding_model)

# 6. 벡터 검색 수행
query = "What is LangChain?"
results = new_vector_store.similarity_search(query, k=3)
for res in results:
    print(res.page_content)

 

사실 마지막의 "벡터 검색 수행"은 Retriever인데요, 이 부분은 다음 포스팅에서 이어가겠습니다.