DOCS/journey/troubleshooting/260112_bayesian_valuation_phase1_implementation.md
Claude-51124 4759439a0c docs: troubleshooting 문서에서 남은 작업 섹션 제거
- 원칙 위반: troubleshooting 문서에 남은 작업 기록 금지
- 남은 작업은 plans/ 문서에만 기록
2026-01-20 09:40:30 +09:00

4.0 KiB

베이지안 스타트업 가치평가 Phase 1 구현 완료

작성일: 2026-01-12 작성자: Auto (Claude) 관련 문서: plans/251016_bayesian_startup_valuation.md


작업 개요

베이지안 스타트업 가치평가 프레임워크의 Phase 1 (Neo4j 유사 기업 탐색) 구현 완료

목표: 계획 문서 요구사항에 따라 투자 단계 필터링 및 Top-5 유사 기업 반환 기능 추가


구현 내용

1. 투자 단계 범위 함수 추가

파일: rb8001/app/services/startup_valuation.py

함수: _get_stage_range_for_query(stage: str) -> List[str]

기능:

  • 투자 단계 ±1 범위 반환 (계획 문서 요구사항)
  • 예: seed → [seed, pre-a], pre-a → [seed, pre-a, series a]

코드:

def _get_stage_range_for_query(stage: str) -> List[str]:
    """투자 단계 ±1 범위 반환 (Phase 1 요구사항)
    
    계획 문서: seed → pre-A/series A 허용 (±1 단계)
    """
    stage_order = ["seed", "pre-a", "series a", "series b", "series c", "series d"]
    
    normalized = _normalize_stage(stage)
    
    try:
        idx = stage_order.index(normalized)
    except ValueError:
        return ["seed"]
    
    result = []
    if idx > 0:
        result.append(stage_order[idx - 1])
    result.append(stage_order[idx])
    if idx < len(stage_order) - 1:
        result.append(stage_order[idx + 1])
    
    return result

2. Neo4j 쿼리 개선

함수: get_dynamic_prior_from_neo4j(ir_metrics: Dict[str, Any])

변경 사항:

  1. 투자 단계 필터링 추가: invstCdKr 또는 investment_stage 필드로 ±1 범위 필터링
  2. LIMIT 500 → LIMIT 5 변경 (계획 문서 요구사항: Top-5)
  3. bizNamesKr 필드 추가 (한국 스타트업 데이터 지원)

Cypher 쿼리 개선:

MATCH (s:Startup)
WHERE any(tok IN $tokens WHERE (
    (exists(s.tagNamesKr) AND any(t IN s.tagNamesKr WHERE toLower(t) CONTAINS tok)) OR
    (exists(s.bizNamesKr) AND any(t IN s.bizNamesKr WHERE toLower(t) CONTAINS tok)) OR
    ...
))
AND (
    (exists(s.invstCdKr) AND toLower(s.invstCdKr) IN $stage_range) OR
    (exists(s.investment_stage) AND toLower(s.investment_stage) IN $stage_range) OR
    NOT exists(s.invstCdKr) AND NOT exists(s.investment_stage)
)
RETURN s.investment AS investment, s.employees AS employees
LIMIT 5

테스트

파일: rb8001/tests/test_bayesian_valuation_phase1.py

테스트 결과: 4개 모두 통과

  1. test_normalize_stage: 투자 단계 정규화 테스트
  2. test_phase1_similar_companies_query_with_stage_filter: 투자 단계 필터링 포함 검증
  3. test_phase1_similar_companies_returns_top5: LIMIT 5 검증
  4. test_phase1_stage_normalization_for_query: 투자 단계 범위 로직 테스트

TDD 원칙 준수:

  • Red: 테스트 먼저 작성 (실패 확인)
  • Green: 최소한의 코드로 테스트 통과
  • Refactor: (향후 개선 가능)

구현 완료 (커밋 해시)

  • feat: add _get_stage_range_for_query function for investment stage filtering
  • feat: improve get_dynamic_prior_from_neo4j with stage filtering and LIMIT 5

교훈

1. TDD 원칙 준수

  • 테스트 먼저 작성 (Red) → 구현 (Green) → 리팩터 순서로 진행
  • 테스트 코드에서 실제 검증 로직 추가하여 구현 방향 명확화

2. 계획 문서 요구사항 명확히 반영

  • 투자 단계 ±1 범위: _get_stage_range_for_query 함수로 명확히 구현
  • Top-5 반환: LIMIT 5로 변경
  • 데이터 구조 호환성: invstCdKr, bizNamesKr 필드 지원

3. 기존 코드 호환성 유지

  • 기존 investment, employees 필드 구조 유지 (YC 데이터 지원)
  • 한국 스타트업 데이터 필드(bizNamesKr, invstCdKr) 추가 지원
  • 필드가 없는 경우에도 동작하도록 OR 조건 사용

참고

  • 계획 문서: plans/251016_bayesian_startup_valuation.md
  • 데이터 마이그레이션: troubleshooting/251016_neo4j_startup_data_migration.md
  • 실현 가능성 테스트: rb8001/tests/test_bayesian_valuation_plan_feasibility.py