generated from ttipo/project-base
feat(backend): AI 코스 평가 실행기와 후보 스냅샷, 기준선 결과 추가
CI / Backend (lint · test · e2e · build) (pull_request) Successful in 12m46s
CI / Frontend (lint · type-check · test) (pull_request) Successful in 11m26s
CI / 에러 코드 SSOT 동기화 검사 (pull_request) Successful in 11m28s
CI / Frontend (lint · type-check · test) (push) Has been cancelled
CI / 에러 코드 SSOT 동기화 검사 (push) Has been cancelled
CI / Backend (lint · test · e2e · build) (push) Has been cancelled
CI / Backend (lint · test · e2e · build) (pull_request) Successful in 12m46s
CI / Frontend (lint · type-check · test) (pull_request) Successful in 11m26s
CI / 에러 코드 SSOT 동기화 검사 (pull_request) Successful in 11m28s
CI / Frontend (lint · type-check · test) (push) Has been cancelled
CI / 에러 코드 SSOT 동기화 검사 (push) Has been cancelled
CI / Backend (lint · test · e2e · build) (push) Has been cancelled
모델과 effort 를 정하려면 같은 후보로 평가셋 62개를 돌려 목표(설계 §9)와 견줄 도구가 필요했다. 평가가 서버와 다른 길을 돌면 결과를 믿을 수 없어서, 파이프라인의 'AI 초안 → 시간표 → 다시 부르기'를 course-planning.ts 로 떼어 파이프라인 · ai:check · ai:eval 이 같은 함수를 쓰게 했다. Haiku 5.5 와 Sonnet 5.5 기준선을 재 보니 자동 채점 실패의 3분의 2가 시간표 코드가 식당을 식사 시간대로 밀지 않아서였다. 모델 결정은 그 고치기와 프롬프트 v2 뒤로 미룬다(설계 §9.1). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit was merged in pull request #15.
This commit is contained in:
@@ -79,6 +79,40 @@ WanderGo AI 코스 생성이 **조건을 지키는지**, **없는 정보를 지
|
||||
|
||||
목표(초안): 자동 채점 통과율 95% 이상, `pet_policy` 위반 0건, 지어낸 정보(영업시간·동반 여부·가격) 0건.
|
||||
|
||||
## 실행 (`npm run ai:eval`)
|
||||
|
||||
실행기는 `backend/src/commands/ai-eval.ts` 다. 개발 compose 가 이 폴더를 백엔드 컨테이너의 `/eval` 에 붙인다
|
||||
(compose 를 바꾼 뒤에는 `up -d --force-recreate backend` 로 컨테이너를 다시 만든다).
|
||||
|
||||
```bash
|
||||
# 1) 후보 스냅샷 — DB 만 쓴다(키 불필요). 한 번 만들고, 모델 비교는 같은 스냅샷으로 한다
|
||||
docker exec wandergo-backend npm run ai:eval -- --snapshot # 다시 만들 때는 --force
|
||||
|
||||
# 2) 실행기 확인 — 가짜 AI(키·비용 없음)
|
||||
docker exec wandergo-backend npm run ai:eval -- --fake
|
||||
|
||||
# 3) 실제 평가 — ANTHROPIC_API_KEY 를 쓰므로 키가 있는 환경에서 사람이 실행한다
|
||||
docker exec wandergo-backend npm run ai:eval -- --only=D01,P07,G01 --judge # 먼저 몇 개만
|
||||
docker exec wandergo-backend npm run ai:eval -- --model=claude-haiku-5-5 --judge
|
||||
docker exec wandergo-backend npm run ai:eval -- --model=claude-sonnet-5-5 --judge --budget=4
|
||||
```
|
||||
|
||||
- **스냅샷** `snapshots/course-eval-v2.candidates.json` 은 커밋한다. 사례마다 반경 안 후보(거르기 전)와,
|
||||
평가셋의 장소 이름(지역 장소 · 이전 코스 · `requires` · `place:이름`)을 장소 DB id 로 바꾼 값을 담는다.
|
||||
거르기·줄이기는 실행할 때 지금 코드로 다시 하므로, 거르기 규칙을 고쳐도 같은 스냅샷으로 비교할 수 있다.
|
||||
장소 DB 가 크게 바뀌면(큐레이션 등) `--snapshot --force` 로 다시 만들고, 이전 결과와는 비교하지 않는다.
|
||||
- **조건 해석**은 평가셋의 `today`·`now`·`baseArea` 로 부른다. 장소 이름 찾기는 그때의 장소 DB 로 한다.
|
||||
- **생성**은 사용자가 확인한 `conditions` 로 서버와 같은 함수(거르기 → 줄이기 → AI 초안 → 시간표·검증·고치기 → 다시 부르기)를 돈다.
|
||||
날씨는 `context.weather` 의 강수확률을 쓴다. AI 제한 시간(`AI_TIMEOUT_MS`)과 다시 부르기 조건(생성 45초)도 서버와 같다.
|
||||
- **AI 채점자**(`--judge`, 기본 `claude-sonnet-5-5` · effort medium)는 AI 에 준 후보 목록을 그대로 받아,
|
||||
그 목록에 없는 사실을 단정한 글을 지어낸 정보로 적는다(영업시간 · 반려 동반 · 가격 · 그 밖). 프롬프트는 `ai-eval/judge.ts`(`judge-v1`).
|
||||
- 자동 채점에 `prompt_leak`(지시문 줄이 결과 글에 그대로 나왔는가)을 더 본다.
|
||||
- 결과는 `runs/<실행 id>/` 에 남는다(커밋하지 않는다) — `summary.md`(목표와 나란히 본 요약) ·
|
||||
`review.md`(사례별 코스, 사람 검토 10개 표시) · `results.jsonl`(사례별 원자료) · `meta.json`(옵션).
|
||||
요약은 설계 문서 §9 에 옮긴다.
|
||||
- 옵션: `--effort` · `--condition-model` · `--condition-effort` · `--judge-model` · `--judge-effort` ·
|
||||
`--part=conditions|course` · `--only=` · `--concurrency=`(기본 3) · `--budget=`(달러, 기본 3 — 닿으면 남은 사례를 돌리지 않는다).
|
||||
|
||||
## 만들면서 확인한 데이터 사정 (2026-11-05)
|
||||
|
||||
기대 결과는 이날 개발 DB 를 기준으로 정했습니다. 첫 실행 때 후보 스냅샷을 만들면서 다시 확인합니다.
|
||||
|
||||
Reference in New Issue
Block a user