Node.js(Express)와 TypeScript, PostgreSQL(pgvector), Docker Compose를 활용하여 구축한 검색 증강 생성(RAG) 기반의 AI 면접 서비스입니다. 단순한 LLM 래퍼(Wrapper)가 아닌, Vector DB에 저장된 고유한 데이터를 바탕으로 정확한 답변을 생성하는 파이프라인을 직접 구현하였습니다.
- RAG (Retrieval-Augmented Generation) 아키텍처의 핵심 원리 이해 및 구현
- **Vector Database (pgvector)**를 활용한 임베딩(Embedding) 저장 및 유사도 검색(Vector Search) 경험
- Docker Compose를 활용한 데이터베이스 인프라 구축 및 **포트 포워딩(Port Forwarding)**을 통한 로컬 충돌 해결
- LangChain 프레임워크를 활용한 LLM(Google Gemini)과 애플리케이션의 연동
- TypeScript 기반의 백엔드 API 서버 구축 및 비동기 데이터 처리
- Language: TypeScript, Node.js
- Framework: Express.js
- Database: PostgreSQL (with
pgvectorextension) - AI Model: Google Gemini 2.0 Flash / 1.5 Flash (via LangChain)
- Infrastructure: Docker, Docker Compose
- Libraries: @langchain/google-genai, @prisma/client, cors
이 시스템은 사용자의 질문을 벡터로 변환하여 DB에서 가장 유사한 문맥(Context)을 검색한 뒤, LLM에게 참고 자료로 제공하여 답변을 생성합니다.
- Express API Server (Node.js)
- 클라이언트(Front-end)의 요청을 받는 진입점
- LangChain을 통해 검색 및 생성 로직을 오케스트레이션
- Vector Database (PostgreSQL)
- Docker 컨테이너 위에서 구동
- 텍스트 데이터를 768차원의 벡터로 변환하여 저장
- Cosine Distance(코사인 유사도) 기반의 검색 기능 제공
- Data Ingestion Pipeline (Ingest)
- 텍스트 데이터를 청크(Chunk) 단위로 임베딩하여 DB에 적재하는 전처리 과정
- LLM (Google Gemini)
- 검색된 정보(Context)를 바탕으로 자연스러운 답변을 생성하는 추론 엔진
User Query -> Express Server -> Embedding (Gemini) -> Vector Search (PostgreSQL) -> LLM Generation (Gemini) -> Client Response
.
├── prisma/ # DB 스키마 정의 (schema.prisma) 및 마이그레이션 관리
├── node_modules/ # 의존성 패키지
├── server.ts # 메인 API 서버 (Express + RAG Logic)
├── ingest.ts # 데이터 적재 스크립트 (Embedding -> DB Insert)
├── rag.ts # RAG 로직 테스트용 스크립트
├── check-models.ts # 사용 가능한 Gemini 모델 리스트 조회 유틸
├── docker-compose.yml # PostgreSQL(pgvector) 컨테이너 설정
├── .env # 환경 변수 (API Key, DB URL)
├── index.html # 테스트용 간단한 프론트엔드 UI
├── package.json # 프로젝트 의존성 관리
└── README.md # 프로젝트 문서