주요기능 해시태그 분류 — alpha 마이그레이션 기획

backhorock/oosooproduct 패턴 분석 → eval-system-premium(alpha) 적용
jodal-eval-ai · 2026-05-22 · 5/22 데모 준비
요약: oosooproduct 에는 9개 정적 CommonFeatureGroup이 정의되어 있고, 각 author 가 어느 그룹에 속하는지 authorIds 배열로 사전 매핑됩니다. AuthorComparePanel "주요기능" row 가 author 별 매칭된 그룹을 #해시태그 chip으로 노출하며, 클릭 시 URL ?group=... 으로 필터 전환됩니다. alpha 의 같은 인프라 (CommonFeatureGroup 타입, findCommonFeatureGroup, GroupSummary) 는 이미 있으므로 데이터·UI 두 영역만 이식하면 됩니다.

현황 비교

oosooproduct 그룹
9
alpha 그룹
1
alpha 인프라
데이터 매핑
영역oosooproductalpha (현재)
CommonFeatureGroup 타입 id / label / description / background / keywords[] / evaluationPoints[] / authorIds[] id / label / authorIds[] / description / background — keywords·evaluationPoints 누락
COMMON_FEATURE_GROUPS 데이터 9개 (해시태그 분류 + author 매핑) "전체" 1개만 — 의미 분류 없음
UI: 해시태그 chip AuthorComparePanel "주요기능" row 에 #{g.label} "인증정보" row 만 있음 — 주요기능 row 부재
chip 클릭 → 필터 ctx.selectGroup → URL ?group=... 전환 selectedGroupId 인프라는 있음 — selectGroup ctx 미연결
BidItemSelector 공통기능 dropdown 활성화 + 선택 시 필터링 비활성 (데이터 0)

9개 표준 그룹 (oosooproduct → alpha 이식 대상)

idlabel핵심 keywordsauthors
partial-discharge부분방전·아크 검출 (UHF/HFCT) UHF 안테나HFCTTEV아크 플래시 4
ai-diagnosisAI·머신러닝 진단 딥러닝결함 분류위험도 예측 2
seismic내진·면진·방진 면진장치이중슬립방진패드KDS 내진
thermal열관리·방열 방열 분체도료열화상핫스팟온도센서 3
live-line-detect활선부 접근 감지·감전 예방 접근 감지정전용량전계 센서인터록 4
remote-iot원격 모니터링·IoT IoT 게이트웨이LTE/Wi-Fi예지보전 4
fire-detect초기 화재 감지·소화 감지기자동소화소화액 3
mimic-ledLED 모의모선·시각화 LED 미믹계통 시각화활선 표시 2
lpvt저전력 전압 변성기 (LPVT) LPVT용량성 분압IEC 61869 1

분류 매핑 — 3가지 방안

A. 키워드 기반 정적 mock (권장 — 데모 5/22)

  • BFF endpoint POST /api/admin/recompute-groups — proposal 의 raw.feature_summary 본문 + features 텍스트에서 그룹별 keywords regex 매칭
  • 매칭 score ≥ 1 → 해당 그룹 authorIds 에 추가
  • frontend 의 COMMON_FEATURE_GROUPS 는 BFF 응답으로 채움 (또는 매 페이지 fetch)
  • 구현: 1~2시간 / 정확도 70~85% (keyword 정확하면 high)

B. LLM 동적 클러스터링

  • 업로드 시 hwpx-intelligence 의 feature_summary.bullets 를 OpenRouter/내부 vLLM 에 보내 9개 카테고리 중 매칭
  • 결과를 proposal.extraction 의 새 필드 feature_groups[] 에 저장
  • frontend 가 그 필드 read → 칩 렌더
  • 구현: 4~6시간 / 정확도 90%+ / 추가 LLM 비용

C. 수동 admin UI

  • 운영자가 admin 페이지에서 proposal 별 그룹 직접 체크
  • BFF: PATCH /api/admin/proposals/{id}/groups
  • 구현: 2~3시간 / 정확도 100% / 운영 부담

