텍스트를 숫자 벡터로 바꿔 의미 기반으로 검색하는 벡터DB가 AI 파이프라인의 핵심 부품으로 자리잡았다. 그중 Pinecone(파인콘)은 서버 설정 없이 바로 쓸 수 있는 클라우드 방식으로 입문이 쉽다. 무료 플랜(Starter)만으로도 RAG(Retrieval-Augmented Generation — 검색으로 LLM 답변 품질을 높이는 기법) 프로토타입을 돌릴 수 있다. 벡터DB 개념부터 가입, Python SDK 예시, RAG 연결 개념까지 다룬다.
벡터DB란 무엇인가
관계형 DB(MySQL, PostgreSQL 등)는 WHERE name = '홍길동' 처럼 정확히 일치하는 조건으로 검색한다. 반면 벡터DB는 데이터를 수백~수천 차원짜리 숫자 배열(벡터)로 저장하고 “이 벡터와 가장 의미가 비슷한 항목을 찾아줘”라는 유사도 검색을 수행한다.
임베딩(embedding) 벡터는 문장이나 이미지를 AI 모델이 의미를 보존한 채 숫자 배열로 변환한 결과다. “강아지”와 “개”를 임베딩하면 벡터 공간에서 두 점이 가까이 위치하고, “강아지”와 “세금”은 멀리 위치한다. 벡터DB는 이 거리를 계산해 유사 항목을 빠르게 반환한다. 주요 용도는 문서 검색, 추천 시스템, 그리고 LLM에게 관련 문서를 먼저 건네주는 RAG 파이프라인이다.
Pinecone 소개와 무료 플랜 한도
Pinecone은 2019년 설립된 클라우드 전용 벡터DB다. 서버 없이 API 키 하나로 인덱스를 만들고 벡터를 올릴 수 있다. 2024년 서버리스(Serverless) 아키텍처로 전환하면서 무료 플랜 한도도 대폭 늘었다.
2026년 6월 기준 Starter(무료) 플랜 주요 한도는 다음과 같다.
| 항목 | 한도 |
|---|---|
| 인덱스 수 | 5개 |
| 스토리지 | 2 GB (약 30만 벡터 수용 가능) |
| 쓰기 단위 | 월 200만 write units |
| 읽기 단위 | 월 100만 read units |
| 리전 | AWS us-east-1 고정 |
| 비활성 정책 | 3주 미사용 시 인덱스 일시 정지 |
| 프로젝트 / 사용자 | 1 프로젝트 / 최대 2명 |
프로토타입에는 넉넉한 수준이다. 유료 전환이 필요해지는 시점은 수십만 벡터를 넘거나 응답 지연시간(latency) SLA 보장이 필요해질 때다.
pip install pinecone 명령으로 Python 클라이언트 설치. 버전 5 이상 권장.인덱스 생성과 벡터 업서트
인덱스(index)는 벡터를 담는 컨테이너다. 생성 시 차원 수(dimension)와 거리 메트릭(metric — 유사도 계산 방식)을 지정한다. OpenAI text-embedding-3-small 기준 차원은 1536이고 코사인(cosine) 유사도를 주로 쓴다. 업서트(upsert)는 “없으면 삽입, 있으면 덮어쓰기” 합성어로, Pinecone은 INSERT/UPDATE 구분 없이 upsert 하나로 처리한다.
import os
from pinecone import Pinecone, ServerlessSpec
pc = Pinecone(api_key=os.environ["PINECONE_API_KEY"])
INDEX_NAME = "my-rag-index"
if INDEX_NAME not in pc.list_indexes().names():
pc.create_index(
name=INDEX_NAME,
dimension=1536,
metric="cosine",
spec=ServerlessSpec(cloud="aws", region="us-east-1"),
)
index = pc.Index(INDEX_NAME)
vectors = [
{
"id": "doc-001",
"values": [0.012, -0.087, 0.153, 0.0], # 실제 임베딩 벡터 삽입
"metadata": {"text": "벡터DB 소개", "source": "intro"},
},
{
"id": "doc-002",
"values": [0.045, 0.021, -0.064, 0.0],
"metadata": {"text": "RAG 개요", "source": "rag"},
},
]
index.upsert(vectors=vectors, namespace="demo")
메타데이터(metadata)는 벡터에 붙이는 부가 정보다. 원본 텍스트, 출처, 날짜 등을 dict로 저장해두면 검색 후 실제 내용을 꺼내 쓸 때 편하다.
유사도 검색(쿼리) 코드 예시
저장한 벡터를 찾아오려면 질문을 임베딩한 뒤 그 벡터로 쿼리한다. top_k는 “가장 유사한 N개를 반환”하는 파라미터다.
아래는 쿼리 코드 예시다. 실제 서비스에서는 query_vector 자리에 임베딩 API 호출 결과를 넣는다.
query_vector = [0.013, -0.085, 0.149, 0.0] # 실제 임베딩 결과 삽입
results = index.query(
vector=query_vector,
top_k=3,
namespace="demo",
include_metadata=True,
)
for match in results.matches:
print(f"ID: {match.id} | 유사도 점수: {match.score:.4f}")
if match.metadata:
print(f" 텍스트: {match.metadata.get('text', '')}")
유사도 점수(score)는 0~1 사이 값이며 1에 가까울수록 질문과 의미적으로 유사하다. 통상 0.7 이상이면 관련성 높은 문서로 판단한다.
RAG 구현 시작 — Pinecone과 LLM 연결
RAG(Retrieval-Augmented Generation)는 LLM이 모르는 내용도 내 문서를 검색해 답변에 활용하게 만드는 구조다. Pinecone이 검색, GPT-4o나 Claude 같은 LLM이 생성을 담당한다.
흐름은 간단하다. 사내 문서나 보고서를 일정 길이로 잘라(청킹, chunking) 임베딩한 뒤 Pinecone에 올린다. 사용자가 질문하면 그 질문도 임베딩해 Pinecone에 쿼리하고 유사 문서 조각 3~5개를 받아온다. 그 조각을 프롬프트 앞에 붙여 LLM에 전달하면 문서 기반 답변이 나온다. LLM 자체를 재학습(파인튜닝)하지 않아도 되므로 비용과 시간 면에서 실용적이다.
자주 묻는 질문 FAQ
Q1) Pinecone 무료 플랜에서 카드 등록 없이 바로 쓸 수 있나요?
그렇다. 가입 시 신용카드 정보를 입력하지 않아도 Starter 플랜이 자동 적용된다. 카드 등록은 유료 플랜 업그레이드 시에만 필요하다.
Q2) 무료 플랜에서 몇 개의 벡터를 저장할 수 있나요?
스토리지 2 GB 기준, 1536차원 임베딩으로 약 25~30만 벡터를 수용한다. 소규모 RAG 프로토타입에 충분하다.
Q3) 3주 비활성 정책이란 어떤 의미인가요?
3주간 쿼리나 업서트가 없으면 인덱스가 자동으로 일시 정지된다. 재접속 시 수십 초면 복구되고 데이터는 삭제되지 않는다.
Q4) OpenAI 임베딩 API 없이도 쓸 수 있나요?
가능하다. Pinecone은 벡터 저장과 검색만 담당한다. HuggingFace의 sentence-transformers 같은 오픈소스 모델로 벡터를 만들어 올려도 된다.
Q5) LangChain이나 LlamaIndex와 함께 쓸 수 있나요?
두 프레임워크 모두 Pinecone 공식 통합을 제공한다. PineconeVectorStore 클래스 하나로 청킹, 임베딩, 업서트, 쿼리를 묶어 처리할 수 있다.