LLM에게 리뷰를 시키면 “AI 티”가 난다. 리뷰테크는 생성 한 번으로 끝내지 않고 retrieve → generate → critique → revise 파이프라인으로 품질을 시스템으로 관리한다. 아래 데이터는 전부 2026-09-19 실제 API 호출로 추적한 실측이다.
후기를 쓰면 적립금을 주는데도 사람들은 포기한다. 느낀 점이 없어서가 아니다 — 한 줄짜리 감상을 몇 문단의 글로 늘리는 일이 귀찮아서다. 그래서 리뷰테크는 느낀 점 한 줄만 받는다. 나머지는 AI가 늘린다.
그런데 그 “늘리는 일”을 LLM에 한 번 호출로 시키면 문제가 생긴다. 예시도 검증도 없이 생성하면 모델은 자꾸 광고 문구처럼 정리하고, 정중하게 권유하고, “최고”를 남발한다. 사람이 쓴 리뷰처럼 읽히지 않으면 유저는 그대로 복사하지 못한다.
같은 입력으로 예시 주입 없이 생성한 결과와 파이프라인을 통과한 결과를 나란히 두면 차이가 보인다. (아래는 실측 comparison 데이터 — 왼쪽은 프로덕션 폴백 경로와 동일한 단독 호출)
사람도 글을 잘 쓰려면 잘 쓴 글을 먼저 보고 → 초안을 쓰고 → 읽어보고 → 고친다. 리뷰테크는 이 과정을 그대로 자동화했다. 버튼 한 번 뒤에서 이런 일이 벌어진다.
비슷한 상황에서 진짜 사람이 쓴 리뷰 4개를 먼저 찾아요
그 말투를 참고해서 서로 다른 리뷰 3개를 써요
“AI가 쓴 티”가 나는 문장을 다른 AI가 찾아내요
걸린 문장만 사람처럼 다시 써요
아래는 시연이 아니라 실제 기록이다. 시나리오를 고르고 스크롤을 내리면, 그날 각 단계가 실제로 찾고·쓰고·잡아내고·고친 내용이 카드로 쌓인다.
전부 저장소 git 이력에서 그대로 가져온 기록이다. 만들고, 부수고, 되돌린 순서.
상품 링크를 붙여넣으면 크롤링 → Gemini로 리뷰 생성. 이틀 만에 8개 플랫폼 파서와 베스트 리뷰 코퍼스(예시 주입의 시작)까지.
Mixed Content·CORS로 브라우저 API가 전면 실패. 큰 원본 사진 업로드가 끊기던 문제는 클라이언트 압축으로 해결.
그림자 elevation → 모션 → 타입 위계 → 간격 리듬, 네 단계로 나눠 하루에 리스킨.
아침에 LangGraph Reflection + RAG 설계 문서를 쓰고, 같은 날 “분기 하나짜리 순차 흐름에 프레임워크는 과하다”는 결론으로 제거. 일반 async 함수로 파이프라인을 구현하고 단위 테스트를 CI에 편입했다. 같은 날 구글이 text-embedding-004를 API에서 제거해 임베딩 모델도 강제 교체.
네이버 쇼핑 API 서비스 종료(7/31). 제품 검색을 Gemini 그라운딩으로 교체 — 그라운딩은 JSON 모드와 병행이 안 돼 프롬프트로 형식을 강제했다.
.ait 번들 빌드, 토스 로그인, 교차 출처에서 쿠키가 막혀 Bearer 토큰 병행 체계로 전환.
뒤로가기 UX로 반려. SDK backEvent 연동, 위저드 백스택 누수 수정, confirm() 의존 제거까지 당일 처리하고 재심사 통과. 같은 날 서비스명도 ‘리뷰테크’로 리브랜딩(동명 미니앱 충돌).
리뷰 생성 대기 시간에 전면 광고 노출(하루 첫 생성은 광고 없음), robots·sitemap·JSON-LD 등 기술 SEO 기반 구축.
출시 직후 앱이 전면 “Load failed”. 원인은 무인 보안 업데이트가 nginx를 재시작하는 틈에, 과거 실험의 잔재였던 root 계정 pm2 프로세스(nodeapp)가 80/443 포트를 선점한 것. 로컬에 SSH 키가 없는 상황 — GitHub Actions에 임시 진단 워크플로를 만들어 원격으로 조사하고, 같은 방식으로 복구했다.
입력 위저드가 단계마다 backEvent 핸들러를 쌓기만 하고 해제하지 않아, 위저드를 떠난 뒤에도 죽은 핸들러가 뒤로가기를 3~4회 삼켰다. 핸들러 해제 함수를 ref 배열에 모아 unmount에서 일괄 해제하는 것으로 수정. 웹 브라우저에선 재현되지 않고 토스 웹뷰에서만 드러나는 종류의 버그였다.
GitHub Actions 2개 워크플로: ci.yml이 모든 push를 검증하고, deploy.yml이 master 반영을 Lightsail(nginx + pm2)에 배포한다. 수동 배포로 먼저 검증한 뒤 자동화를 켰고, SQLite는 pm2 cron으로 매일 VACUUM INTO 백업. 파이프라인 단위 테스트도 CI에 물려 있어 프롬프트를 고치다 회귀가 나면 머지 전에 잡힌다.
생성이 13초를 넘기면 critique를, 20초를 넘기면 revise를 건너뛰고 초안을 반환한다. 품질 단계가 응답 시간을 볼모로 잡지 않게 한 선택이지만, 운영 로그에서 실제로 스킵이 발생한다.
정량 평가셋이 없다. “AI 티”의 기준은 critique 프롬프트의 금지 패턴 목록이 전부이고, 이 페이지의 추적 통계도 표본 3회다(3회 중 2회 revise 발동).
넉 달 사이 임베딩 모델(text-embedding-004 API 제거)과 검색 API(네이버 쇼핑 종료)를 강제로 교체당했다. 크롤 차단(403)은 우회하는 대신 공유텍스트·그라운딩·사진의 3중 폴백으로 설계를 바꿨다.
8개 플랫폼 23개 링크 전수 테스트 기록은 저장소 밖에 있어 회수·재실행이 필요하다.
분기 하나짜리 순차 흐름. 그래프 프레임워크가 주는 건 러닝커브와 디버깅 난이도뿐이었다. 설계 문서까지 쓴 뒤 같은 날 제거했다. (133dd39)
코퍼스가 51건이면 첫 요청 때 한 번 임베딩해 메모리에 들고 있으면 된다. 코사인×10 + 톤3·평점2·길이1 하이브리드 랭킹, 실패 시 키워드 사전 폴백. (985df47)
critique→revise→재critique 루프는 지연의 상한이 없다. 생성 1 + 비평 1 + 수정 1로 상한을 고정하고, 대신 시간 예산 게이트를 달았다. (b19cc4d, 889d15e)
리뷰 3안 생성에 추론 토큰은 낭비다. temperature 1.15·topP 0.97로 사람 글의 편차를 흉내 내고, 응답은 JSON 모드로 고정. 잘린 JSON은 괄호 스택 복구로 살린다.
서버에서 네이티브 컴파일이 반복적으로 말썽이라 prebuilt/순수 JS 구현으로 교체. 단일 서버 규모에 DB 서버는 과하다. (d502b09, 747f1a9)
클라이언트는 .ait 번들과 PWA를 같은 코드베이스로. 서버는 라우트 + 서비스 레이어 분리 정도의 얇은 구조면 충분했다.