사진 한 장으로 퍼스널 컬러와 날씨를 읽다: LangGraph 코디 에이전트 StyleSense

서비스 링크: https://stylesense-khaki.vercel.app/
(※ 첫 접속 시 서버 기동으로 잠시 지연될 수 있습니다.)


📌 세 줄 요약

사진 한 장을 업로드하면 퍼스널 컬러를 진단하고, 실시간 날씨 맥락까지 결합해 오늘 입기 좋은 2가지 룩(Daily/Special)을 룩북 이미지로 추천해주는 서비스 “StyleSense”를 만들었습니다. 목표는 ‘그럴듯한 데모’가 아니라, 배포 링크로 실제 동작하는 제품까지 완성하는 것이었습니다.

그리고 이 프로젝트의 핵심은, 프롬프트를 길게 쓰는 것보다 확률적으로 흔들리는 AI 결과를 ‘아키텍처와 시스템’으로 통제하는 방법을 실제로 구현하고 검증하는 것이었습니다.


1) 배경: “오늘 뭐 입지?”를 AI로 풀어보고 싶었습니다

아이디어는 일상에서 출발했습니다. 옷을 좋아하든 싫어하든, 출근 전에는 늘 비슷한 고민을 합니다.

  • 오늘 날씨가 애매한데… 뭘 입지?
  • 톤에 맞게 입고 싶은데… 막상 고르기 어렵네?
  • 코디 추천은 많은데… 내 사진/내 톤까지 반영되면 좋겠다.

그래서 생각했습니다.

“사진 한 장만 올리면, 퍼스널 컬러와 날씨를 같이 반영해서 코디를 추천해주면 꽤 쓸모 있지 않을까?”


2) 시작은 빠르게: Gems → AI Studio → Cursor로 넘어간 이유

처음에는 속도가 중요하다고 생각해서, 가볍게 프로토타이핑부터 했습니다.

  • Gems: 30분 안에 결과는 나왔지만, 제가 원하는 방향으로 세부 튜닝하기가 어려웠습니다.
  • AI Studio: 빠르게 만들 수 있었지만, 제품 수준으로 “통제 가능한 형태”를 만들기에는 제한이 있었습니다.

결국 결론은 하나였습니다.

“내가 원하는 방향으로 ‘요리’하려면 자유도가 필요하다. 그럼 Cursor로 가자.”

다만 이 선택은 장점만 있진 않았습니다.
AI Studio는 플랫폼이 깔아둔 인프라/가드레일 위에서 달리지만, Cursor는 제가 하나씩 설계하고 통제해야 했습니다.
(덕분에 배포/의존성/CORS 같은 현실 이슈도 직접 밟고 해결했습니다. 힘들었지만… 성장(?) 😇)


3) 목표: 프로토타입이 아니라 ‘작동하는 제품’으로 끝내기

이번 목표는 단순히 기능 구현이 아니라, 사용자가 실제로 쓸 수 있는 흐름을 갖추는 것이었습니다.

  • 사진 1장 업로드 → 퍼스널 컬러 분석
  • 실시간 날씨 결합
  • 오늘의 코디 2가지 룩북(Daily/Special) 생성
  • 이미지 다운로드
  • 링크로 공유해도 동작하는 프로덕션 배포

4) 진행 방식: Strategist(Gemini/ChatGPT) × Executor(Cursor)

작업 방식도 의도적으로 설계했습니다.

  • 전략가: Gemini/ChatGPT
    문제 정의, 우선순위, “무엇을 통제해야 제품이 되는지” 결정
  • 실행가: Cursor
    Ask/Plan/Agent 모드를 활용해 코드 반영 → 빌드 → 배포 → 검증까지 밀어붙이기

중간에 재미있는 깨달음도 있었는데요. 처음엔 “전략은 밖에서 세우고 Cursor는 실행만”이라고 생각했는데, 진행하다 보니 Cursor도 Ask/Plan/Agent를 잘 쓰면 전략까지 상당 부분 흡수할 수 있었습니다. 결국 도구보다 “어떻게 지시하고 검증하느냐”가 더 중요했습니다.


5) 제품 구조: ‘에이전트 워크플로우’로 만들기 (LangGraph + Tool calling/MCP)

