D-2 · 2026-05-22 (금) 마감

업로드 · 파싱 · 데이터 배치 — 우수제품 평가지원 시스템

금요일까지 우수제품 규격서(HWPX) 한 건이 업로드 → 자동 파싱 → 비교 화면에 최적 배치되는 골든 패스를 완성합니다. 백엔드와 추출 엔진은 이미 동작 — 프론트엔드 통합 작업이 핵심입니다.

인프라 · 브랜치 · 작업 위치

두 개의 Repo

Repo사용할 브랜치역할
pps-mono-repo feat/onprem-h100-deploy 우수제품 frontend + BFF (이번주 작업 코드 전부 여기)
hwpx-intelligence main HWPX 추출 엔진 (별도 repo · 수정 불필요)

우수제품 frontend 컴포넌트 지형도

영역핵심 컴포넌트 / 역할
진입점 LandingClient (메인 / 평가 시작 CTA) → 팝업으로 평가 화면 오픈
평가 화면 컨테이너 HomeClient — 현재 mock 데이터 (authors-mock · bid-items-mock) 로만 렌더
업체 비교 메인 AuthorComparePanel — 업체별(=Proposal) 핵심 비교 패널
입찰/공고 카드 BidItemSelector · noticeDetail/* (기본정보·기술·요구사항·평가 탭)
비교 섹션 5종 analysis/compare/CompareTechSection · CompareEvaluationSection · CompareRequirementsSection · CompareKpiMatrix · 각 Detail 섹션
비교 센터 패널 center/CompareCenterPanel · ItemCompare* (핵심기술/평가/요구사항 항목별)
AI 챗봇 패널 ChatPanel (AuthorComparePanel 옆에서 질문응답)
관리자 영역 admin/(auth)/login · admin/(protected)/{analysis · usage · system · settings}

LLM 호출 정책 — ai_engine 레이어 경유 필수

박찬호님 안내사항. 우수제품 프론트엔드 / BFF 에서 LLM 호출이 필요할 때 (AI 챗봇, 평가 분석 등) 반드시 ai_engine 레이어를 경유합니다. 프롬프트와 여러 서비스의 LLM 호출을 중앙에서 관리하기 위한 설계.

영역호출 가능 여부설명
services/ai_engine/online 권장 진입점 실시간 서비스 진입점 — eval_chatbot · rfp_gen_chatbot · rfp_gen_doc_assistant 등. 여기를 통해 호출.
services/ai_engine/core 내부 인프라 LLM 엔진(Gemini/Qwen) · clients · 캐싱 등 — online 레이어가 사용. 직접 사용 지양.
services/ai_engine/core/prompts 프롬프트 중앙 관리 RFP · 제안서 · 평가 · 챗봇 등 모든 프롬프트 템플릿이 한 곳에. 새 프롬프트 추가 시 여기에.
services/ai_engine/offline 직접 호출 금지 배치 처리 전용 — 외부 서비스에서 직접 호출하지 않도록 의도적으로 분리되어 있음.
각 앱 레이어에서 LLM SDK 직접 호출 금지 OpenAI · Gemini · Qwen 클라이언트를 앱 코드에서 직접 import 하지 않음.

참고 — jodal-eval-ai/pps-mono-repo/tree/main/services/ai_engine/offline · core/prompts

외부 개발 / Suman 안내 사내(온프레미스) 모델 (예: H100 vLLM) 은 사내망 안에서만 접근 가능합니다. 외부 개발 환경에서 테스트할 때는 외부 LLM (OpenRouter · OpenAI · Anthropic 등) 을 사용하며, 사내 엔드포인트로 직접 연결하지 않습니다. 호출은 동일하게 ai_engine/online 진입점을 경유하고, 환경변수로 외부 base URL · API 키만 교체합니다. 사내 vLLM 으로의 전환은 시연·운영 환경 진입 시 인프라 측이 진행.

금요일까지 — 작업 3건 (요구사항)

① 업로드

평가 화면에 HWPX 업로드 진입점이 필요합니다

현재 평가 화면(HomeClient)은 mock 데이터만 가져오고, 업로드 UI 자체가 없음. BFF·추출 엔진은 동작하므로 화면 영역만 추가하면 됩니다.

필요 UX
① HomeClient 상단 또는 별도 진입 — 드래그앤드롭 영역 + 파일 선택 버튼
② .hwp / .hwpx 만 허용 (다른 확장자 거부 토스트)
③ 업로드 직후 진행률 표시 영역 (선택)
데이터 흐름
선택된 파일 → BFF 업로드 API → 응답에서 spec_id 받음 → 평가 화면 새 단위로 추가
상태
신규 컴포넌트 + 진입 라우트 결정 필요
② 파싱

HWPX 추출 엔진 API 키만 확보하면 자동 동작합니다

BFF가 업로드를 받으면 추출 엔진을 자동 호출하고, 완료 시 webhook으로 결과가 BFF에 저장되는 흐름은 모두 구현 완료. 운영용 API 키만 필요합니다.

필요한 것
추출 엔진의 LLM/VLM API 키 — 외부 개발 환경은 외부 LLM (OpenRouter · OpenAI 등), 사내망/시연은 사내 vLLM 엔드포인트. 사내 엔드포인트는 외부에서 도달 불가.
검증 시점
실제 HWPX 1건 (예: JK알에스티 2025057) 업로드 시 회사명·지정번호·인증·시험 정보가 정상 추출되는지 시연
상태
API 키 발급 + 시연 환경 적용
③ 데이터 배치

비교 화면의 Mock 데이터를 실제 추출 결과로 교체합니다

HomeClient / AuthorComparePanel 이 현재 hardcoded mock 만 보여줌. BFF가 매핑된 결과를 응답하므로 데이터 소스만 교체 + UX 배치 결정이 필요합니다.

교체할 mock
authors-mock (업체 목록) · bid-items-mock (입찰 항목)
→ BFF의 매핑된 Proposal 응답으로 교체
표시할 9 필드
회사명 · 지정번호 · 제품 카테고리 · 제품명 · 핵심 특징 요약 · 추출 신뢰도 · 파서 버전 · proposal_id · 원본 보기
결정 필요
9 필드가 비교 UI의 어디에 어떻게 배치될지 — 회사명/지정번호는 AuthorComparePanel 헤더, 특징 요약은 카드 본문, 신뢰도는 배지 등 — UX 회의에서 확정
변경 대상 컴포넌트
HomeClient · AuthorComparePanel · BidItemSelector · CompareTechSection 등 비교 섹션 5종
AI 호출 시
ChatPanel 등에서 LLM 응답이 필요하면 ai_engine/online 의 eval_chatbot 서비스 경유. 앱에서 LLM SDK 직접 호출 금지 (위 정책 참조)
상태
데이터 소스 교체 + UX 배치 회의

진척 상태 (시작점)

영역상태설명
BFF 업로드 → 추출 트리거동작callback_url 자동 부착 + 멱등 webhook 수신
ProductRecord → Proposal 매핑 (9 필드)동작매핑 로직 1곳에 캡슐화
비교 결과 조회 API동작spec_id 단건 + 전체 리스트
frontend 업로드 컴포넌트없음① 의 핵심
frontend 비교 UI 실데이터mock③ 의 핵심
추출 엔진 API 키미설정② 의 핵심
자동 회귀 가드 (e2e + pytest)196 시나리오변경 시마다 3.8초 회귀
ai_engine 레이어 (online · prompts)존재LLM 호출 진입점 + 프롬프트 중앙 관리 — 우수제품 평가 화면도 여기 경유

소스 링크 — repos · 브랜치 · 파일

영문 버전 — https://pps-friday-plan-suman.pages.dev/