02. 기술 연관성 매핑 — RFP 요구사항 ↔ 보유 기술 (소스코드 증거)
본 문서는 사업계획서 「기술보유현황」의 핵심 근거표다. 각 요구사항에 대해 PPS 모노레포의 실제 구현(파일 경로·심볼명)을 1:1로 제시한다. 경로는
pps-mono-repo/루트 기준.
판정 기준 — ✅ 즉시 보유(운영 코드 존재) · 🟡 부분 보유(핵심 기반 존재, 도메인 적용/일부 보강) · 🔴 미보유(기반 기술 보유, 신규 구현)
A. AI 초안 생성 엔진
A-1. 민간 LLM + 오픈소스 LLM 동시 운용 — ✅
RFP는 "민간 LLM API 연계"와 "오픈소스 LLM 구축"을 동시 고려 대상으로 명시. PPS는 단일 모델 팩토리로 양쪽을 추상화해 이미 운용 중.
| 증거 | 내용 |
|---|---|
services/ai_engine/core/engines/factory.py |
create_engine() — provider별 엔진 인스턴스화 |
services/ai_engine/core/engines/base.py |
EngineBase 추상 클래스 — 모든 엔진 공통 인터페이스 |
.../engines/gemini_engine.py, openrouter_engine.py |
민간 API: Gemini, OpenRouter(Groq·Upstage 경유) |
.../engines/qwen_engine.py, hyperclovax_engine.py |
오픈소스/로컬 vLLM: Qwen, HyperCLOVA X (OpenAI 호환 API) |
services/ai_engine/core/model_config.py |
ModelConfig dataclass — 환경변수 기반 동적 모델 로드(코드 수정 없이 모델 교체) |
차별점 — 민간 API ↔ 폐쇄망 내부 vLLM을 설정값만으로 전환. RFP의 "민간 연계 vs 오픈소스 구축" 양자택일 고민을 동일 코드베이스로 모두 충족.
A-2. 자금별 유형 분류체계 — 🟡
RFP: 자금 유형별 신청서 서식 자동 분류. PPS는 문서 유형·카테고리 분류 + 유사도 기반 자동 매칭 기반 보유. 정책자금 자금명(창업기반·혁신성장 등) 분류 라벨만 도메인 적용 필요.
| 증거 | 내용 |
|---|---|
services/knowledge_hub/core/storage/rdb/rfp_db/models.py |
RFPSourceFile.file_format/source_type, RFPRequirement.category |
services/knowledge_hub/core/rfp/rfp_query_service.py |
search_similar_rfps() — 유사도 기반 유형 자동 매칭 |
A-3. RAG 파이프라인 (벡터 DB + 검색) — ✅ (강점)
RFP 핵심 기술 = "RAG 파이프라인". PPS는 한국어 특화 임베딩 + Qdrant + 하이브리드 검색을 운영 데이터로 검증 완료.
| 증거 | 내용 |
|---|---|
services/knowledge_hub/core/storage/vector_db/vector_db.py |
VectorDBClient — Qdrant 클라이언트 래퍼(저장/검색/필터) |
services/knowledge_hub/core/rfp/rfp_indexer.py |
3-tier 컬렉션: rfp_documents·rfp_sections·rfp_requirements / _chunk_text() 청킹(5000자, overlap 300) |
docs/development/embedding_strategy.md |
임베딩 모델 KURE-v1 (1024-dim 한국어 모델) |
services/knowledge_hub/core/rfp/rfp_query_service.py |
RFPQueryService — RRF 랭킹(40%) + cosine 유사도(60%) 하이브리드 |
docs/development/vector_search_test_report.md |
검증 규모: section 18,547 / requirement 186 / document 30 벡터, 문서 검색 정확도 77~79% |
차별점 — 영문 임베딩이 아닌 한국어 전용 KURE-v1 채택 → 공고문·서식 등 한글 행정문서에서 검색 품질 우위. RFP의 "답변 퀄리티" 고려사항에 직접 대응.
A-4. 프롬프트 엔지니어링 — ✅ (강점, 정확 대응)
RFP: 유형별 프롬프트 + "서식 개정 시 재학습 없이 프롬프트 수정만으로 즉시 반영". PPS의 PromptRegistry가 이 요구를 정확히 충족.
| 증거 | 내용 |
|---|---|
services/ai_engine/core/prompts/registry.py |
PromptRegistry — .md/.yaml 파일을 frontmatter(YAML)로 로드, 코드 배포 없이 프롬프트 교체 |
core/prompts/ 디렉토리 구조 |
도메인별 분리: /rfp/, /chatbot/, /eval_system_analysis/, /document_assistant/ |
| 프롬프트 메타데이터 | description·requires_json·temperature·estimated_input/output_tokens |
예) core/prompts/rfp/structure.md, extract_toc_from_headings.md |
유형별 프롬프트 + 단계별 규칙(CoT 흔적) |
차별점 — 프롬프트가 소스코드와 분리된 외부 파일. RFP가 명시한 "재학습 없이 프롬프트 수정만으로 서식 개정 즉시 반영" 운영체계를 이미 보유.
A-5. 할루시네이션 최소화 (공고문·서식 기반 생성) — ✅
RFP: 공고문·서식 기반 문구 생성으로 할루시네이션 최소화. PPS는 RAG 컨텍스트 주입 + Few-Shot으로 사실 기반 생성.
| 증거 | 내용 |
|---|---|
services/ai_engine/clients/knowledge_hub_client.py |
search_proposal_sections()/search_proposal_documents() — 생성 전 근거 컨텍스트 주입 |
services/data_pipeline/rfp2/requirement_extractor.py |
RFPRequirementExtractor — 원문 요구사항 추출 → Few-Shot/근거 활용 |
A-6. 항목별 초안 스트리밍 (첫 응답 5초) — 🔴
RFP: 항목별 초안 스트리밍 생성, 첫 응답 5초 미만. PPS는 현재 "stream": False 일괄 응답. 단, Celery 비동기 작업 분해 기반 보유 → 항목별 부분 결과 SSE 푸시로 단기 구현 가능(→ 04. 갭분석).
| 증거 | 내용 |
|---|---|
services/ai_engine/tasks/rfp_tasks.py |
structure_rfp_task() — 항목 단위 비동기 처리(부분 결과 푸시 기반) |
services/ai_engine/core/celery_app.py |
task_prerun/task_postrun 시그널 — 진행 상태 이벤트 발행 지점 존재 |
B. 서식 처리 (입력 파싱 + 출력 생성)
B-1. HWP/HWPX 파싱 — ✅ (강점)
RFP 제공 데이터가 HWP·PDF·DOCX. PPS는 자체 HWP 바이너리 파서 + HWPX XML 파서 보유(외부 SaaS 의존 최소화 → 폐쇄망 적합).
| 증거 | 내용 |
|---|---|
libs/core_utils/hwp_parser/parser/parse.py |
olefile 기반 HWP(OLE) 바이너리 파서 — parse_doc_info()/parse_section() |
libs/core_utils/hwp_parser/parser/section_parser.py |
SectionParser — 페이지 정의·문단 텍스트 파싱 |
libs/core_utils/hwp_parser/services/hwpx_service.py |
HWPX(ZIP/XML) 파서 — 한컴 네임스페이스 처리, HTML 변환 |
libs/core_utils/hwp_parser/__init__.py |
convert_hwp_to_html() — 매직바이트로 HWP/HWPX 자동 감지 |
libs/core_utils/upstage/document_digitizer.py |
digitize_file() — Upstage 문서 디지털화(PDF·HWP→HTML), 보조 경로 |
B-2. HWP·PDF 원본 레이아웃 유지 출력 — ✅ (강점)
RFP: 융자신청서 원본 표·폰트·여백 완전 보존 HWP/PDF 다운로드. PPS는 python-hwpx로 표·셀·스타일을 네이티브 생성.
| 증거 | 내용 |
|---|---|
apps/rfp-gen/backend/app/services/document_builder/hwpx_generator.py |
python-hwpx(HwpxDocument) 기반 문서 생성 — add_table()/set_cell_text()/_add_cover() |
.../document_builder/hwpx_engine/ |
rfp_compositor·section_builder·table_builder·style_registry·package_builder 모듈 |
docs/requirements/HWP_EXPORT_REQUIREMENTS.md |
출력 요구 명세화: 템플릿(REQ-TMP)·텍스트(REQ-TXT)·표(REQ-TBL)·페이지 분기 규칙(REQ-PG) |
apps/eval-system-premium/hwpx/ |
hwpx-intelligence — HWPX 분석·추출 파이프라인(규격서 처리 실적) |
차별점 — RFP는 "원본 레이아웃 유지"를 명시. PPS는 LibreOffice 변환 같은 깨지기 쉬운 방식이 아닌 HWPX 네이티브 조립으로 표·스타일을 보존. 한글 행정서식 출력에 결정적 강점.
C. 데이터 수집·구축 파이프라인
C-1. 공고문·서식 수집 (G2B/나라장터) — ✅
RFP 입력 = 정책 공고문. PPS는 나라장터(G2B) OpenAPI 연동 수집기를 이미 운영.
| 증거 | 내용 |
|---|---|
services/data_pipeline/rfp2/ingest.py |
RFPIngester — 나라장터 입찰공고 API 수집 |
services/data_pipeline/rfp2/keyword_search.py |
RFPKeywordSearcher — 입찰공고·사전규격 키워드 검색 |
services/data_pipeline/rfp2/parse.py, extract.py |
필드 파싱·TOC 평탄화·섹션 추출 |
services/data_pipeline/app/api/rfp_search.py |
POST /rfp/search/bids|prespecs|integrated 엔드포인트 |
D. 인증·인프라·운영
D-1. 공단 포털 SSO 연동 — ✅
RFP: 고객 포털 재인증 없이 접근. PPS는 nginx auth_request 기반 멀티 scope SSO 보유.
| 증거 | 내용 |
|---|---|
infra/portal-nginx/nginx.conf |
/_auth_verify_{eval,premium,rfp,gateway,dev} — internal subrequest로 scope별 인증 |
services/knowledge_hub/app/api/portal_auth.py |
LoginBody/TokenPair, /api/auth/verify?scope= — JWT 검증 |
services/knowledge_hub/core/storage/rdb/portal_db/jwt.py |
create_access_token()/create_refresh_token(), scope별 쿠키(portal_at_{scope}) |
차별점 — 공단 포털 SSO는 scope 1개만 매핑하면 연동 완료. 이미 5개 scope를 운영하는 검증된 패턴.
D-2. CSAP형 외부망 독립(폐쇄망·CPU) 구축 — ✅ (최대 강점)
RFP 인프라 요구 = CSAP 인증 IaaS/PaaS 외부망 독립(CPU 기반). PPS는 air-gapped 온프렘 배포 모드를 이미 보유.
| 증거 | 내용 |
|---|---|
docker-compose.onprem.yml |
전 서비스 pull_policy: never·build: !reset null — 외부 레지스트리 접근 차단 |
docker-compose.onprem-mock.yml |
내부 vLLM 컨테이너(pps-kanana-2-30b, pps-qwen3-vl-8b) overlay |
scripts/start.sh |
pps_resolve_mode — docker load < pps-images.tar 오프라인 이미지 로드, 네트워크 브리지 |
docker-compose.cloud.yml |
공공/인터넷 모드(민간 LLM·Infisical) — 동일 코드, 모드만 분리 |
차별점 — RFP가 요구하는 "외부망 독립·국내 공공 클라우드"를 위한 폐쇄망 운영 아키텍처(이미지 tar 반입·내부 LLM·레지스트리 차단)를 설계·구현 완료 상태로 보유. 통상 가장 난도 높은 항목을 즉시 충족.
D-3. 관리자 대시보드 (작업·비용 모니터링) — 🟡
RFP: 토큰·비용 실시간 조회 + 예산 80%·100% 초과 자동 알림·차단. PPS는 토큰 집계·작업 모니터링 보유, 예산 임계 차단 미구현.
| 증거 | 내용 |
|---|---|
services/ai_dashboard/backend/app/api/workers.py |
WorkerStats — active/pending/succeeded/failed 집계 |
services/ai_dashboard/backend/app/api/tasks.py |
작업 목록·상세·상태 필터(TaskState) |
services/ai_engine/core/engines/mixins/llm_mixin.py |
_track_usage()/get_usage_stats() — input/output 토큰 누적 |
services/ai_engine/core/engines/mixins/logging_mixin.py |
_log_llm_call() — 호출별 토큰·latency 로깅 |
| (미구현) | 예산 임계값 80%/100% 알림·차단 로직 → 04. 갭분석 |
D-4. LLM Fallback (장애 대체 전환) — 🟡
RFP: 주 타임아웃(30초) 시 대체 자동 전환. PPS는 purpose 미일치 시 동종 모델 fallback + Celery retry 보유, 타임아웃 기반 모델간 자동 전환은 보강 필요.
| 증거 | 내용 |
|---|---|
services/ai_engine/core/model_selector.py |
select_model() — purpose exact match 실패 시 동종 kind fallback |
services/ai_engine/tasks/rfp_tasks.py |
Celery max_retries=3·soft_time_limit=600·default_retry_delay=60 |
D-5. 동시 50인 / 가용률 99.5% (Queue 처리) — 🟡
RFP: 동시 50인 이상 지연 없이(Queue 방식), 가용률 99.5%. PPS는 Celery + Redis 분산 큐로 동시성 기반 보유. K8s 매니페스트는 템플릿 단계(보강 필요).
| 증거 | 내용 |
|---|---|
services/ai_engine/core/celery_app.py |
Redis broker/backend 분산 작업 큐 |
infra/k8s/ |
base/apps/services 구조 정의(README 템플릿), 실제 매니페스트 작성 필요 |
E. 개인정보·보안
E-1. 비식별(마스킹)·ZDR·시큐어 삭제 — 🔴
RFP: 식별정보 마스킹·Zero Data Retention·다운로드 후 즉시/7일 영구 삭제·감사 로그 분리. PPS는 시크릿 관리·스캔 기반은 보유, 비식별 처리 모듈은 신규 구현 필요.
| 증거 | 내용 |
|---|---|
.gitleaks.toml |
시크릿 스캔 정책(누출 방지) |
Infisical(self-hosted, docker-compose.cloud.yml) |
머신 아이덴티티 기반 시크릿 관리(4개 프로젝트) |
| (미구현) | LLM 호출 전 식별정보 마스킹·ZDR·secure delete·감사로그 분리 → 04. 갭분석 |
매핑 요약표
| # | RFP 요구 | 판정 | 핵심 대응 자산 |
|---|---|---|---|
| A-1 | 민간+오픈소스 LLM | ✅ | ai_engine 모델 팩토리 |
| A-2 | 자금 유형 분류 | 🟡 | rfp_query_service 유사도 매칭 |
| A-3 | RAG 파이프라인 | ✅ | knowledge_hub Qdrant+KURE-v1+RRF |
| A-4 | 프롬프트(재학습 불요) | ✅ | PromptRegistry 외부 파일 |
| A-5 | 할루시네이션 최소화 | ✅ | RAG 컨텍스트 주입 |
| A-6 | 항목별 스트리밍 | 🔴 | Celery 비동기(SSE 신규) |
| B-1 | HWP/HWPX 파싱 | ✅ | core_utils 자체 파서 |
| B-2 | HWP/PDF 원본 출력 | ✅ | python-hwpx 네이티브 생성 |
| C-1 | 공고문 수집 | ✅ | data_pipeline G2B API |
| D-1 | 포털 SSO | ✅ | portal-nginx auth_request |
| D-2 | CSAP 외부망 독립 | ✅ | docker-compose.onprem air-gapped |
| D-3 | 대시보드(예산 차단) | 🟡 | ai_dashboard(토큰만) |
| D-4 | LLM Fallback | 🟡 | model_selector+Celery retry |
| D-5 | 동시 50인/99.5% | 🟡 | Celery+Redis 큐 / K8s 보강 |
| E-1 | 비식별·ZDR·삭제 | 🔴 | 보안 기반 보유(모듈 신규) |