fingu-tips KSEL 종합 리포트

2. 코드 전수 분석

레포 FINGU-GRINDA/fingu-tips-rnd-evaluation · 브랜치 alpha @ f531aa5 · 4 병렬 에이전트 깊이 분석

TL;DR

KSEL 7-KPI 평가용 풀스택 모놀리식 PoC. FastAPI 백엔드 + React 19 SPA + nginx 정적 + Claude Agent SDK 통합. 단일 EC2 (t4g.xlarge AL2023) · alpha push → GitHub Actions → rsync → Infisical export → rolling restart → smoke (deploy_id 일치). 3-tier requirements (vercel stub / EC2 real / dev) 로 250MB Vercel 제약과 ~7GB HF 모델을 같은 코드베이스에서 처리.

2.1 레포 구조

경로파일용량역할
src/48404 KB도메인 · KPI · 어댑터 · 메트릭 · Agent
api/992 KBFastAPI 진입점 · chat · agent · ksel
frontend/55524 KBReact 19 SPA · 4 페이지
tests/31172 KBpytest (alpha 머지 전 기준)
datasets/2310 MBKPI 평가 (jsonl + csv)
deploy/520 KBCaddyfile · setup-ec2.sh
scripts/1496 KBbuild_datasets · deploy.sh
evidence/5252 KBKSEL 시험의뢰서 · 기술 PDF

2.2 백엔드 핵심

진입점

FastAPI app
src/api.py:235 — title "TIPS R&D KPI Evaluation API" v0.6.0
Vercel 진입
api/index.py — builder 가 app 심볼 인식
로컬
uvicorn src.api:app --host 0.0.0.0 --port 8000
전역 시드
SEED=20260514 — KPI별 stub 결정성
미들웨어
x-request-id 주입 · CORS · 구조화 로깅 ContextVar

7 KPI 구현 매트릭스

KPI모듈데이터셋어댑터합격선
① 재무 F1kpi/kpi1_finance_qa.py1,050건pipelines/agents:classify_scenario (16 시나리오)71.07
② 분류kpi/kpi2_text_classification.py1,000건pipelines/thread_titles:classify_intent99 %
③ BLEUkpi/kpi3_translation.py500건pipelines/finetune_inference:generate (vLLM + Qwen-ORPO / stub)78
④ 처리속도kpi/kpi4_throughput.py10,000건pipelines/data_augmentation:augment_record500/min + 99.9 %
⑤ 개인화kpi/kpi5_personalized_recommendation.py500건pipelines/recommendations:score_personalization0.31
⑥ NQ 검색kpi/kpi6_finance_search.py1,000건pipelines/search:search_top_k (Pinecone/Faiss / BM25)64.06
⑦ 상품추천kpi/kpi7_product_recommendation.py1,000건pipelines/recommendations:recommend_top_k86

AI 모델 어댑터 (src/ai_clients/)

클라이언트generateembed
AnthropicClientO (Claude)X (raise)
OpenAIClientOO
EmbeddingClientXO (sentence-transformers)
LocalModelClientO (vLLM)
GeminiClientO

공통 베이스 _base.py::BaseClient ABC. SDK 없이도 import 성공, 호출 시점만 NotImplementedError.

