Featured Project / 대표 프로젝트
Project Cyan
AI Goods Shopping Assistant
AI 챗봇이 안내하는 아이돌/팬덤 굿즈 쇼핑몰입니다. 사용자가 자연어로 원하는 굿즈를 말하면, AI가 실제 판매 가능한 상품 후보를 조회하고 추천 문장을 생성하며 상품 상세 이동, 상품 하이라이트, 장바구니 담기 같은 화면 액션까지 실행하도록 설계했습니다.
Focus / 작업 초점
AI / Architecture / Integration
Core Problem / 핵심 문제
LLM 추천을 실제 판매 가능한 상품과 화면 액션으로 제한
Stack / 주요 기술
FastAPI, WebSocket, Spring, React, pgvector, OpenAI
Overview / 프로젝트 소개
쇼핑몰 AI 챗봇의 핵심은 답변을 잘 쓰는 것보다, 실제 구매 가능한 상품 안에서 추천하고 그 추천이 화면 행동으로 자연스럽게 이어지도록 만드는 것이었습니다. Project Cyan에서는 추천 후보 조회, LLM 응답 생성, 프론트엔드 액션 실행을 하나의 계약으로 묶어 hallucination과 잘못된 화면 조작을 줄였습니다.
Focus / 작업 초점
Architecture / 전체 구조
React Chat UI
사용자 메시지, AI 답변, 상품 카드 하이라이트, 장바구니 액션 실행을 WebSocket 메시지와 연결했습니다.
FastAPI AI Server
대화 컨텍스트를 관리하고 Spring API, embedding 검색, LLM 응답 생성을 조합하는 오케스트레이션 계층입니다.
Spring Semantic Search
사용자 발화를 embedding으로 변환한 뒤 pgvector에서 실제 판매 가능한 상품 후보를 조회합니다.
Commerce API
상품 상세 이동, 상품 하이라이트, 장바구니 담기처럼 화면에서 실행 가능한 액션을 API 계약과 맞춥니다.
Iteration / 추천 방식 개선 과정
1차 추천 / Keyword
사용자 발화에서 키워드를 추출해 상품 후보를 조회했습니다. 단순하고 빠르지만 조사, 부정형, 표현 차이를 충분히 처리하기 어려웠습니다.
2차 추천 / Normalize & Alias
조사 제거, 어미 처리, 띄어쓰기 정리, alias 테이블을 적용했습니다. 다만 예외가 늘어날수록 서버 수정과 데이터 보강이 반복됐습니다.
3차 추천 / Semantic Embedding
상품 정보와 사용자 발화를 embedding으로 변환해 pgvector에서 의미적으로 가까운 상품 후보를 찾도록 추천 방식을 확장했습니다.



Semantic Search / 벡터 검색 기반 추천
- 상품명, 아티스트, 카테고리, 태그, 설명을
text-embedding-3-small로 벡터화 - embedding 결과를 PostgreSQL
pgvector에 저장 - 사용자 발화를 embedding으로 변환
- Spring
semantic-search에서 판매 가능한 상품 후보 조회 - LLM은 후보
goodsId안에서만 답변과 ACTION 생성

Grounded Action / 안전한 ACTION 실행
Allowed Actions
AI가 임의의 화면 명령을 만들지 못하도록 action allowlist, Pydantic schema, 프론트엔드 검증을 함께 적용했습니다. 추천 문장과 화면 실행을 분리하지 않고 같은 후보 상품 집합에 묶어, 잘못된 상품으로 이동하거나 장바구니에 담기는 상황을 차단했습니다.
Data Pipeline / AI용 상품 데이터 공급
상품 DB를 AI가 읽기 쉬운 camelCase 컬럼으로 정규화하고, TSV-JSON 스냅샷을 Supabase Storage에 업로드했습니다. AI 서버는 signed URL로 최신 스냅샷을 조회하고 TTL 기반 cache로 반복 접근 비용을 줄였습니다.
Personalization / 개인화와 세션 기억

Collaboration / 협업과 문서화
API 계약 문서, Jira 일정, Notion 구현 기록과 TODO를 함께 관리했습니다. 특히 ACTION 계약은 백엔드 응답, AI 서버 schema, 프론트엔드 실행 로직이 동시에 맞아야 했기 때문에 변경 사항을 문서화하고 팀이 같은 용어로 확인할 수 있게 정리했습니다.
