[STK2-05] 감성 엔진 (claude -p)

작업 내용 (설계 의도)

변경 사항

  • sentiment.pyclaude -p 서브프로세스 호출(timeout 120s).
  • JSON 파싱({"score":-1~1,"label":...}) → 클램핑 → NEUTRAL 폴백.
  • 프롬프트: 실적·수주·규제·신제품 가중, JSON만 강제.
  • API 키 미사용(로그인된 CLI 전제).

의존

  • 선행: STK2-03
  • 후행: STK2-06

롤백

  • 감성 비활성 시 중립(0.0) 고정 → 추세만 반영.

다이어그램

처리 흐름

sequenceDiagram
    participant SS as signal_service
    participant SE as sentiment.py
    participant CL as claude CLI (subprocess)
    SS->>SE: score(headlines)
    alt headlines 비어있음
        SE-->>SS: 0.0 (NEUTRAL)
    else headlines 있음
        SE->>CL: subprocess.run(["claude","-p", prompt], timeout=120)
        alt timeout 또는 호출 실패
            SE-->>SS: 0.0 (NEUTRAL)
        else 정상 응답
            CL-->>SE: {"score": -1~1, "label": "..."}
            alt JSON 파싱 실패
                SE-->>SS: 0.0 (NEUTRAL)
            else 파싱 성공
                SE->>SE: clamp(score, -1, 1)
                SE-->>SS: sentiment_score: float
            end
        end
    end

클래스 의존

flowchart LR
    subgraph Application["Application"]
        signal_service["signal_service.py"]
    end
    subgraph Domain["Domain"]
        sentiment["sentiment.py (score)"]
    end
    subgraph External["External"]
        claude_cli["claude CLI (subprocess)"]
    end
    signal_service --> sentiment
    sentiment --> claude_cli

테스트 케이스

  • 헤드라인이 0건이면 즉시 중립(0.0)을 반환한다.
  • claude -p 응답이 유효한 JSON {"score":0.8,"label":"긍정"}이면 클램핑 후 반환한다.
  • 응답 JSON에 score 필드가 없거나 파싱이 불가하면 중립(0.0)으로 폴백한다.
  • 서브프로세스가 120초 타임아웃에 걸리면 중립(0.0)으로 폴백한다.
  • 반환된 score가 항상 [-1.0, 1.0] 범위 내에 있다.