docs: AI 코스 생성 설계안과 대구 평가셋 #9

Merged
ttipo merged 3 commits from docs/ai-course-design into main 2026-11-06 00:13:54 +09:00
Owner

무엇을 · 왜

AI 코스 생성(디자인 화면 8–10: 조건 입력 · 만드는 중 · 결과)을 구현하기 전에 설계와 평가 기준을 정한다. 코드는 아직 없다.

설계안 — docs/design/ai-course.md (v0.2)

  • 흐름: 한 문장 → 조건 해석(작은 모델, 횟수 차감 없음) → 사용자가 조건 확인 → 서버가 뒤에서 생성 → 앱이 1~2초마다 진행 조회 → 결과
  • 역할: DB 가 후보를 찾고 거른다(최대 40곳). AI 는 후보 번호로만 고르고 이유를 쓴다.
    이동 시간·영업·반려 조건 검증과 순서 고치기는 코드가 한다. 화면의 사실 값(영업시간·동반 조건·출처)은 DB 에서 붙여 AI 가 지어낼 수 없다.
  • API 6개, 테이블 ai_course_generation, 에러 코드 AI_001~AI_004(제안 — 구현 PR 에서 레지스트리에 넣는다)
  • 비용: 1회 Haiku 5.5 약 3원 · Sonnet 5.5 약 50원대(2026-11-05 Anthropic 공식 가격)

§13 결정(2026-11-05, 추천안 그대로):

# 항목 결정
1 하루 횟수 비로그인 2회 · 로그인 5회, 결과가 나온 생성만 차감
2 비용 상한 개발 하루 $3, Console 월 한도 $50 부터
3 영업시간 미확인 장소 자연·관광지·행사만 후보, 식당·카페·문화시설은 뺀다
4 반려동물 실내는 동반 확인된 곳만, 야외는 미확인도 허용(경고), 불가·크기 불일치는 뺀다
5 이동 시간 직선거리 추정('약 N분'), 경로 API 는 2단계
6 공연(KOPIS) MVP AI 후보에서 뺀다
7 요청 문장 보관 90일
8 모델 평가로 정하되 Haiku 5.5 부터

평가셋을 만들며 찾아 설계에 반영한 것(v0.1 에서 바뀐 부분):

무엇 왜
조건 해석 issues 3개 추가 — too_short · past_midnight · unclear_request "점심시간 1시간만", "밤 11시 이후", "ㅁㄴㅇㄹ" 을 나타낼 값이 없었다
별칭이 특정 장소를 가리키면 그 장소를 중심으로 김광석다시그리기길은 도심 중심에서 1.55km 라 동네 중심으로 잡으면 걸어서 반경(1.5km) 밖이다
전시는 실내로 본다 반려 실내 규칙·비 올 때 실내 비율이 갤러리 전시에도 맞게
비 올 때 실내 비율은 후보가 모자라면 알림으로 반려 동반 실내 장소가 0곳이라 위반을 고칠 방법이 없다
코스를 못 만들면 이유를 함께(failure.notices) AI_003 문구만으로는 왜 못 만들었는지 보이지 않는다

평가셋 v2(대구) — docs/ai-eval/course-eval-v2.jsonl 62개 + README

v1 은 62개 중 60개가 서울·부산·제주 등이라 장소 DB(대구)로 돌릴 수 없었다. 분류·개수는 v1 과 같게 두고 대구 동네(도심·수성못·앞산)와 대표 장소(팔공산·동촌유원지·이월드·서문시장 등)로 옮겼다.

  • 날짜는 2026-11-05(목) 10시 기준. 예보가 나오는 11-08 까지만 강수확률을 넣었다
  • 사례마다 확인한 조건(conditions)과 문장에서 뽑을 항목(inferred)을 적어 조건 해석도 채점한다
  • 조건 해석에서 끝나는 사례 8개(지역 밖·지난 날짜·30일 넘음·여러 날·짧은 시간·자정 넘김·알 수 없는 문장), 생성까지 가는 사례 54개
  • 새 기대 결과 no_course(요청의 핵심을 맞출 후보가 없음 → AI_003 + 이유), 새 검사 meals(끼니 시간대의 식당)

