**벡터 데이터베이스(Vector Database)**는 텍스트, 이미지, 음성 등을 **숫자 배열(벡터)**로 변환해서 저장하고, 의미적 유사도로 검색하는 데이터베이스입니다.
| 검색 방식 | 일반 DB (PostgreSQL) | 벡터 DB (Pinecone) |
|---|---|---|
| 검색 기준 | 정확한 키워드 일치 | 의미적 유사도 |
| 예시 쿼리 | "iPhone 15" | "애플의 최신 스마트폰" |
| 결과 | "iPhone 15" 포함된 것만 | "iPhone 15", "아이폰 15", "Apple 최신 모델" 모두 |
| 속도 | O(log n) | O(√n) ~ O(n) (HNSW 알고리즘) |
텍스트를 숫자 배열로 변환하는 과정입니다.
예시:
from openai import OpenAI
client = OpenAI()
# 텍스트 → 벡터 변환
response = client.embeddings.create(
model="text-embedding-3-small",
input="AI 벡터 데이터베이스"
)
embedding = response.data[0].embedding
print(len(embedding)) # 1536 (차원)
print(embedding[:5]) # [-0.002, 0.013, -0.007, 0.025, -0.011]
"AI 벡터 데이터베이스"라는 문장이 1536개 숫자로 이루어진 벡터로 변환됩니다. 의미가 비슷한 문장은 벡터 공간에서 가깝게 위치합니다.
**RAG(Retrieval-Augmented Generation)**는 AI가 외부 지식을 참고해서 답변하는 기술입니다.
Pinecone은 관리형(Managed) 벡터 DB로, 인프라 관리 없이 바로 사용할 수 있습니다.
from pinecone import Pinecone, ServerlessSpec
pc = Pinecone(api_key="YOUR_API_KEY")
# 1. 인덱스 생성
pc.create_index(
name="my-index",
dimension=1536, # OpenAI text-embedding-3-small
metric="cosine",
spec=ServerlessSpec(cloud="aws", region="us-east-1")
)
# 2. 인덱스 연결
index = pc.Index("my-index")
# 3. 벡터 삽입
index.upsert(
vectors=[
{
"id": "doc1",
"values": embedding, # 1536차원 벡터
"metadata": {"text": "AI 벡터 데이터베이스 설명"}
}
]
)
# 4. 검색
results = index.query(
vector=query_embedding,
top_k=5,
include_metadata=True
)
for match in results["matches"]:
print(f"점수: {match['score']:.3f} | {match['metadata']['text']}")
Weaviate는 오픈소스 벡터 DB로, 자체 호스팅 또는 클라우드 버전 선택 가능합니다.
import weaviate
from weaviate.classes.config import Configure
client = weaviate.connect_to_weaviate_cloud(
cluster_url="https://my-cluster.weaviate.network",
auth_credentials=weaviate.auth.AuthApiKey("YOUR_API_KEY")
)
# 1. 스키마 생성
client.collections.create(
name="Document",
vectorizer_config=Configure.Vectorizer.text2vec_openai(),
properties=[
weaviate.classes.config.Property(
name="text",
data_type=weaviate.classes.config.DataType.TEXT
)
]
)
# 2. 데이터 삽입
documents = client.collections.get("Document")
documents.data.insert({
"text": "AI 벡터 데이터베이스는 의미적 검색을 가능하게 합니다."
})
# 3. 검색
response = documents.query.near_text(
query="벡터 DB 설명",
limit=5
)
for obj in response.objects:
print(obj.properties["text"])
ChromaDB는 로컬 개발에 최적화된 오픈소스 벡터 DB입니다.
import chromadb
# 1. 클라이언트 생성 (로컬 파일에 저장)
client = chromadb.PersistentClient(path="./chroma_db")
# 2. 컬렉션 생성
collection = client.create_collection(name="my_docs")
# 3. 문서 추가 (자동으로 임베딩 생성)
collection.add(
documents=["AI 벡터 데이터베이스", "RAG 구축 방법"],
metadatas=[{"source": "blog1"}, {"source": "blog2"}],
ids=["doc1", "doc2"]
)
# 4. 검색
results = collection.query(
query_texts=["벡터 DB 설명"],
n_results=2
)
print(results["documents"])
Supabase는 PostgreSQL에 pgvector 확장을 추가해서 벡터 검색 지원합니다.
-- 1. 테이블 생성
CREATE TABLE documents (
id SERIAL PRIMARY KEY,
content TEXT,
embedding VECTOR(1536)
);
-- 2. 벡터 삽입
INSERT INTO documents (content, embedding)
VALUES ('AI 벡터 데이터베이스', '[0.01, 0.02, ...]');
-- 3. 유사도 검색
SELECT content, 1 - (embedding <=> '[0.01, 0.02, ...]') AS similarity
FROM documents
ORDER BY embedding <=> '[0.01, 0.02, ...]'
LIMIT 5;
| 서비스 | 평균 응답 시간 | 정확도 (Recall@10) |
|---|---|---|
| Pinecone | 15ms | 99% |
| Weaviate | 22ms | 98% |
| ChromaDB | 120ms | 95% |
| pgvector | 200ms | 92% |
| 서비스 | 비용 | 비고 |
|---|---|---|
| Pinecone | $70 | Starter 플랜 |
| Weaviate Cloud | $50 | Standard 플랜 |
| ChromaDB | $0 | 자체 호스팅 (서버 비용 별도) |
| Supabase | $25 | Pro 플랜 |
회사 문서 100개를 기반으로 질문 답변 챗봇 구축
documents = [
"회사 휴가 정책: 연차는 입사 1년 후 15일 부여",
"출장 신청: 출장 3일 전까지 승인 필요",
"복지 제도: 점심 식대 월 10만원 지원"
]
import chromadb
from openai import OpenAI
client = OpenAI()
chroma_client = chromadb.PersistentClient(path="./company_kb")
collection = chroma_client.create_collection(name="company_docs")
# 임베딩 생성 및 저장
for i, doc in enumerate(documents):
embedding = client.embeddings.create(
model="text-embedding-3-small",
input=doc
).data[0].embedding
collection.add(
ids=[f"doc{i}"],
embeddings=[embedding],
documents=[doc]
)
def rag_chatbot(question):
# 1. 질문 임베딩
query_embedding = client.embeddings.create(
model="text-embedding-3-small",
input=question
).data[0].embedding
# 2. 유사 문서 검색
results = collection.query(
query_embeddings=[query_embedding],
n_results=3
)
# 3. 검색 결과를 컨텍스트로 GPT-4에 전달
context = "
".join(results["documents"][0])
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "system", "content": f"다음 회사 규정을 참고해서 답변:
{context}"},
{"role": "user", "content": question}
]
)
return response.choices[0].message.content
# 사용 예시
answer = rag_chatbot("휴가는 언제 받을 수 있나요?")
print(answer)
# → "입사 1년 후 연차 15일이 부여됩니다."
| 상황 | 추천 서비스 | 이유 |
|---|---|---|
| 프로토타입/개발 | ChromaDB | 무료, 설정 간단 |
| 중소규모 프로덕션 | Pinecone | 관리 편함, 빠름 |
| 대규모 엔터프라이즈 | Weaviate | 오픈소스, 커스터마이징 |
| 기존 PostgreSQL 사용 중 | Supabase pgvector | 기존 DB 확장 |
2026년, 벡터 데이터베이스는 모든 AI 애플리케이션의 필수 인프라가 되었습니다. RAG 챗봇, 추천 시스템, 이미지 검색 등 다양한 곳에서 활용되고 있습니다. 여러분도 지금 바로 시작해보세요!
참고 자료: