본문으로 건너뛰기

© 2026 Molayo

Zenn헤드라인2026. 06. 16. 09:15

pgvector와 Gemini로 만드는 RAG 파이프라인 — Embedding · Vector DB의 원리부터 구현까지

요약

pgvector와 Gemini를 활용하여 RAG(검색 증강 생성) 파이프라인을 구축하는 실습 가이드입니다. 임베딩의 원리부터 벡터 데이터베이스를 이용한 의미 기반 검색 구현까지의 과정을 다룹니다.

핵심 포인트

  • Gemini Embedding API를 이용한 텍스트의 벡터 변환 방법
  • pgvector를 활용한 코사인 유사도 기반 벡터 검색 구현
  • RAG 아키텍처의 핵심 동작 원리 이해
  • Docker와 Python 환경을 이용한 실무적인 개발 환경 설정

pgvector와 Gemini로 만드는 RAG 파이프라인 — Embedding · Vector DB의 원리부터 구현까지

AI 시스템 설계에 요구되는 기술 요소

AI 아키텍트 설계에 필요한 아키텍처 로드맵의 한 예로 다음과 같은 로드맵을 들 수 있습니다.

본 기사는 기초 단계(LLM의 원리 · Prompt Engineering · API/SDK)를 이해한 후, 첫 번째 구현 단계로 자리 잡고 있는 '응용' 단계의 3가지를 핸즈온(Hands-on)을 통해 배워나갑니다.

토픽본 기사에서의 구현 내용
RAG
pgvector와 Gemini를 결합한 RAG 파이프라인의 완전 구현
Embedding
Gemini Embedding API로 텍스트의 의미를 벡터(Vector)로 변환
Vector DB
pgvector로 코사인 유사도(Cosine Similarity)를 이용한 벡터 검색 구현

기초 지식

코드를 작성하기 전에, 이 기사에서 등장하는 3가지 개념을 직관적으로 이해해 둡시다.

Embedding (임베딩)이란

컴퓨터는 문자열 상태 그대로로는 '의미의 가까움'을 계산할 수 없습니다. Embedding은 텍스트를 수치 리스트(벡터)로 변환하는 기술로, 의미가 가까운 단어는 비슷한 패턴의 수치열이 됩니다.

「개」 → [0.82, 0.75, 0.10, ...] 768개의 수치
「고양이」 → [0.78, 0.72, 0.12, ...] ← 개와 비슷한 패턴
「은행」 → [0.08, 0.10, 0.85, ...] ← 전혀 다른 패턴

이 변환을 Gemini의 Embedding 모델이 담당합니다.

Vector DB (벡터 데이터베이스)란

일반적인 DB는 키워드 일치로 검색하지만, Vector DB는 '수치의 거리'로 검색합니다.

-- 일반적인 검색 (키워드가 일치하지 않으면 찾을 수 없음)
SELECT * FROM docs WHERE body LIKE '%F1 스코어%';
-- 벡터 검색 (의미가 가까우면 키워드가 달라도 찾을 수 있음)
...

'평가 지표 측정 방법'이라고 검색해도 'F1 스코어 계산 방법' 문서를 찾을 수 있는 이유가 바로 이것입니다. 이번에는 PostgreSQL의 확장 기능인 pgvector를 사용합니다.

RAG (검색 증강 생성)란

LLM은 학습 시의 데이터만 알고 있습니다. RAG는 '검색하여 취득한 정보를 LLM에 전달하는' 설계 패턴으로, 모델이 모르는 데이터라도 답변할 수 있게 해줍니다.

【일반적인 LLM】 질문 → 학습된 지식만으로 답변
【RAG】 질문 → Vector DB에서 검색 → 결과를 LLM에 전달 → 문서를 바탕으로 답변

환경 설정

전제 조건

  • pyenv 도입 완료
  • Docker 도입 완료
  • Google 계정 (Gemini API 키 취득용)

이용하는 도구

이번에는 Embedding 생성 및 답변 생성에 사용할 LLM은 Google Gemini API의 무료 티어를 이용하고, Vector DB는 Docker 컨테이너에서 구동하는 구성으로 진행합니다.

도구용도무료 티어
Google Gemini APIEmbedding 생성 · 답변 생성1,500 리퀘스트/일
...

1-1. 프로젝트의 Python 버전 고정

mkdir pgvector-tutorial && cd pgvector-tutorial
pyenv local 3.11.9
python --version
...