만들면서 확인한 데이터 사정(README 에도 적었다):

  • 반려 동반이 확인된 실내 장소가 대구에 0곳이다. AI 후보 721곳 중 동반 정보가 있는 12곳이 모두 공원·관광지·케이블카라, 큐레이션 전에는 반려 코스가 야외로만 나온다
  • 전통시장(서문시장 야시장 등)은 큐레이션해야 AI 후보가 된다(쇼핑 분류). F05·G02 는 requires 로 표시했다
  • 11월 대구에 축제가 없다. 수성국제비엔날레(행사)와 전시뿐이다
  • 계절별 시간표 23곳은 영업시간 미확인으로 읽힌다(수창청춘맨숀·대구예술발전소·향촌문화관 등). 구현 2단계에서 날짜로 고르게 고친다

검토에서 정한 것 (2026-11-05)

반려동물(P01–P10)·경계(X01–X10) 사례를 검토하고 추천안대로 정했다. 평가셋 README 와 설계 §9 에 적었다.

  • 요청의 핵심을 맞출 후보가 없으면("실내에서만" P07, "실내 전시만" X01) 야외로 채우지 않고 만들지 않는다(no_course + 이유)
  • 일부만 못 맞추면("산책하고 카페도" P02) 맞출 수 있는 만큼 만들고 알린다(partial_with_notice)
  • '돈 안 쓰는 코스'(X09)는 식당·카페를 뺀다

확인 방법

문서만 바뀌었다.

  • 평가셋 형식: 62줄 모두 JSON, id 중복 없음, 생성 사례의 날짜(오늘30일)·예보 범위·시간 길이(212시간)·반려 검사가 서로 맞는지 스크립트로 확인했다
  • 후보: 개발 DB 에서 설계 §3.2–3.3 규칙(반경·영업·영업시간 미확인·반려·행사 기간)으로 사례마다 걸러 봤다. 생성 사례 54개 모두 8곳 이상 남는다(근사 계산 — 실제 거르기는 구현 2단계)

영향 범위

  • backend
  • frontend
  • flutter
  • docker / 인프라
  • 규칙 문서(.claude/)

문서만 바뀌었다. 공유 계약은 바뀌지 않는다. 에러 코드 AI_001~AI_004 는 제안이고, 구현 PR 에서 레지스트리·세 스택 사전에 넣는다.

체크리스트

  • 린트/분석 통과 (Warning 0) · 변경 영역 테스트 통과 — 해당 없음(문서)
  • 주석 한국어, 매직 넘버·하드코딩 문자열 없음 — 해당 없음
  • 사용자 노출 실패는 모두 에러 코드와 함께 처리 — 설계에 반영(§7)
  • 에러 코드를 바꿨다면 npm run sync:error-codes 실행 후 생성 파일까지 커밋 — 해당 없음
  • 민감정보 미커밋
  • 로그에 비밀번호·토큰·요청 본문 전체가 남지 않음 — 설계에 반영(§10)

🤖 Generated with Claude Code

