💡 벡터 DB란?

📌 개념 요약

"문장이나 문서를 수치화한 벡터를 저장하고, 유사한 벡터를 빠르게 찾을 수 있도록 도와주는 데이터베이스"

  • 문장을 **숫자의 배열 (벡터)**로 바꾼 뒤,
  • 유사한 문장을 거리 기반으로 빠르게 검색

💬 예시

"반품 정책 알려줘요" → [0.12, -0.45, 0.89, ...]
"환불 어떻게 해요?" → 유사한 벡터 → 관련 문서 매칭됨!

🧠 원리 (어떻게 작동하는가)

  1. Embedding 모델로 텍스트 → 벡터 변환
    → 예: OpenAI Embeddings, BERT, Cohere 등
  2. 벡터를 저장
    → FAISS, Chroma, Weaviate, Pinecone 등이 사용됨
  3. 쿼리도 벡터화
    → 기존 벡터들과 코사인 유사도 같은 기준으로 유사한 것 검색

🧭 결국, 문장 간의 의미 기반 검색이 가능해짐!

 

🔧 사용법 (LangChain + FAISS 예시)

# 1. 문서 불러오기
from langchain.document_loaders import TextLoader
docs = TextLoader("data.txt").load()

# 2. 청크 나누기
from langchain.text_splitter import CharacterTextSplitter
splitter = CharacterTextSplitter(chunk_size=500, chunk_overlap=50)
chunks = splitter.split_documents(docs)

# 3. 벡터 DB 저장
from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
db = FAISS.from_documents(chunks, OpenAIEmbeddings())

# 4. 검색 쿼리 실행
query = "환불 절차 알려줘"
docs = db.similarity_search(query, k=3)
for doc in docs:
    print(doc.page_content)

🔍 청크 (Chunk)란?

큰 문서를 작은 조각(청크)으로 나누는 작업이에요.

왜 필요하냐고요?
🤖 LLM은 긴 텍스트를 한 번에 다 못 읽습니다!
그래서 적당히 자르고 검색에 사용해야 해요.

✂️ 청크의 구성

  • chunk_size: 각 조각의 최대 글자 수 (예: 500자)
  • chunk_overlap: 겹치는 부분 길이 (예: 50자 → 맥락 유지)

splitter = CharacterTextSplitter(chunk_size=500, chunk_overlap=50)

📋 예시

문서 내용나뉜 청크
"안녕하세요. 반품 정책은 다음과 같습니다..." → 청크 1: "안녕하세요. 반품 정책은 다..."
→ 청크 2: "정책은 다음과 같습니다..."

🧠 정리 요약

개념설명
🧊 벡터DB 문장을 숫자 배열로 저장하고, 의미 유사도 기반으로 검색
🧠 Embedding 문장을 벡터로 변환하는 기술
✂️ 청크 긴 문서를 일정 길이로 나눈 텍스트 조각
🔍 유사도 검색 코사인 유사도 등으로 가장 가까운 문장 찾기
🔄 RAG의 핵심 유저 질문 → 벡터화 → 벡터DB에서 유사 문장 검색 → LLM에 전달

🛠 벡터 DB 종류 비교

DB특징
FAISS Meta 개발, 로컬에서 빠름, 경량
Chroma 파이썬 친화적, LangChain 통합 잘 됨
Pinecone SaaS 기반, 확장성 좋음
Weaviate Graph + 벡터, REST API 지원

🤖 실전 팁

  • 청크 크기는 300~1000 글자 사이에서 조정
  • 청크 오버랩은 맥락 유지 위해 10~100 사이 권장
  • 벡터DB는 되도록 미리 저장해두고 재사용

'생성형AI프로그래밍' 카테고리의 다른 글

AI 에이전트란 ?  (1) 2025.04.19
파인튜닝 개념  (0) 2025.04.19
RAG 에 대해서  (0) 2025.04.19
OpenAI API 연동  (2) 2025.04.19
생성형AI 개발자는 무얼하는 사람인가요  (0) 2025.04.16

+ Recent posts