Pinecone의 완전 관리형 아키텍처, 서버리스와 팟 배포 모델, 네임스페이스, 메타데이터 필터링, 하이브리드 검색, 보안 컴플라이언스, Python SDK 실습을 다룹니다.
Pinecone은 대표적인 완전 관리형(Fully Managed) 벡터 데이터베이스입니다. 인프라 운영 부담 없이 벡터 검색 기능만 사용할 수 있다는 것이 핵심 가치입니다. 인덱스 구축, 스케일링, 모니터링, 보안을 모두 Pinecone이 처리합니다.
2024년 기준으로 수만 개의 조직에서 사용되고 있으며, SOC2 Type II, HIPAA, GDPR 컴플라이언스를 갖추어 엔터프라이즈 환경에서도 채택이 가능합니다.
Pinecone은 두 가지 배포 모델을 제공합니다.
2024년에 도입된 서버리스 모델은 사용한 만큼만 과금되는 구조입니다. 벡터 저장량과 읽기/쓰기 단위(Read/Write Units)를 기준으로 과금됩니다.
특징:
전용 인프라를 할당받는 전통적인 모델입니다. 성능 예측이 중요하거나 지속적으로 높은 트래픽을 처리해야 할 때 적합합니다.
팟 타입:
| 기준 | 서버리스 | 팟 |
|---|---|---|
| 비용 모델 | 사용량 기반 | 시간 기반 |
| 스케일링 | 자동 | 수동 (레플리카 추가) |
| 최소 비용 | 무료 티어 | 약 $70/월 |
| 적합한 사용 | 변동 트래픽, 개발/PoC | 안정적 높은 트래픽 |
대부분의 신규 프로젝트에서는 서버리스로 시작하는 것을 권장합니다. 트래픽 패턴이 명확해진 후 비용 최적화가 필요하면 팟으로 전환할 수 있습니다.
from pinecone import Pinecone, ServerlessSpec
# 클라이언트 초기화
pc = Pinecone(api_key="YOUR_API_KEY")
# 서버리스 인덱스 생성
pc.create_index(
name="articles",
dimension=1536,
metric="cosine",
spec=ServerlessSpec(
cloud="aws",
region="us-east-1"
)
)
# 인덱스 연결
index = pc.Index("articles")
# 벡터 삽입 (upsert)
index.upsert(
vectors=[
{
"id": "article-001",
"values": [0.1, 0.2, ...], # 1536차원 벡터
"metadata": {
"title": "벡터 데이터베이스 입문",
"category": "database",
"published_year": 2024,
"tags": ["vector-db", "ai"]
}
},
{
"id": "article-002",
"values": [0.3, 0.1, ...],
"metadata": {
"title": "HNSW 알고리즘 분석",
"category": "algorithm",
"published_year": 2025,
"tags": ["hnsw", "ann"]
}
}
],
namespace="tech-blog"
)**네임스페이스(Namespace)**는 하나의 인덱스 내에서 데이터를 논리적으로 분리하는 기능입니다. 멀티테넌시 구현에 유용합니다.
# 네임스페이스별 삽입
index.upsert(vectors=[...], namespace="user-a")
index.upsert(vectors=[...], namespace="user-b")
# 네임스페이스별 검색 (다른 네임스페이스의 데이터에 접근 불가)
results = index.query(
vector=[0.1, 0.2, ...],
top_k=10,
namespace="user-a"
)
# 네임스페이스 삭제 (해당 네임스페이스의 모든 벡터 삭제)
index.delete(delete_all=True, namespace="user-a")네임스페이스는 추가 비용 없이 무제한 생성할 수 있습니다. SaaS 애플리케이션에서 고객별 데이터 격리에 매우 유용합니다. 다만 네임스페이스 간 검색은 불가능하므로, 전체 데이터를 대상으로 검색해야 하는 경우에는 적합하지 않습니다.
Pinecone의 메타데이터 필터링은 벡터 검색과 동시에 구조화 데이터 조건을 적용할 수 있습니다.
# 복합 필터링
results = index.query(
vector=[0.1, 0.2, ...],
top_k=10,
filter={
"$and": [
{"category": {"$eq": "database"}},
{"published_year": {"$gte": 2024}},
{"tags": {"$in": ["vector-db", "ai"]}}
]
},
include_metadata=True,
namespace="tech-blog"
)
for match in results.matches:
print(f"ID: {match.id}")
print(f"Score: {match.score:.4f}")
print(f"Title: {match.metadata['title']}")| 연산자 | 설명 | 예시 |
|---|---|---|
$eq | 같음 | "category": {"$eq": "ai"} |
$ne | 같지 않음 | "status": {"$ne": "draft"} |
$gt, $gte | 초과, 이상 | "year": {"$gte": 2024} |
$lt, $lte | 미만, 이하 | "price": {"$lt": 100} |
$in | 포함 | "tags": {"$in": ["ai"]} |
$nin | 미포함 | "tags": {"$nin": ["draft"]} |
$and, $or | 논리 조합 | 위 예시 참조 |
Pinecone은 **밀집 벡터(Dense Vector)**와 **희소 벡터(Sparse Vector)**를 동시에 지원합니다. 희소 벡터는 BM25나 SPLADE 같은 키워드 기반 표현을 저장하며, 이를 통해 시맨틱 검색과 키워드 검색을 결합한 하이브리드 검색이 가능합니다.
# 하이브리드 검색용 벡터 삽입
index.upsert(
vectors=[
{
"id": "doc-001",
"values": [0.1, 0.2, ...], # 밀집 벡터 (시맨틱)
"sparse_values": {
"indices": [102, 512, 1024], # 희소 벡터 인덱스
"values": [0.8, 0.5, 0.3] # 희소 벡터 값
},
"metadata": {"title": "벡터 DB 가이드"}
}
]
)
# 하이브리드 쿼리 (alpha로 밀집/희소 비중 조절)
results = index.query(
vector=[0.1, 0.2, ...], # 밀집 쿼리 벡터
sparse_vector={
"indices": [102, 512],
"values": [1.0, 0.7]
},
top_k=10
)희소 벡터를 사용하려면 인덱스 생성 시 metric="dotproduct"으로 설정해야 합니다. 코사인 유사도 메트릭으로는 희소 벡터를 사용할 수 없으니, 하이브리드 검색 계획이 있다면 처음부터 내적(dot product) 메트릭으로 인덱스를 생성하는 것이 좋습니다.
Pinecone 서버리스의 비용은 저장량과 쿼리 패턴에 따라 크게 달라집니다. 100만 개의 1536차원 벡터를 저장하고 하루 10만 쿼리를 실행한다면, 월 $20-50 정도를 예상할 수 있습니다. 정확한 비용은 공식 가격 계산기로 확인하는 것이 좋습니다.
Pinecone을 사용한 간단한 RAG 파이프라인을 구현해 보겠습니다.
from openai import OpenAI
from pinecone import Pinecone
openai_client = OpenAI()
pc = Pinecone(api_key="YOUR_PINECONE_KEY")
index = pc.Index("knowledge-base")
def rag_query(question: str, top_k: int = 5) -> str:
"""RAG 파이프라인: 질문 -> 검색 -> 생성"""
# 1. 질문을 임베딩으로 변환
embedding = openai_client.embeddings.create(
model="text-embedding-3-small",
input=question
).data[0].embedding
# 2. Pinecone에서 관련 문서 검색
results = index.query(
vector=embedding,
top_k=top_k,
include_metadata=True,
namespace="documents"
)
# 3. 검색 결과를 컨텍스트로 조합
context = "\n\n".join([
f"[출처: {m.metadata['title']}]\n{m.metadata['content']}"
for m in results.matches
])
# 4. LLM으로 답변 생성
response = openai_client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": f"다음 자료를 참고하여 답변하세요:\n\n{context}"},
{"role": "user", "content": question}
]
)
return response.choices[0].message.content
# 사용
answer = rag_query("벡터 데이터베이스의 HNSW 인덱스란?")
print(answer)이번 장에서는 Pinecone의 완전 관리형 아키텍처와 핵심 기능을 살펴보았습니다. 서버리스 모델은 운영 부담을 최소화하면서 비용 효율적인 벡터 검색을 제공하고, 네임스페이스와 메타데이터 필터링으로 복잡한 데이터 모델을 구현할 수 있습니다. 희소 벡터를 활용한 하이브리드 검색은 순수 시맨틱 검색의 한계를 보완합니다.
다음 장에서는 오픈소스 벡터 검색 엔진인 Weaviate를 다룹니다. 오브젝트 지향 스키마, 모듈화 아키텍처, 내장 벡터라이저 등 Pinecone과는 다른 접근 방식을 살펴보겠습니다.
이 글이 도움이 되셨나요?
Weaviate의 오브젝트 지향 스키마, 모듈화 아키텍처, 내장 벡터라이저, 멀티테넌시, BlockMax WAND 하이브리드 검색, GraphQL API, 배포 옵션과 Python 실습을 다룹니다.
DiskANN의 Vamana 그래프 아키텍처와 SSD 최적화 전략을 분석하고, 10억+ 벡터 스케일에서의 성능, Fresh DiskANN과 Filtered DiskANN을 다룹니다.
Rust 기반 고성능 벡터 엔진 Qdrant의 페이로드 필터링, 명명된 벡터, 하이브리드 배포를 분석하고, PostgreSQL 확장 pgvector의 트랜잭션 일관성과 pgvectorscale 성능을 비교합니다.