## 무엇을 · 왜 AI 코스 생성(디자인 화면 8–10: 조건 입력 · 만드는 중 · 결과)을 구현하기 전에 설계와 평가 기준을 정한다. 코드는 아직 없다. ### 설계안 — `docs/design/ai-course.md` (v0.2) - **흐름**: 한 문장 → 조건 해석(작은 모델, 횟수 차감 없음) → 사용자가 조건 확인 → 서버가 뒤에서 생성 → 앱이 1~2초마다 진행 조회 → 결과 - **역할**: DB 가 후보를 찾고 거른다(최대 40곳). AI 는 후보 번호로만 고르고 이유를 쓴다. 이동 시간·영업·반려 조건 검증과 순서 고치기는 코드가 한다. 화면의 사실 값(영업시간·동반 조건·출처)은 DB 에서 붙여 AI 가 지어낼 수 없다. - API 6개, 테이블 `ai_course_generation`, 에러 코드 `AI_001`~`AI_004`(제안 — 구현 PR 에서 레지스트리에 넣는다) - 비용: 1회 Haiku 5.5 약 3원 · Sonnet 5.5 약 50원대(2026-11-05 Anthropic 공식 가격) §13 결정(2026-11-05, 추천안 그대로): | # | 항목 | 결정 | | --- | --- | --- | | 1 | 하루 횟수 | 비로그인 2회 · 로그인 5회, 결과가 나온 생성만 차감 | | 2 | 비용 상한 | 개발 하루 $3, Console 월 한도 $50 부터 | | 3 | 영업시간 미확인 장소 | 자연·관광지·행사만 후보, 식당·카페·문화시설은 뺀다 | | 4 | 반려동물 | 실내는 동반 확인된 곳만, 야외는 미확인도 허용(경고), 불가·크기 불일치는 뺀다 | | 5 | 이동 시간 | 직선거리 추정('약 N분'), 경로 API 는 2단계 | | 6 | 공연(KOPIS) | MVP AI 후보에서 뺀다 | | 7 | 요청 문장 보관 | 90일 | | 8 | 모델 | 평가로 정하되 Haiku 5.5 부터 | 평가셋을 만들며 찾아 설계에 반영한 것(v0.1 에서 바뀐 부분): | 무엇 | 왜 | | --- | --- | | 조건 해석 `issues` 3개 추가 — `too_short` · `past_midnight` · `unclear_request` | "점심시간 1시간만", "밤 11시 이후", "ㅁㄴㅇㄹ" 을 나타낼 값이 없었다 | | 별칭이 특정 장소를 가리키면 그 장소를 중심으로 | 김광석다시그리기길은 도심 중심에서 1.55km 라 동네 중심으로 잡으면 걸어서 반경(1.5km) 밖이다 | | 전시는 실내로 본다 | 반려 실내 규칙·비 올 때 실내 비율이 갤러리 전시에도 맞게 | | 비 올 때 실내 비율은 후보가 모자라면 알림으로 | 반려 동반 실내 장소가 0곳이라 위반을 고칠 방법이 없다 | | 코스를 못 만들면 이유를 함께(`failure.notices`) | `AI_003` 문구만으로는 왜 못 만들었는지 보이지 않는다 | ### 평가셋 v2(대구) — `docs/ai-eval/course-eval-v2.jsonl` 62개 + README v1 은 62개 중 60개가 서울·부산·제주 등이라 장소 DB(대구)로 돌릴 수 없었다. 분류·개수는 v1 과 같게 두고 대구 동네(도심·수성못·앞산)와 대표 장소(팔공산·동촌유원지·이월드·서문시장 등)로 옮겼다. - 날짜는 2026-11-05(목) 10시 기준. 예보가 나오는 11-08 까지만 강수확률을 넣었다 - 사례마다 확인한 조건(`conditions`)과 문장에서 뽑을 항목(`inferred`)을 적어 조건 해석도 채점한다 - 조건 해석에서 끝나는 사례 8개(지역 밖·지난 날짜·30일 넘음·여러 날·짧은 시간·자정 넘김·알 수 없는 문장), 생성까지 가는 사례 54개 - 새 기대 결과 `no_course`(요청의 핵심을 맞출 후보가 없음 → `AI_003` + 이유), 새 검사 `meals`(끼니 시간대의 식당) 만들면서 확인한 데이터 사정(README 에도 적었다): - **반려 동반이 확인된 실내 장소가 대구에 0곳이다.** AI 후보 721곳 중 동반 정보가 있는 12곳이 모두 공원·관광지·케이블카라, 큐레이션 전에는 반려 코스가 야외로만 나온다 - **전통시장(서문시장 야시장 등)은 큐레이션해야 AI 후보가 된다**(쇼핑 분류). F05·G02 는 `requires` 로 표시했다 - **11월 대구에 축제가 없다.** 수성국제비엔날레(행사)와 전시뿐이다 - **계절별 시간표 23곳은 영업시간 미확인으로 읽힌다**(수창청춘맨숀·대구예술발전소·향촌문화관 등). 구현 2단계에서 날짜로 고르게 고친다 ### 검토에서 정한 것 (2026-11-05) 반려동물(P01–P10)·경계(X01–X10) 사례를 검토하고 추천안대로 정했다. 평가셋 README 와 설계 §9 에 적었다. - 요청의 핵심을 맞출 후보가 없으면("실내에서만" P07, "실내 전시만" X01) 야외로 채우지 않고 만들지 않는다(`no_course` + 이유) - 일부만 못 맞추면("산책하고 카페도" P02) 맞출 수 있는 만큼 만들고 알린다(`partial_with_notice`) - '돈 안 쓰는 코스'(X09)는 식당·카페를 뺀다 ## 확인 방법 문서만 바뀌었다. - 평가셋 형식: 62줄 모두 JSON, id 중복 없음, 생성 사례의 날짜(오늘~30일)·예보 범위·시간 길이(2~12시간)·반려 검사가 서로 맞는지 스크립트로 확인했다 - 후보: 개발 DB 에서 설계 §3.2–3.3 규칙(반경·영업·영업시간 미확인·반려·행사 기간)으로 사례마다 걸러 봤다. 생성 사례 54개 모두 8곳 이상 남는다(근사 계산 — 실제 거르기는 구현 2단계) ## 영향 범위 - [ ] backend - [ ] frontend - [ ] flutter - [ ] docker / 인프라 - [ ] 규칙 문서(.claude/) > 문서만 바뀌었다. 공유 계약은 바뀌지 않는다. 에러 코드 `AI_001`~`AI_004` 는 제안이고, 구현 PR 에서 레지스트리·세 스택 사전에 넣는다. ## 체크리스트 - [x] 린트/분석 통과 (Warning 0) · 변경 영역 테스트 통과 — 해당 없음(문서) - [x] 주석 한국어, 매직 넘버·하드코딩 문자열 없음 — 해당 없음 - [x] 사용자 노출 실패는 모두 에러 코드와 함께 처리 — 설계에 반영(§7) - [x] 에러 코드를 바꿨다면 `npm run sync:error-codes` 실행 후 생성 파일까지 커밋 — 해당 없음 - [x] 민감정보 미커밋 - [x] 로그에 비밀번호·토큰·요청 본문 전체가 남지 않음 — 설계에 반영(§10) 🤖 Generated with [Claude Code](https://claude.com/claude-code)
ttipo added 2 commits 2026-11-05 23:24:15 +09:00
MVP 의 AI 코스 생성(디자인 화면 8–10)을 만들기 전에 흐름·API·비용 보호·평가 방법을 정한다.
DB 가 후보를 고르고 AI 는 후보 번호로만 고르며, 이동 시간·영업·반려 조건 검증과 순서 고치기는 코드가 한다.
화면의 사실 값(영업시간·동반 조건·출처)은 모두 DB 에서 붙여 AI 가 지어낼 수 없게 한다.

