순서

먼저 https://app.pinecone.io/ 방문해서 api-key를 생성한다.

 

vs pgvector

  • pgvector
    • 이미 PostgreSQL 기반 인프라가 있고, 자체 호스팅을 선호할 때
    • SQL과 벡터를 한 곳에서 관리하며, 커스터마이징·확장성을 직접 책임지고 싶을 때
  • Pinecone
    • “운영 부담 없이” 곧바로 대규모 서비스 전환이 필요할 때
    • 메타데이터·하이브리드 검색·자동 스케일링 같은 고급 기능을 즉시 활용

 

실습

 

#!/usr/bin/env python3
"""
demo_pinecone.py ─ Pinecone 4.x + OpenAI 임베딩 실습
"""

import os, sys, time, logging
from dotenv import load_dotenv
import openai
from pinecone import Pinecone, ServerlessSpec      # ⬅️ 새 방식

# ──────── 로그 설정 ────────
logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s [%(levelname)s] %(message)s",
    datefmt="%H:%M:%S",
)
log = logging.getLogger(__name__)

# ──────── 환경 변수 읽기 ────────
load_dotenv()
try:
    OPENAI_API_KEY  = os.environ["OPENAI_API_KEY"]
    PINECONE_API_KEY = os.environ["PINECONE_API_KEY"]
    PINECONE_ENV     = os.environ["PINECONE_ENV"]    # ex) us-east-1-aws
except KeyError as e:
    log.error("환경변수 %s 가 없습니다 (.env 확인)", e.args[0]); sys.exit(1)

openai.api_key = OPENAI_API_KEY

# Pinecone 인스턴스 생성
pc = Pinecone(api_key=PINECONE_API_KEY)

# env 문자열을 region / cloud 로 분해 (us-east-1-aws → us-east-1 + aws)
*region, cloud = PINECONE_ENV.split("-")
REGION = "-".join(region)   # us-east-1
CLOUD  = cloud              # aws

INDEX  = "demo-index"
DIM    = 1536

# ──────── 인덱스 생성 / 재사용 ────────
def wait_ready(name):
    while True:
        state = pc.describe_index(name).status.state
        if state == "Ready":
            return
        log.info("   ↳ index status = %s … 대기 중", state)
        time.sleep(2)

if INDEX not in pc.list_indexes().names():
    log.info("새 인덱스 생성: %s", INDEX)
    pc.create_index(
        name=INDEX,
        dimension=DIM,
        metric="cosine",
        spec=ServerlessSpec(cloud=CLOUD, region=REGION),
    )
    wait_ready(INDEX)
else:
    log.info("기존 인덱스 재사용: %s", INDEX)

index = pc.Index(INDEX)

# ──────── 데이터 업서트 ────────
DOCS = [
    "쿠팡은 한국 최대의 전자상거래 기업이다.",
    "파인콘은 벡터 데이터베이스 서비스다.",
    "오픈AI는 GPT-4o 모델을 발표했다.",
    "서울의 여름은 덥고 습하다.",
    "벡터 검색은 의미 기반 유사도를 계산한다.",
]

def embed(texts):
    resp = openai.embeddings.create(
        model="text-embedding-3-small",
        input=texts,
    )
    return [d.embedding for d in resp.data]

log.info("문서 %d개 임베딩 → Pinecone 업서트", len(DOCS))
vecs = embed(DOCS)
index.upsert(
    vectors=[(f"id-{i}", v, {"text": DOCS[i]}) for i, v in enumerate(vecs)]
)

# ──────── 질의 ────────
QUESTION = "유사도 검색을 위한 데이터베이스"
log.info("쿼리: “%s”", QUESTION)
q_vec = embed([QUESTION])[0]

res = index.query(vector=q_vec, top_k=3, include_metadata=True)
log.info("결과 (Top-3):")
for rnk, m in enumerate(res.matches, 1):
    log.info(" %d. %s (score=%.4f)", rnk, m.metadata["text"], m.score)

log.info("완료 ✅")

 

 

반응형

'Programming > LLM RAG' 카테고리의 다른 글

vector db  (1) 2025.06.14
LangChain/LangGraph  (0) 2025.06.13
TensorRT-LLM  (1) 2025.06.13
SGLang  (0) 2025.06.13
vLLM  (0) 2025.06.12

+ Recent posts