StyleSense는 단일 프롬프트 앱이 아니라, LangGraph 기반 워크플로우로 구성했습니다.
입력 검증 → 비전 분석 → 외부 데이터(날씨) 조회 → 추천 생성 → 검증/보정까지를 노드 단위로 분리해 연결했습니다.

특히 날씨처럼 모델이 “추측”하면 안 되는 데이터는 Tool calling/MCP 방식으로 분리했습니다.
여기서 MCP를 쓴 이유는 단순합니다: 도구 인터페이스를 표준화해두면, 데이터 공급자(Tavily 등)가 바뀌어도 워크플로우를 안정적으로 유지할 수 있기 때문입니다.

요약하면, “AI가 잘하길 기대”하기보다 어느 단계가 흔들리는지 측정하고 필요한 곳만 최소 수정으로 개선할 수 있게 만드는 구조를 목표로 했습니다.

(도식) LangGraph 워크플로우 개요


6) AI의 흔들림을 ‘시스템’으로 통제하기⭐

6-1) “측정 도구가 먼저다”: 회귀 테스트 자동화 게이트(QA-Lite)

AI 결과는 눈으로만 보면 착각하기 쉽습니다. 그래서 품질을 올리기 전에, 먼저 품질을 측정할 수 있는 게이트부터 만들었습니다.

  • 회귀 테스트 자동화 게이트(이미지 생성 없는 Regression Gate)
  • 시나리오 + 시드(seed) 고정으로 자동 실행
  • 결과는 JSONL로 남겨 통과/실패로 판단

팩트: seed 42 고정 / 12개 시나리오 100% 통과, error_count 0

시나리오 ID지역 (기온 맥락)스타일성별퍼스널 컬러검증 결과 (Pass/Fail)
male-sexy-seoul서울 (-2.6°C)섹시남성여름 뮤트

PASS

female-sexy-seoul서울 (-2.6°C)섹시여성봄 브라이트

PASS

male-chic-helsinki헬싱키 (-8.4°C)시크남성여름 트루

PASS

 

female-elegant-dubai두바이 (24.1°C)우아여성봄 라이트

PASS

male-minimal-seoul서울 (-2.6°C)미니멀남성가을 딥

PASS

… 외 7종글로벌 랜덤혼합혼합혼합

PASS

PM 관점 한 줄: “운 좋게 잘 됐다”가 아니라, 가드레일(게이트)을 세워서 품질을 유지하는 방식이었습니다.


6-2) 경량형 Self-correction 루프(Mini A): “딱 한 번만” 보정하기

이미지 생성은 확률적으로 흔들립니다(크롭/중복 인물/비율 등).
하지만 마음에 들 때까지 무한 재시도하면 비용과 지연이 폭주합니다. 그래서 Mini A는 이렇게 설계했습니다.

  • 실패를 감지하면
  • LLM을 다시 불러 프롬프트를 새로 쓰지 않고(추가 판단/리라이트 없이)
  • 미리 정의한 짧은 패치 토큰(Patch Token)을 프롬프트 끝에 append-only로 덧붙인 뒤
  • 이미지 생성만 최대 1회 재시도합니다. (Max Retry = 1)

예를 들어 크롭 이슈가 나면 CROP_STABILITY, 인물 중복이 보이면 SINGLE_PERSON, 남성 비율이 무너지면 MALE_PHYSIQUE_STABILITY 같은 처방 토큰을 추가하는 방식입니다.
핵심은 “더 똑똑하게 다시 쓰는 것”보다, 가이드라인을 빠르고 확실하게 강화해 1회 안에 정답률을 높이는 실무형 구조를 택한 점이었습니다.

그리고 “루프가 실제로 동작했는지”는 말로 끝내지 않기 위해, 강제 실패 시나리오를 넣어 JSONL에 review_attempt=2가 찍히는 것으로 증명했습니다.
(중요 포인트는 ‘재시도 자체’가 아니라, 재시도가 발생했음을 기록으로 남기는 구조였습니다.)


6-3) 가장 치명적인 문제: 같은 사진인데 퍼스널 컬러가 바뀜 → ‘일관성’부터 해결

수동 테스트 중 가장 치명적인 문제는 이거였습니다.

“같은 사진을 올렸는데, 퍼스널 컬러 진단이 매번 바뀐다.”

