??
“추천은 정확해야 의미가 있다.”
초기 FLIK의 코스 생성 알고리즘은 사용자의 카테고리 선호 벡터와 장소 벡터 간의 유사도(cosine similarity) 로만 추천을 수행했다.
하지만 실제 사용 테스트 결과, 다음과 같은 문제가 발생했다.
문제 1️⃣ 같은 카테고리의 장소가 과도하게 반복 추천됨
문제 2️⃣ 추천된 장소의 다양성 부족 → 코스 완성도 저하
문제 3️⃣ 최종 코스의 이동 동선 비효율 → 사용자 만족도 하락
10명의 사용자 데이터를 기반으로 Precision@5(Top-5 추천 중 실제로 선호한 비율)를 측정했다.
| 사용자 그룹 | Precision@5 | 코스 다양도(%) | 평균 이동거리(km) |
|---|---|---|---|
| A (자연 중심) | 32% | 48% | 27.4 |
| B (문화·역사 중심) | 28% | 52% | 30.1 |
| C (카페 중심) | 35% | 44% | 21.6 |
| D (액티비티 중심) | 25% | 46% | 33.8 |
| 평균 | 30% | 47.5% | 28.2 |
🚨 Precision@5 = 30% 같은 카테고리 내 과도한 집중 → 장소 다양성 저하 동선 효율성 또한 평균 28km로 비효율적
Precision@5 50% 이상 달성 코스 생성 속도 및 효율 개선
| 목표 항목 | 세부 목표 |
|---|---|
| 정확도 | Precision@5 ≥ 50% |
| 학습성 | 사용자 피드백 기반 동적 가중치 조정 |
| 성능 | 코스 생성 속도 30% 단축 |
| 효율성 | 동선 거리 20% 단축 |
“사용자의 행동이 곧 데이터다.”
가중치 업데이트 수식 예시:
W_new = W_old + α * (positive_feedback - negative_feedback)
(1) 사용자 선호 벡터 기반 후보 장소 추출
└── 카테고리별 Top-K (유사도 기반)
(2) 지역 좌표 기반 반경 검색
└── 10km → 20km → 30km 단계적 확장
(3) Haversine 공식으로 장소 간 거리 계산
└── 최적 동선 구성 (Greedy or TSP 근사)
(4) 관광 도메인 필터 적용
└── 영업시간 / 계절 / 접근성
(5) Redis 캐싱 + 사전 계산 추천 후보 활용
└── 속도 최적화 및 부하 감소
+----------------------+
| User Saved Data |
| - category vectors |
| - feedback history |
+----------+-----------+
|
v
+----------------------+
| Recommendation Core |
| (Similarity Engine) |
+----------+-----------+
|
v
+----------------------+
| Domain Filters |
| (Time, Season, Geo) |
+----------+-----------+
|
v
+----------------------+
| Route Optimizer |
| (Haversine + Greedy) |
+----------+-----------+
|
v
+----------------------+
| Redis Cache Server |
| (Precomputed Routes) |
+----------------------+
| 영역 | 사용 기술 |
|---|---|
| 추천 계산 | Python + NumPy (벡터 연산) |
| 동선 계산 | Haversine formula + Greedy heuristic |
| 캐싱 | Redis SortedSet |
| 피드백 학습 | Spring Batch + Scheduler |
| 통계 분석 | Pandas + Jupyter (Precision, Recall, F1) |
| 테스트 ID | 페르소나 | 선택 카테고리 | 생성된 코스 | 결과 |
|---|---|---|---|---|
| T001 | 자연 중심 | 자연, 카페 | 5일 코스 (14개 장소) | 👍 유지 |
| T002 | 실내 중심 | 실내, 음식 | 3일 코스 (9개 장소) | 👎 수정 |
| T003 | 가족여행 | 자연, 테마파크 | 2일 코스 (8개 장소) | 👍 유지 |
| T004 | 힐링 중심 | 카페, 문화 | 4일 코스 (11개 장소) | 👎 삭제 |
| 항목 | 개선 전 | 개선 후 |
|---|---|---|
| Precision@5 | 30% | 53% ✔ |
| 코스 다양도 | 47% | 68% ✔ |
| 평균 이동거리 | 28.2km | 21.3km ✔ |
| 평균 생성시간 | 4.5s | 2.9s ✔ |
🎉 Precision@5 목표 초과 달성 사용자 체감 속도 35% 향상 동선 효율성 +20% 개선
“추천 정확도를 높이기 위해 벡터 유사도 하나로는 부족하다.”
FLIK의 추천 엔진은 이제 사용자의 피드백, 실제 이동 거리, 시간 제약, 계절성을 종합적으로 고려하는 하이브리드 추천 시스템으로 진화하고 있다.
🔜 7편 예고: “숫자로 증명하다 — 개선 결과 리포트와 시스템 검증”
이 버전은 그대로 GitHub Pages, Velog, Notion, Tistory, Hugo 등 Markdown 블로그에 복붙해도 줄바꿈·테이블·코드·ASCII 구조가 모두 정상 렌더링됩니다.