3.11.9

가 설치되어 있지 않다면 먼저 pyenv install 3.11.9를 실행해 주세요.

1-2. 가상 환경 생성 및 활성화

python -m venv .venv
source .venv/bin/activate
# 프롬프트가 (.venv)로 바뀌면 성공

1-3. 라이브러리 설치

pip install --upgrade pip
pip install psycopg2-binary google-genai python-dotenv
pip freeze > requirements.txt

주의: google-generativeai

(google-genai (신규 패키지))를 사용합니다. (기존 패키지인 google-generativeai가 아닙니다.)

1-4. pgvector가 포함된 PostgreSQL 실행

docker run -d \
--name pgvector-demo \
-e POSTGRES_PASSWORD=password \
...

실행 확인:

docker exec -it pgvector-demo psql -U postgres -d vectordb -c "SELECT version();"

1-5. 환경 변수 설정 (.env 파일)

GEMINI_API_KEY=AIza...
DB_HOST=localhost
DB_PORT=5432
...

Gemini API 키 취득 절차:

aistudio.google.com 에 접속하여 다음 절차로 취득할 수 있습니다.

  • Google 계정으로 로그인
  • 왼쪽 사이드바의 "Get API key" 클릭
  • "Create API key" 클릭
  • 표시된 AIza...로 시작하는 키를 복사

구현

디렉토리 구성

위에서부터 순서대로 실행합니다.

pgvector-tutorial/
├── .env
├── .python-version # pyenv local로 자동 생성
...

01_setup_db.py

  1. 데이터베이스 준비 —
# 01_setup_db.py
import psycopg2
from dotenv import load_dotenv
...
python 01_setup_db.py
# => 테이블 생성 완료

확인:

docker exec -it pgvector-demo psql -U postgres -d vectordb -c "\dx"
# => vector 0.8.x 가 표시되면 OK

차원 수(Dimension)에 대하여: gemini-embedding-001의 출력은 본래 3072차원이지만, pgvector의 HNSW 인덱스는 2000차원까지의 제한이 있기 때문에, output_dimensionality=768로 축소하여 사용합니다.

02_create_index.py

  1. HNSW 인덱스 생성 —
# 02_create_index.py
import psycopg2
from dotenv import load_dotenv
...
python 02_create_index.py
# => 인덱스 생성 완료

보충: mef_construction의 기준

용도mef_construction
개발·테스트832
운영(표준)1664
고정밀도 요구32128

03_ingest.py

  1. 문서 저장 —
# 03_ingest.py
import psycopg2
from google import genai
...
python 03_ingest.py
# => 저장 완료: id=1 / 머신러닝 모델의 평가 지표
# => 저장 완료: id=2 / scikit-learn에 의한 모델 평가
...

Gemini Embedding은 저장 측과 쿼리 측의 설정을 분리함으로써 정확도를 높일 수 있습니다. task_type에 대하여:

task_type용도
RETRIEVAL_DOCUMENTDB에 저장하는 문서 측
RETRIEVAL_QUERY검색 쿼리 측

04_search.py

  1. 벡터 검색 (기본 + 필터) —
# 04_search.py
import psycopg2
from google import genai
...
python 04_search.py
# => [0.7806] 머신러닝 모델의 평가 지표 (ML)
# => [0.7423] scikit-learn에 의한 모델 평가 (ML)
...

설계 메모: 필터 조건이 많은 경우에는 일반적인 B-tree 인덱스도 함께 생성하면 속도가 빨라집니다. CREATE INDEX ON documents (category); CREATE INDEX ON documents (created_at);

05_rag.py

  1. RAG 파이프라인 — Embedding과 LLM을 모두 Gemini로 통일함으로써, 완전 무료로 RAG를 구동할 수 있습니다.
# 05_rag.py
import psycopg2
from google import genai
...
python 05_rag.py

무료 티어 기준 (2026년 6월 시점):

모델: gemini-embedding-001 | 무료 티어: 일일 1,500 요청, 15 RPM
모델: gemini-2.5-flash | 무료 티어: 모델에 따라 다름 (AI Studio에서 확인)

동작 확인 체크리스트

# 1. pgvector가 활성화되어 있는지 확인
docker exec -it pgvector-demo psql -U postgres -d vectordb -c "\dx"
# => vector가 표시되면 OK
...

Discussion

AI 자동 생성 콘텐츠

본 콘텐츠는 Zenn AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0