사용자가 자기 퍼스널 컬러를 어느 정도 알고 있는 경우가 많기 때문에, 이 문제는 신뢰를 바로 무너뜨립니다.
원인은 Vision LLM의 확률적 변동성이었고, 저는 “정확도를 당장 100점으로 만들기”보다 일관성(Consistency)부터 확보하는 쪽을 택했습니다.

  • 이미지 콘텐츠 SHA256 해시 기반 캐싱(.pc_cache.json)
  • 동일 이미지면 동일 퍼스널 컬러 결과 고정

그리고 UX적으로 기술적 한계를 숨기지 않고, 결과 영역에 아래 문구를 배치했습니다.

ⓘ 사진의 조명·해상도 등에 따라 퍼스널 컬러 결과가 달라질 수 있습니다.


7) 배포: Vercel + Render로 ‘진짜 링크’를 만들기

배포는 늘 마지막 관문입니다. 이번 프로젝트는 프론트/백엔드를 분리했습니다.

  • Front: Vercel
  • Backend(FastAPI): Render

배포 과정에서 가장 크게 부딪힌 건 크게 두 갈래였습니다.
(1) 의존성 충돌로 인한 빌드 실패, 그리고 (2) 도메인 분리로 인한 통신(CORS) 차단입니다.
결과적으로 “코드가 돌아간다”와 “프로덕션에서 돌아간다”는 정말 다른 이야기였습니다.

최종적으로는:

  • NEXT_PUBLIC_API_BASE_URL 환경변수로 백엔드 URL 주입
  • FastAPI CORS에 allow_origin_regex=r"^https://.*\.vercel\.app$" 적용
  • PC/모바일에서 업로드→결과→다운로드까지 동작 확인

8) Tech Stack

  • 프론트: 초기 1회 v0로 빠르게 뼈대를 잡고, 이후 Next.js 구조를 Cursor에서 정리해 진행했습니다.
  • 백엔드/오케스트레이션: FastAPI + LangGraph
  • 날씨: Weather MCP (Tavily API)
  • 이미지 생성: FAL AI
  • 배포: Vercel(Front) + Render(Backend)

9) 결과: 스모크 테스트로 ‘제품 완성’ 확인

프로덕션 배포 후, PC/모바일에서 최소 스모크 테스트를 진행했습니다.

  • 남/여 + 스타일 조합 테스트(스트릿/섹시/댄디 등)
  • 업로드 필터링: 강아지/꽃/다인물 → Alert으로 정상 차단
  • 이미지 다운로드 정상 동작

서비스 링크: https://stylesense-khaki.vercel.app/

   


10) 교훈(Lessons): Cursor의 자유도 vs AI Studio의 편의성

이번 프로젝트에서 얻은 교훈은 현실적으로 이렇습니다.

  • AI Studio/Gems는 빠릅니다. 하지만 내가 원하는 디테일로 통제하기엔 한계가 있습니다.
  • Cursor는 자유도가 높습니다. 대신 모든 걸 내가 설계하고 운영 가능한 형태로 통제해야 합니다.
    특히 이미지 생성은 같은 코드라도 표현/순서가 바뀌면 결과가 흔들릴 수 있어, “시스템적 통제(측정/보정/증명)”가 꼭 필요했습니다.

처음엔 “AI Studio에서 만든 것처럼 Cursor에서도 쉽게 되겠지”라고 생각했는데, 이게 착각이었습니다.
AI Studio는 이미 잘 깔린 인프라 위에서 돌아가고, Cursor는 내가 하나씩 시스템을 세워야 했습니다.

결국 “AI를 잘 쓰는 것”과 “AI 제품을 출시 가능한 형태로 만드는 것”은 다른 문제였고, 이번 프로젝트는 그 차이를 몸으로 배운 경험이었습니다.


11) 남은 과제(Backlog)

  1. 퍼스널 컬러 정확도(Accuracy) 정량 평가(일관성은 확보했으니 다음 단계)
  2. React 19 의존성 지뢰 제거(우회 플래그 제거)
  3. CORS 허용 범위를 프로덕션 도메인 리스트로 축소 + /health 엔드포인트 추가

마치며

AI를 ‘코딩’하는 시대를 넘어, ‘오케스트레이션’하는 시대로...

