Skip to content

복잡도 분석(complexity-analysis) 정확도 개선 필요 — 유저 주석 판별 오작동 #30

Closed

Description

@lkhoony

배경

현재 PR에 붙는 시간/공간 복잡도 분석 기능(handlers/complexity-analysis.js)에서 유저가 남긴 복잡도 주석을 OpenAI(gpt-4.1-nano)가 제대로 판별하지 못하는 케이스가 관찰되고 있습니다.

현상

  1. 한 파일에 여러 풀이가 있고 각 풀이마다 주석이 달려 있는 경우, 일부 풀이의 userTime / userSpace를 제대로 가져오지 못하거나 다른 풀이의 주석과 섞여서 매칭됩니다.
  2. 사용자가 복잡도 주석을 전혀 남기지 않았는데도 hasUserAnnotation=true로 판정되어, 없는 유저 분석이 있는 것처럼 댓글이 렌더링됩니다.

두 케이스 모두 결과 댓글의 유저 분석 / 실제 분석 / 결과 표가 오해를 유발하고, 매칭 결과(✅/❌)가 신뢰할 수 없게 됩니다.

확인이 필요한 것

  • 현재 사용 중인 SYSTEM_PROMPT가 위 두 케이스를 충분히 지시하고 있는지
  • 실제 OpenAI에 전달되는 요청 payload(특히 여러 풀이가 담긴 user prompt의 형태)
  • OpenAI가 돌려주는 응답 JSON 원문 — 정규화 이전의 raw 값 확인

제안

  • 문제가 재현되는 PR에서 요청 본문과 응답 본문을 로깅하여 어떤 단계에서 누락/오판이 생기는지 특정
  • 필요 시 SYSTEM_PROMPT에 다음을 보강:
    • 풀이별로 주석을 근접성(바로 위/안쪽) 기준으로 귀속시키는 규칙 강화
    • 주석이 없을 때 hasUserAnnotation=false를 반드시 반환하도록 반례 예시 추가

관련 파일

Activity

  1. lkhoony commented on May 1, 2026

    @lkhoony
    ContributorAuthor

    해결 진행 상황

    30-big-o 브랜치에 책임 분리(plan v4) 방식으로 수정 완료. 커밋 01a449a.

    핵심 변경 — 책임 분리

    기존(v3 9bb73b3)은 LLM 단독 책임이었으나, 4개 실패 모드(actualTime 역조작 / 한국어 문장 침투 / matches 오판 / 환각)가 반복 재현됨. 이를 코드와 LLM의 책임을 명확히 분리하여 구조적으로 차단:

    책임 v3 v4
    사용자 주석 추출 (userTime/userSpace) LLM 코드 (정규식)
    actualTime / actualSpace 계산 LLM LLM (단, 사용자 주석은 사전 strip)
    matches 판정 LLM 코드 (bigOEquals 정규화 동등성)
    feedback / suggestion LLM LLM

    신규 코드 모듈 (handlers/complexity-analysis.js)

    • stripComplexityComments — LLM 호출 직전에 사용자 복잡도 주석을 빈 줄로 치환 → actualTime이 user값에 오염될 길 차단
    • extractUserAnnotations(content, headerLine) — 헤더 라인 위쪽 연속 주석 블록에서 O(...) 리터럴만 추출. 클래스 wrapper(class X:, public class Y {, impl Z {)는 투명 통과
    • bigOEquals — 공백 제거, ²→^2, **→^ 정규화 후 결정적 비교
    • cleanBigO — 모델이 끼워넣는 부연 설명 제거 (예: O(n) (최악) → O(n))
    • composeSolution — 모델 응답 + 원본 소스 → 최종 솔루션 객체 합성

    LLM 응답 스키마 변경

    10필드 → 7필드. user-* / matches 4필드 제거하고 headerLine 1필드 추가. SYSTEM_PROMPT 11.7KB → 2.0KB (83% 감소).

    추가로 발견된 모델 글리치 흡수

    • problemName truncation (longest-... → long-...): 정확 일치 실패 시 인덱스로 폴백
    • actualTime 부연 설명 끼워넣기: cleanBigO 가 정리

    실 API 검증 (gpt-4.1-nano, 4 PR)

    PR #2544 (JS), #2566 (Python), #2572 (Java), #2577 (Rust) 로 실측.

    실패 모드 v3 v4
    actualTime 역조작 재현 🟢 차단
    한국어 문장 침투 재현 🟢 차단
    matches 오판 재현 🟢 차단
    환각 (no comment → fabricate) 재현 🟢 차단

    19개 풀이 중 16개 완전 정확 (84%), 0개 오류 (100% 비-오류). 나머지 3개는 사용자가 본문 docstring 안에 작성한 케이스로, 권장 안내 메시지(💡 풀이에 시간/공간 복잡도를 주석으로 남겨보세요) 자동 표시.

    호환성

    • 댓글 마크다운 포맷 / <!-- dalestudy-complexity-analysis --> 마커: 변경 없음
    • 호출 모델 / 파라미터 (gpt-4.1-nano, temperature=0.2, max_tokens=4000): 변경 없음
    • Cloudflare Workers 호환성: 유지 (Web Crypto API + fetch 만 사용)
    • 외부 export 시그니처(analyzeComplexity): 변경 없음

    테스트

    • bun test handlers/complexity-analysis.test.js — 64 pass / 0 fail
    • 전체 프로젝트 — 94 pass / 0 fail
    • 신규 단위 테스트 32개 (helpers 6 + composeSolution 5 + 통합 보완)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions