brew install pgvectorsudo apt update
sudo apt install postgresql-server-dev-14 # PostgreSQL 버전에 따라 수정
git clone https://github.com/pgvector/pgvector.git
cd pgvector
make
sudo make installFROM postgres:14
RUN apt-get update && apt-get install -y postgresql-server-dev-14 git make gcc
RUN git clone https://github.com/pgvector/pgvector.git && cd pgvector && make && make installCREATE EXTENSION IF NOT EXISTS vector;CREATE TABLE post_chunks (
post_id BIGINT NOT NULL,
chunk_index INT NOT NULL,
content TEXT NOT NULL,
embedding VECTOR(1536) NOT NULL,
PRIMARY KEY (post_id, chunk_index),
FOREIGN KEY (post_id)
REFERENCES blog_post(id)
ON DELETE CASCADE
);
CREATE INDEX idx_post_chunks_embedding
ON post_chunks
USING hnsw (embedding vector_cosine_ops);CREATE TABLE post_title_embeddings (
post_id BIGINT NOT NULL,
embedding VECTOR(1536) NOT NULL,
FOREIGN KEY (post_id)
REFERENCES blog_post(id)
ON DELETE CASCADE
);
CREATE INDEX idx_post_title_embeddings_embedding
ON post_title_embeddings
USING hnsw (embedding vector_cosine_ops);- ANN (Approximate Nearest Neighbor) 그래프 기반 인덱스 구조
- 빠른 탐색, 높은 정확도
- 소규모 데이터셋에서도 ivfflat보다 우수한 성능
- PostgreSQL에서는 pgvector v0.5.0+부터 지원 (
USING hnsw) - 데이터량 많아지면
ivfflat으로 변경 고려
하이브리드 검색의 키워드/부분일치 성능 향상을 위해 pg_trgm 확장 및 GIN 인덱스를 추가합니다.
프로젝트에 제공된 스크립트를 사용하세요:
docs/migrations/2025-01-pgtrgm.sql
내용:
CREATE EXTENSION IF NOT EXISTS pg_trgm;
CREATE INDEX IF NOT EXISTS idx_pc_content_trgm ON post_chunks USING gin (content gin_trgm_ops);
CREATE INDEX IF NOT EXISTS idx_bp_title_trgm ON blog_post USING gin (title gin_trgm_ops);- 환경변수
DATABASE_URL이 설정된 경우:
psql "$DATABASE_URL" -f docs/migrations/2025-01-pgtrgm.sql- 또는 npm 스크립트 사용:
npm run db:migrate:pgtrgm- 또는 수동 실행(PostgreSQL 쉘 접속 후):
\i docs/migrations/2025-01-pgtrgm.sql주의: 인덱스는 쓰기 비용과 디스크 사용량을 증가시킵니다. 텍스트 검색에 사용하는 컬럼(post_chunks.content, blog_post.title)에만 생성하세요.
임베딩 생성 작업을 Redis 큐에 적재한 뒤 Node.js 워커가 안전하게 처리하도록 구성할 수 있습니다.
.env 또는 배포 환경 변수를 통해 다음 값을 설정하세요 (필요 시 기본값 사용 가능).
# Redis 연결 (예: 외부 매니지드 인스턴스)
REDIS_URL=redis://username:password@your-redis-host:6379
# 또는 REDIS_HOST/REDIS_PORT 조합 사용 (둘 중 하나만 설정)
# 큐 이름
EMBEDDING_QUEUE_KEY=embedding:queue
EMBEDDING_FAILED_QUEUE_KEY=embedding:failed
# 워커 재시도 설정 (선택)
EMBEDDING_WORKER_MAX_RETRIES=3
EMBEDDING_WORKER_BACKOFF_MS=5000npm run build # TypeScript 컴파일
npm run start # Express API
npm run worker # 프로덕션 워커 (빌드 후)
# 또는 개발용 실시간 실행
npm run worker:devdocker-compose.yml 에는 API와 워커 서비스가 정의되어 있습니다. 외부 Redis 에 접속하도록 .env 의 REDIS_URL 을 설정한 뒤 아래 명령으로 기동하세요.
docker compose up --build로컬에서 자체 Redis 컨테이너가 필요하다면 compose 파일에 Redis 서비스를 별도로 추가한 뒤 REDIS_URL 또는 REDIS_HOST/PORT 를 해당 컨테이너로 지정하세요.
필요 시 워커만 스케일링할 수도 있습니다.
docker compose up --build --scale worker=3Redis 큐 상태는 redis-cli 또는 LLEN embedding:queue 같은 명령으로 확인하세요.