StyleSense 프로젝트를 마무리하며 가장 크게 느낀 점은, AI 제품의 본질이 모델의 지능 그 자체보다 시스템의 예측 가능성과 검증 가능성에 있다는 사실이었습니다.

이번 작업은 단순한 기능 구현이 아니라, AI PM으로서 불확실성이 큰 생성형 AI를 어떻게 시스템 아키텍처인 LangGraph 안에서 관리하고, QA-LiteSelf-correction 같은 품질 장치로 통제 가능한 형태로 설계할 것인지 고민한 과정이었습니다.

결국 중요한 것은 AI가 한 번 그럴듯한 결과를 내는지가 아니라, 흔들릴 수 있는 결과를 서비스 수준의 신뢰로 끌어올릴 수 있는가였습니다. 이번 프로젝트를 통해 그 신뢰는 모델 하나가 아니라, 구조와 검증, 운영의 조합으로 만들어진다는 점을 다시 확인했습니다.

무엇보다 이번 프로젝트는 전략가(Gemini/ChatGPT)와 실행가(Cursor)를 오케스트레이션하며, AI를 단순한 도구가 아니라 운영 가능한 제품으로 빌드해본 실전 경험이었습니다. 앞으로도 AI의 화려함 자체보다, 실제 서비스 안에서 안정적으로 작동하는 구조와 품질 체계를 설계하는 일에 더 집중해보려 합니다.

서비스 링크: https://stylesense-khaki.vercel.app/
(※ 첫 접속 시 서버 기동으로 잠시 지연될 수 있습니다.)

AI Studio로 10분 만에 ‘직장인 멘탈 서바이벌’ 게임 만들기

최근 여러 바이브코딩 툴을 익히는 과정에서,
Google AI Studio로 가볍게 미니게임을 하나 만들어봤습니다.
코딩 없이 프롬프트만으로
직장인 멘탈 생존 게임 “운명의 데스크탑”을 프로토타이핑한 실험입니다.

총 2시간 정도 소요되었고, 대략적인 타임라인은 아래와 같습니다.

    • 최초 구축: 프롬프트 설계 약 20분 + 프롬프트 전송/구축 약 10분프로토타이핑 완성
    • 상세 튜닝: 약 90분
    • 총 소요: 약 2시간

즉, “10분”은 프롬프트를 통해 프로토타이핑이 최초로 완성된 시간이고,
프롬프트 설계와 완성도 튜닝까지 포함하면 별도 시간이 꽤 들어갔습니다.
아마 다른 프로젝트들도 유사하지 않을까 싶습니다.
(실행 비용은 낮고, 판단/검증 비용은 높음)

 

👉 [ 운명의 데스크탑’ 게임 플레이 ]

 


🤔 무엇을 만들었나: 텍스트 대시보드형 미니게임

<운명의 데스크탑>은 한 주를 버티는 구조의 선택형 게임입니다. 화면은 “시스템 진단 대시보드”처럼 고정된 UI로 보여주고, 각 단계에서 A/B 선택을 하면 멘탈 지수가 변합니다.

    • 목표: 월요일부터 금요일 18:00까지 멘탈 0% 초과로 버티기
    • 진행: 월~금 흐름 + 중간에 보너스(회복) 구간 1회
    • 출력 규칙: 스크롤을 줄이기 위해 3~5줄 중심, 대시보드 포맷 유지
    • 엔딩: 멘탈이 0%가 되면 즉시 [사직서 제출] 엔딩으로 종료
      • 참고로 현재 캡처는 lose 엔딩 흐름입니다. (win/lose 모두 “월요일 엔딩”으로 수렴하게 설계해 둔 건… 현실 반영입니다.)

1️⃣ 최초 구축(약 30분): 뼈대는 정말 빨리 나온다

AI Studio에서 가장 인상적이었던 지점은, 게임이 돌아가는 형태”까지 도달하는 속도였습니다.
역할/목표/턴/출력 포맷 같은 핵심 규칙을 프롬프트로 고정해 주면, 짧은 시간 안에 기본 흐름이 바로 작동합니다.

제가 처음 고정한 요소는 단순했습니다.

    • 역할: “운명의 데스크탑” (상황을 제시하고 결과를 출력하는 시스템)
    • 목표: 금요일 18:00까지 멘탈 유지
    • 입력: A/B 선택
    • 출력: 대시보드 형태 고정 + 짧은 문장 + 다음 단계 진행 안내