§13 의 8가지(하루 횟수·비용 상한·영업시간 미확인·반려 엄격도·이동 시간·공연 제외·보관 기간·모델)는
2026-11-05 사용자가 추천안대로 정했다. 대구 평가셋을 만들며 찾은 것도 반영했다 — 조건 해석 issues 3개,
별칭이 가리키는 장소를 중심으로, 전시는 실내, 실내 후보가 모자라면 알림으로, 코스를 못 만들면 이유를 함께.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
docs: AI 평가셋을 대구판(v2)으로 옮김
CI / Backend (lint · test · e2e · build) (pull_request) Successful in 12m17s
CI / 에러 코드 SSOT 동기화 검사 (pull_request) Has been cancelled
CI / Frontend (lint · type-check · test) (pull_request) Has been cancelled
a15bc9982b
v1 은 62개 중 60개가 서울·부산·제주 등 대구 밖 지역이라 장소 DB(대구)로는 돌릴 수 없었다.
지역을 대구 동네(도심·수성못·앞산)와 대표 장소로, 날짜를 2026-11-05 기준으로 바꿨다.
사례마다 확인한 조건(conditions)과 문장에서 뽑을 항목(inferred)을 적어 조건 해석도 채점한다.

개발 DB 로 사례마다 거른 뒤 후보가 남는지 확인했다. 그때 본 데이터 사정 — 반려 동반이 확인된 실내 장소 0곳,
전통시장은 큐레이션해야 AI 후보, 11월 대구 축제 없음, 계절별 시간표는 미확인 — 을 README 에 적었다.
v1 은 지역을 넓힐 때 다시 쓰려고 남긴다.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ttipo added 1 commit 2026-11-05 23:37:31 +09:00
docs: AI 평가셋 검토 결과를 적고 확정함
CI / Backend (lint · test · e2e · build) (pull_request) Successful in 12m24s
CI / Frontend (lint · type-check · test) (push) Successful in 11m26s
CI / 에러 코드 SSOT 동기화 검사 (push) Successful in 12m36s
CI / Frontend (lint · type-check · test) (pull_request) Successful in 11m15s
CI / 에러 코드 SSOT 동기화 검사 (pull_request) Successful in 11m51s
CI / Backend (lint · test · e2e · build) (push) Successful in 12m12s
542732257c
반려동물·경계 사례를 검토하며 정한 정책을 평가셋 README 와 설계 §9 에 남긴다.
요청의 핵심을 맞출 후보가 없으면 다른 곳으로 채우지 않고 만들지 않으며, 일부만 못 맞추면 맞출 수 있는 만큼
만들고 알린다. '돈 안 쓰는 코스'는 식당·카페를 뺀다.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ttipo merged commit 542732257c into main 2026-11-06 00:13:54 +09:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: ttipo/wandergo#9