💡 벡터 DB란?
📌 개념 요약
"문장이나 문서를 수치화한 벡터를 저장하고, 유사한 벡터를 빠르게 찾을 수 있도록 도와주는 데이터베이스"
- 문장을 **숫자의 배열 (벡터)**로 바꾼 뒤,
- 유사한 문장을 거리 기반으로 빠르게 검색함
💬 예시
"반품 정책 알려줘요" → [0.12, -0.45, 0.89, ...]
"환불 어떻게 해요?" → 유사한 벡터 → 관련 문서 매칭됨!
🧠 원리 (어떻게 작동하는가)
- Embedding 모델로 텍스트 → 벡터 변환
→ 예: OpenAI Embeddings, BERT, Cohere 등 - 벡터를 저장
→ FAISS, Chroma, Weaviate, Pinecone 등이 사용됨 - 쿼리도 벡터화 후
→ 기존 벡터들과 코사인 유사도 같은 기준으로 유사한 것 검색
🧭 결국, 문장 간의 의미 기반 검색이 가능해짐!
🔧 사용법 (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 종류 비교
| 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 |