UI 구조 (oosooproduct 패턴 이식)

"주요기능" row 가 "지정번호" 다음에 위치하며 각 author cell 안에 매칭된 그룹들이 #태그 chip 으로 표시됩니다.

BASIC_INFO_ROWS 변경

{
  key: "features",
  label: "주요기능",
  render: (f, ctx) => {
    const matchedGroups = COMMON_FEATURE_GROUPS.filter((g) =>
      g.authorIds.includes(ctx.author.id),
    );
    return (
      <div className="space-y-2">
        {matchedGroups.length > 0 ? (
          <div className="flex flex-wrap gap-1">
            {matchedGroups.map((g) => (
              <button
                key={g.id}
                onClick={() => ctx.selectGroup(g.id)}
                className="rounded-full bg-indigo-50 px-2 py-0.5 text-[11px] font-semibold text-indigo-700"
              >
                #{g.label}
              </button>
            ))}
          </div>
        ) : null}
        {f.featuresSummary ? (
          <p className="text-[12.5px] leading-relaxed">{f.featuresSummary}</p>
        ) : null}
      </div>
    );
  },
},

chip 클릭 → 필터 (이미 인프라 있음)

HomeClient 가 selectedGroupId 를 URL ?group=... 으로 동기화. AuthorComparePanel 의 ctx.selectGroup 만 wiring.

마이그레이션 단계 (PR 분해)

PR 1 CommonFeatureGroup 타입 확장 + 9개 정적 그룹 시드 (keywords / evaluationPoints / authorIds=[] 초기). 1시간.
PR 2 "주요기능" row 추가 + 해시태그 chip render + ctx.selectGroup. 1시간.
PR 3 방안 A 키워드 매칭 BFF endpoint + 자동 authorIds 계산 + frontend fetch. 2시간.
PR 4 BidItemSelector 공통기능 dropdown 활성화 + 선택 시 author 필터. 1시간.
PR 5 Playwright e2e: 해시태그 chip 1개 이상 / 클릭 시 URL ?group=… / 필터링 검증. 30분.
+선택 운영용 admin UI (수동 그룹 편집) 또는 LLM 클러스터링 endpoint.

변경 파일 인벤토리

파일변경출처 참고
frontend/src/app/data/common-features-mock.ts9개 그룹 정적 시드 + 타입 확장 (keywords / evaluationPoints)oosooproduct 동일 파일 그대로
frontend/src/app/components/AuthorComparePanel.tsxBASIC_INFO_ROWS 에 features row 추가 + ctx.selectGroupoosooproduct 58~110 line
frontend/src/app/components/HomeClient.tsxselectGroup 핸들러 ctx 전달 + URL ?group sync이미 존재 — wiring 만
frontend/src/app/components/BidItemSelector.tsxdropdown 활성화 — disabled 분기 제거oosooproduct 동일 패턴
backend/app/api/admin.pyPOST /api/admin/recompute-groups — 키워드 매칭 (방안 A)방안 A 신규
backend/app/domains/proposals/use_cases/classify_groups.py도메인 use case — feature_summary 텍스트 → group ids 추출방안 A 신규
backend/app/api/proposals.pyGET /api/proposals/groups — 그룹별 authorIds 응답방안 A 신규
frontend/e2e/feature-groups.spec.ts해시태그 chip + 필터 e2e신규

예상 효과

지표현재 alpha마이그레이션 후
주요기능 row없음각 author cell 에 1~5 chip
그룹 필터링"전체"만9개 카테고리 dropdown
이름·기능 cross-reference수동 본문 읽기chip 1클릭 → 동일 그룹 author 비교
심사 가독성긴 features 텍스트해시태그 인덱싱 → 빠른 인사이트
평가 포인트 안내없음그룹별 evaluationPoints 자동 노출

참고