Claude Agent (/api/chat, /api/agent/*)

구현
src/agents/financial_agent.py::FinancialAgent
모델
기본 claude-opus-4-7 · max_tokens 4096 · effort "high" · max_turns 6 (운영은 sonnet-4-5)
Prompt cache
시스템 + 8 도구에 cache_control={"type":"ephemeral"} — ~10× 절감
Fallback
Claude → OpenAI gpt-4o-mini → canned 응답

등록 8 도구 (src/agents/tools.py)

  1. get_portfolio_overview
  2. get_recent_transactions
  3. classify_intent (KPI ②)
  4. recommend_products (KPI ⑦)
  5. simulate_financial_plan
  6. search_finance_knowledge (KPI ⑥)
  7. calculate_dti_ltv
  8. classify_finance_scenario (KPI ①)

측정 결과 & 로깅

페르소나 6명 (api/personas_data.py)

ID나이직업자산위험도
jiyu25스타트업 마케터1,200만high
minjae35IT 부장8,500만mid
eunyoung62은퇴4억low
soyeon28프리랜서 디자이너1,800만high
junho38개업 의사1.5억mid
jaesung55공무원2.5억low

2.3 프론트엔드 (React 19 SPA)

스택

프레임워크
React 19.0.0 · Vite 6.0.0 · TS 5.6.0 · pnpm 10.20
라우팅
react-router-dom 7.1
상태
React Context × 3 + TanStack Query 5.59
스타일
Tailwind CSS 4.0 (Vite plugin)
차트
recharts 3.8.1
CSV
papaparse 5.5.3

4 페이지 + KPI 매핑

경로역할KPI
/대시보드 — 페르소나별 자산·거래·차트
/chatAI 어시스턴트 + 측정 패널 + CSV 배치①②③⑤⑥
/recommendTop-10 추천 + 적합도 ring
/analysis10/15/20년 재무 시뮬 + 처리속도 1분×5회
/admin/logs실시간 로그 뷰어 SSE · CSV/JSONL 다운로드전체

측정 컨텍스트 (3 Context)

SSE 구현: EventSource 미사용. POST + ReadableStream 직접 파싱 (AbortController 호환). 이벤트 타입 — text_delta · thinking_delta · tool_use_start · done.

2.4 인프라 · CI/CD

워크플로

워크플로트리거역할
ci-cd-alpha.ymlalpha pushEC2 자동 배포 (concurrency 직렬화)
ci.ymlPR/push경로 필터 분기 — api/frontend/docker-build

배포 흐름 (scripts/deploy.sh)

  1. SSH 키 로드 (webfactory/ssh-agent)
  2. rsync 동기화 (.git/node_modules/.env* 제외)
  3. 원격 infisical export --env=beta --path=/fingu-tips --format=dotenv.env
  4. DEPLOY_ID=${{github.sha}} append
  5. docker compose build --quiet → rolling restart (api healthcheck wait → web)
  6. 외부 smoke — /api/health.deploy_id == github.sha 매칭 (5회 지수백오프)

Requirements 3-tier

파일용도크기
requirements.txtVercel stub~ 250 MB
requirements-real.txtEC2 real (HF 모델)> 7 GB
requirements-test.txtCI unitcompact
requirements-dev.txt로컬 개발full

nginx (nginx.conf)

2.5 테스트 · 증빙 · 데이터셋 (PR #62 이전)

pytest 파일
31 개 · 3,289 LOC
conftest
autouse fixture _clear_ai_secrets — 모든 AI 키 제거
contract test
test_kpi_contract.py — 7 KPI parametrize · MIN_SAMPLES KSEL 기준 일치
메트릭 단위
test_f1_score · test_bleu · test_nq_em · test_llm_rec_score · test_throughput
CI
pytest tests/ -x --tb=short -q --timeout=30 \|\| true — 실패해도 통과 (PR #62에서 보강)

데이터셋 (15,050 sample)

KPI분량출처라이선스라벨
11,050GPT-4o-mini 합성OpenAI 약관O
21,000GPT-4o-miniOpenAI 약관O
3500참고문서 기재참고문서 기재O
410,000Faker seed 20260514MITX · 의도
5500참고문서 기재참고문서 기재참고용
61,000GPT-4o-miniOpenAI 약관O
71,000 + 카탈로그FakerMITO

evidence/

2.6 API 라우트 전체

메서드경로핸들러 (path:line)
GET/api/healthsrc/api.py:358
GET/api/kpi:386
GET/api/kpi/{n}/dataset:417
POST/api/kpi/{n}/evaluate:442
POST/api/kpi/4/evaluate?run=N:504
POST/api/kpi/measure-all:579
GET/api/kpi/{n}/results:768
GET/api/kpi-summary:784
POST/api/kpi/{n}/dataset/upload:668
POST/api/kpi/{n}/evaluate/with-dataset:717
GET/api/kpi/{n}/dataset/sample:751
POST/api/kpi/{n}/sample:978
POST/api/kpi/4/evaluate/stream:1022 (SSE)
POST/api/kpi/{n}/evaluate/stream:1105 (SSE)
GET/api/personas:856
GET/api/personas/{id}:862
GET/api/personas/{id}/portfolio:874
GET/api/personas/{id}/recommendations:919
POST/api/chat:899
POST/api/analysis/simulate:1260
GET/api/agent/healthapi/agent.py:34
GET/api/agent/toolsapi/agent.py:69
POST/api/agent/converse(/stream)api/agent.py:113