이 단계까지는 “정말 빠르게” 나옵니다. 문제는 그다음이었습니다.


2️⃣ 상세 튜닝(약 90분): ‘돌아감’과 ‘재밌음/읽힘’은 다르다

프로토타입이 돌아간다고 해서, 곧바로 “게임처럼 느껴지진” 않습니다. 제가 시간을 쓴 지점은 대부분 여기였습니다.

    1. 템포 조정: 길면 피로해진다
      초기 버전은 단계가 길어지면서 금방 읽기 부담이 생겼습니다.
      그래서 한 주 시나리오를 핵심 국면 중심으로 압축하고, 각 단계에서 “즉시 선택하고 넘어갈 수 있게” 문장을 줄였습니다.
    2. 콘텐츠 범위: 특정 직군 밈에 치우치지 않기
      처음엔 IT/개발자 맥락에 치우친 표현이 섞여 있었습니다.
      일반 직장인도 공감할 수 있도록 보고/급한 수정/회의/런치/퇴근 직전 이벤트처럼 범용적인 상황을 섞어 톤을 정리했습니다.
    3. 진행감: 텍스트지만 ‘UI처럼’ 보이게
      텍스트 게임이라도 “진행 중”이라는 느낌이 있어야 합니다.
      아이콘, 상태 라벨(STRESSED 등), 경고 문구, 멘탈 바(게이지)처럼 시각적 힌트가 되는 요소를 넣어 대시보드 감도를 올렸습니다.
    4. 밸런스: 회복 구간 하나로 난이도가 급변한다
      보너스(회복) 스테이지를 넣으면 난이도가 확 바뀝니다.
      그래서 멘탈 감소/회복 폭을 다시 맞추며 “너무 쉽지도, 너무 불가능하지도 않게” 조정했습니다.

✅ AI Studio가 특히 좋았던 지점

정리하면, AI Studio는 “프로토타이핑” 관점에서 강점이 뚜렷했습니다.

    1. 초안 품질이 안정적
      문장/구조가 비교적 정돈되어 나와서, 초반 QA 부담이 낮았습니다.
    2. 튜닝 루프가 빠름
      제약(포맷 고정, 출력 길이 제한, A/B 규격)을 걸어도 수정-재실행이 매끄러웠습니다.
    3. 배포까지 원스톱으로 이어지기 쉬움
      비개발자에게 가장 부담되는 구간이 보통 백엔드/배포인데, 이 부분을 크게 신경 쓰지 않아도 끝까지 가져갈 수 있다는 점이 인상적이었습니다.

⚠️ 아쉬운 점: 디테일 튜닝은 생각보다 어렵다

다만 한계도 분명했습니다.
프롬프트만으로도 형태는 빠르게 만들 수 있지만, 의도한 결과물을 100% 재현하는 디테일 튜닝에는 한계가 있었습니다. 특히 인터랙션, 밸런스, 예외 케이스까지 정밀하게 잡으려면 프롬프트만으로는 어렵습니다.

그래서 최종 완성도를 목표로 할 때는 Cursor나 Claude Code처럼 코드 수정이 가능한 도구가 필요하다고 느꼈고, 저도 현재는 Cursor AI로 다른 프로젝트를 병행하며 “프로토타입 → 코드 기반 완성” 흐름을 함께 가져가고 있습니다.


🧾마치며…

이번 실험으로 확실히 느낀 건 하나입니다.
AI Studio는 ‘퀄리티 있는 프로토타입을 빠르게 만들고, 배포까지 한 번에 처리’하는 데 강합니다.
반면, 완성도를 끝까지 밀어붙여 원하는 결과물을 정확히 구현하려면 코딩 기반 도구가 더 적합합니다.

저는 이번엔 AI Studio의 강점을 확인하는 목적이었기 때문에, 이 정도 결과물만으로도 충분히 의미가 있었습니다.

👉 [ 운명의 데스크탑’ 게임 플레이 ]

 

🚗 현대차 LLM 챗봇 데모 (Hybrid: Rule + RAG)

추석 연휴 ,
개인 프로젝트로 진행한 하이브리드 챗봇 데모를 공개합니다.

Rule의 안정성과 LLM의 확장성을 결합하여,
연휴 기간 동안 바이브코딩 방식으로 직접 구축하고 다듬어 보았습니다.
(※ 현대자동차 공식 챗봇과 무관합니다.)


🎬 Hook: 1 데모 + 최종 평가

👉 Demo: hyundai-chatbot-demo.vercel.app

※ 참고: Vercel 빌드 환경에서는 일부 RAG 질의(띄어쓰기·유사명칭·오탈자 등)의 인식률이 Stackblitz 실험 환경보다 낮게 나타날 수 있습니다.
본 영상은 Stackblitz 기준으로 촬영되었으며, 동일 코드 기반으로 Vercel에서도 대부분 정상적으로 작동합니다.


1️⃣ 만들었나 (Why)

이번 데모는 바이브코딩을 통한 챗봇 구현 프로젝트의 일환으로, 차량 구매 목적의 실제 사용자 시나리오에서 출발했습니다.

기존 챗봇의 경우 기본 정보 제공은 충분했지만, 구매·시승·상담 다음 행동으로 자연스럽게 이어지는 흐름은 더 보완될 여지가 있었습니다.

목표는 기존 시스템을 비판하는 것이 아닌, 정보 전달행동 전환간격을 줄이는 플로우 설계였습니다.

  • 구매 목적 사용자 시나리오의 개선 포인트
    • 견적/시승 문의까지 이동 단계가 비교적 길어지는 구간
    • 외부 페이지 이동 시 대화 맥락이 단절되는 지점
    • 동일 메뉴/버튼 반복 노출로 인한 탐색 피로

이에 따라 데모는 “FAQ 요약 + 공식 링크(CTA) + 최소 단계 전환을 원칙으로, 사용자가 질문하면 필요 행동까지 즉시 연결되고 순환되는 경험을 지향했습니다.


2️⃣ 어떻게 만들었나 (How)

Part 1. 분석 & 전략

  • 가설
    1. 목표 행동(구매·시승·AS)까지 경로 단축링크/CTA 무결성이 사용자 만족도와 목표(KPI) 전환에 결정적이라고 가정
    2. 또한 LLM 측면에서 유사 발화 대응력(띄어쓰기·별칭·오탈자)이 실사용성에 큰 영향을 준다고 가정
  • 분석
    1. 실제 공식 사이트 캡처·메뉴 트리 분석
    2. Top FAQ 및 유사 발화 수집&정규화
    3. 링크 유효성 및 도메인 점검
  • 전략
    1. 플로우 단순화(Simplify Flow) → 메뉴 통합, CTA 중심 설계, 1~2단계 내 해결
    2. 지속적인 연결(Connect Experience) → 핵심 정보는 대화 내 제공, 필요 시에만 외부 링크
    3. 데이터 최신화(Keep Data Fresh) 공식 FAQ 247 + 추가 Top 50 정비하여 반영 ( 지식 강화로 RAG 품질 안정화/고도화에 기여)

Part 2. 설계 & 개발

  • 아키텍처(Front-only Hybrid)
    • Rule Layer: 가격·보증·리콜·EV 추천 등 고정 의도 우선 처리
    • RAG Layer: faq.json + BM25 검색 → LLM 요약
    • UX Layer: 칩(Chips), 바텀시트, Sticky CTA(공식 링크/전화)

  • R1 → R2 → R3 개선 사이클
    • R1 (Prototype): Rule 70~80% + RAG 기본(가능성/흐름 우선)
    • R2 (Tuning): Rule 100% + 현대차 공식 FAQ 크롤링 반영 + BM25 교체, 유사 발화 정규화, 자동 테스트 루틴 구축
    • R3 (QA/Deploy): 자동/수동 라벨 교차검증, CTA·Fallback 보강 → 최종 평가 기준 항목 Pass

Part 3. 자동 테스트 & QA

  • 테스트 루틴
    • 콘솔 기반 runBatch() 자동 테스트 → 수동 라벨링으로 최종 판정
  • 라벨 분포 보정(R1 예시)
    • 자동: Good 40 / Fair 120 / Bad 136
    • 수동(최종): Good 183 / Fair 2 / Bad 111
    • “자동–수동 일치율: 45.6%”임계값·가중치 보정 상향
  • 보정 정책(R3 반영)
    • Retrieval TopScore 임계값 조정(예: ≥20=Good 후보)
    • Retrieval 성공 시 CTA 필수 부착, Fallback에도 고객센터 CTA 제공
    • 부분매칭 Good는 Gold 데이터 보강하여 업데이트
      → 위 보정 이후, 본문 상단 최종 평가 의 기준으로 품질을 점검·정리했습니다.

Part 4. RAG + Rule 하이브리드

  • 현업에서는 Rule-first를 반영했으나, 본 프로젝트에서는 RAG-first를 도입하여 실험
  • Retrieval 신뢰도(TopScore/Threshold)에 따라 FAQ → OpenDomain → Fallback으로 분기 처리
  • 역할 분리: “Rule = 안정성, “RAG = 커버리지·설명력
    ※ Vercel 배포 환경에서는 런타임(Edge vs Node) 및 경로 처리 차이로 인해 일부 질의(띄어쓰기, 유사명칭 등)의 검색 인식률이 Stackblitz 실험 환경 대비 다소 낮게 나타났습니다. 코드 구조와 데이터는 동일하며, 이는 환경 특성에서 비롯된 결과로 판단됩니다.

Part 5. 배포 트러블슈팅

  • Vercel 환경: OpenAI 직접 호출 지양 → /api/chat.ts 에지 프록시
  • 인덱싱 race 방지: ensureRagReady() 싱글톤 초기화 + 임베디드 코퍼스
  • dev/prod 코퍼스 동기화: assets 임베드 + 런타임 /faq.json 덮어쓰기
  • 재할당 경고 해결: const → let
  • 공식 FAQ URL 변경: 리다이렉트 미지원 건은 외부 이슈로 Skip

3️⃣ 결과 & 배운 (What / Lessons)

🎯 핵심 성과

  • 최상단 최종 평가 표 기준으로 정확도·라우팅/폴백·링크/CTA·성능·스타일/안전·UI/UX 항목 Pass 달성했습니다.
  • Rule + RAG 결합 구조를 구축하고, 자동 QA 루틴(runBatch)을 적용했습니다.
  • R1→R2→R3 개선 사이클을 통해 품질을 확보하고 프로덕션 레디 수준으로 정비하였습니다.

🧩 진행 어려움

  • 마지막 5% 완성 구간에서 시간 소요가 집중되었습니다. (체감상 전체 소요 시간의 20% 이상)
  • 공식 사이트 URL 변경(리다이렉트 미지원)로 일부 항목은 Skip 처리했습니다.
  • 바이브 코딩 시, 프롬프트 반복 입력 시 맥락을 벗어나 필요 이상으로 수정 발생하는 케이스가 많았습니다.
  • 배포 환경(Vercel)에서 RAG 검색 성능이 Stackblitz 대비 약하게 나타났습니다. 이는 런타임 및 빌드 환경 차이로 인한 현상으로, 실 서비스 영향 범위는 RAG 한정으로 나타났습니다.

💡 교훈

  1. 작업 단위는 최대한 작게 쪼개고, 문맥은 명확하게 가져가야 합니다. (챗방 최대한 쪼개기 + 상세한 프롬프트 필요)
  2. 제안 코드는 그대로 적용하기보다 구조를 확인하고 최소 수정으로 해결해야 합니다.
  3. 바이브 코딩은 개발 도구에 가깝습니다(기본 문법·구조 이해가 효율을 좌우).
  4. Agent 자동 검수 + 수동 QA 조합으로 효율적으로 시간을 아끼고 품질을 높여줍니다.
  5. 초기 목표는 50% 범위로 설정해야 합니다. 최초 예상보다 2~3배의 시간과 노력이 소요되기 쉬워, 단계별 확장이 현명합니다.
  6. RAG 보정은 생각보다 어렵습니다. (예: 유사 발화·띄어쓰기·별칭 대응 등)

 

P.S. 추석 연휴 내내 작업하여 마지막 보정 작업과 글 작업을 진행하니 어느덧 1주일이 금방이네요. 처음 해보는 바이브코딩은 생각보다 어렵고 힘들었지만, 생각보다 재미있고 많은 걸 배울 수 있었습니다. 더 재미나고 쉬운 바이브코딩 2탄으로 찾아오겠습니다 😊🤩