← 목록
공개 범위 안내 — 이 사이트는 도구 설계·기획 문서만 공개합니다. 분석 대상 원문(수행안내서 전문, 제안요청서, 제안서 판독본)과 특정 제안서에 대한 분석 결과는 포함하지 않습니다. 문서에 남은 실명·연락처는 마스킹 처리했습니다.

PIA-Auditor — 개발계획서 (Vertical Slice)

대상 05_분석툴_기능명세서.md v1.0 · 06_기술스택선정_및_개발기획서.md v1.0
문서 버전 v1.0 · 2026-08-04
개발자 1인 기준 · 총 14주 (S7 선택 시 17주)


0. 왜 수직 슬라이스인가

수평 계층(파서 전부 → 지식베이스 전부 → 룰 전부 → 리포트)으로 쌓으면 마지막 계층이 붙을 때까지 아무것도 검증할 수 없다. 이 도구의 핵심 리스크는 "동작하지 않는 것"이 아니라 "그럴듯하지만 틀린 Finding을 낸다" 는 것이고, 그건 끝에서 한 번에 확인할 수 없다.

그래서 모든 슬라이스는 입력 문서 → Finding → 리포트 를 관통한다.

S0 ▓░░░░░░░░  뼈대 관통 (Finding 1건, 하드코딩이라도)
S1 ▓▓░░░░░░  문서위생 6룰      → 골든셋  5/13   ← 여기서 이미 실사용 가능
S2 ▓▓▓░░░░░  요구사항·산출물   → 골든셋  6/13
S3 ▓▓▓▓░░░░  지식베이스·도메인 → 골든셋  9/13
S4 ▓▓▓▓▓░░░  커버리지·인용     → 골든셋 10/13
S5 ▓▓▓▓▓▓░░  방법론 룰 전체    → 골든셋 13/13  ← 기능 완성
S6 ▓▓▓▓▓▓▓░  이미지 판독 자동화
S7 ▓▓▓▓▓▓▓▓  리포팅·배포

0.0 구현 현황 (2026-08-04)

S0~S5 완료 · 골든셋 13/13 재현. 룰 17건, 테스트 137건, 인용 검증 폐기 0건.

슬라이스 계획 실제 비고
S0 뼈대 1/13 ✔ pia-audit run 관통
S1 문서위생 5/13 ✔ H-01~H-06
S2 요구사항·산출물 6/13 ✔ H-07~H-09
S3 지식베이스·도메인 9/13 ✔ 지식베이스 없이 저작권 안전 설계로 달성 (08 §1.2 조치 4)
S4 커버리지·인용 10/13 ✔ R-IND-01
S5 방법론 룰 13/13 ✔ R-FLOW/IMPL/RISK-01·02/METH-01
S6 이미지 판독 자동화 — 배관 완료 · 판독 품질 미측정 pia-audit read / fidelity. 실제 비전 판독은 API 키 필요
S7 리포팅·배포 — 부분 웹 콘솔·정적 사이트 배포는 완료

계획과 달라진 점 하나 — S3을 지식베이스 없이 통과했다. 안내서 지표 질의문을
수록하려면 저작권 정리가 필요한데, 확인해 보니 판정에 필요한 것은 질의문 전문이
아니라 평가분야 번호·명칭과 산출물명뿐이었다. 그래서 룰 전체를 그 수준만
참조하도록 설계했고, 개인정보보호위원회 회신 결과와 무관하게 17개 룰이 모두
유효하다. 회신이 긍정적이면 질의문을 덧붙여 정밀도를 높이는 것이지, 회신을
기다려야 동작하는 룰은 없다.

0.1 슬라이스 공통 규칙 (예외 없음)

  1. CLI로 실행된다. pia-audit run <docs/> --out report.md 가 매 슬라이스에서 동작한다.
  2. 리포트를 낸다. Finding이 0건이어도 리포트는 나온다.
  3. 골든셋 회귀가 CI에서 돈다. 슬라이스가 끝나면 그 슬라이스가 담당한 Finding은 영구히 재현된다.
  4. 근거 없는 Finding은 생성 거부. S0부터 적용한다. 나중에 붙이면 이미 붙은 룰을 전부 고쳐야 한다.
  5. 토큰·비용 회계를 남긴다. S0부터. 없으면 최적화 판단을 할 수 없다.

0.2 이미지 판독을 뒤로 미루면서도 앞 슬라이스를 막지 않는 방법

골든셋 13건 중 상당수가 제안요약서(이미지 슬라이드 50장) 에서 나온다. 판독(S6)을 뒤에 두면 S1~S5가 막힐 것처럼 보이지만, 그렇지 않다.

> 이번 세션의 판독 결과 output/03_제안서_발표자료-마사회.md 를 S0에서 픽스처로 동결한다.
> S1~S5는 이 픽스처를 입력으로 쓴다. S6은 판독을 자동화하고, S6의 인수 기준은 "동결 픽스처와 동등한 판독 결과를 자동 생성" 이다.

이렇게 하면 판독 품질 문제와 룰 품질 문제가 섞이지 않는다. S1~S5에서 Finding이 틀리면 원인은 무조건 룰이다.


S0 — Walking Skeleton (1주)

목표 파이프라인 전 구간을 가장 얇게 관통한다
포함 프로젝트 골격, PdfBackend 추상화, 콘텐츠 해시 캐시, Finding 스키마, 근거 스키마, 리포트 렌더러, 토큰 회계, 골든셋 픽스처 동결
입력 docs/ 3개 원본
출력 Finding 1건(하드코딩 가능)이 담긴 Markdown 리포트

작업
- uv init, Python 3.12 고정, uv.lock 커밋
- 기존 tools/pdf2md.py → pia_auditor/convert/ 로 이식, PdfBackend 인터페이스 뒤로 격리 (§06-4.2)
- Pydantic 모델: Finding, Evidence, Document, Page
- @stage 데코레이터 + SQLite 캐시
- Jinja2 리포트 템플릿 (§05 M10-F03 고정 구성)
- 골든셋 픽스처 동결: tests/fixtures/ 에 01~03 마크다운 + 기대 Finding 13건 JSON

DoD
- [ ] pia-audit run docs/ --out r.md 가 리포트를 낸다
- [ ] 두 번째 실행이 캐시로 즉시 끝난다
- [ ] 근거 없는 Finding 생성 시 예외 발생
- [ ] pytest 통과, CI 구성 완료
- [ ] 골든셋 13건 JSON이 리포지터리에 존재 (아직 0/13 재현)

리스크 — 없음(순수 골격). 다만 Finding 스키마를 여기서 잘못 잡으면 전 슬라이스가 영향받는다. §05 M10-F02를 그대로 쓴다.


S1 — 문서 위생 검사 (2주) · 골든셋 5/13

목표 LLM 없이 즉시 수정 가능한 결함을 잡는다
왜 첫 번째인가 오탐이 거의 없고, 발견 즉시 고칠 수 있으며, API 키 없이 돌아간다. 여기까지만으로도 제안서 제출 전 셀프체크 도구로 쓸 수 있다
포함 M8 전체(H-01~H-06), M9-F01/F03
입력 변환된 마크다운
출력 위생 Finding + 근거 추적표

룰과 담당 골든셋

룰 검사 골든셋
H-01 표 동일 열 전체가 플레이스홀더(0년0월, xxx, ○○○) ✔ 수탁사 18개사
H-02 정량 0값 (0회, (협의필요)) ✔ 교육 0회
H-03 문서 작성연도 대비 3년 이상 과거 이행 시한 ✔ '12년말/'13년말
H-04 요구사항 코드 결번 ✔ CNR-012
H-05 목차 장 수 ≠ 본문 간지 수 ✔ 5 vs 6 챕터
H-06 유사 인명(편집거리 ≤1) 간 직급 상충 ✔ 전○찬/전△찬

DoD
- [ ] 골든셋 5/13 재현
- [ ] API 키 없이 전 구간 동작 (--offline 아님, 애초에 LLM 미사용)
- [ ] 오탐 0건 (양호 문서 3건 투입)
- [ ] 모든 Finding이 file:line + 인용문 보유

리스크 — H-03의 "문서 작성연도" 판정. 표지 날짜가 없는 문서 대비 --doc-year 옵션 제공.


S2 — 요구사항 추출 및 대조 (2주) · 골든셋 6/13

목표 RFP를 구조로 읽고, 산출물·인력·일정을 기계적으로 대조한다
왜 두 번째인가 여전히 LLM 불필요. 검수 실무에서 가장 자주 쓰이는 대조표가 여기서 나온다
포함 M5 전체, M6-F03(산출물), M6-F04(인력), H-07(일정), H-09(산출물 상호참조)

작업
- 요구사항 목록 표 파싱 → CNR/PMR/QUR/COR/PSR/SER 45항목
(CNR 17 · PMR 11 · QUR 3 · COR 6 · PSR 2 · SER 6 — 구현 후 실측)
- 요구사항 정의서 표 파싱 → 정의 / 세부내용 / 산출정보
- 산출정보 필드를 산출물 목록으로 정규화
- 3자 대조표: RFP 산출정보 × 제안서 산출물 × (선택) 실납품
- 인력 요건 대조: PM 자격, 상주 요건, M/M 검산, 안내서 추가 요건(PM 평가기관 소속, 프리랜서 50% 미만, 평가수행인력 상주)
- 일정 상충: 절대일정(월) vs 상대일정(M+n)

DoD
- [ ] 골든셋 6/13 (신규: 산출물 3종 누락)
- [ ] §4-7 일정 불일치를 INSUFFICIENT_EVIDENCE가 아닌 정식 Finding으로 검출
- [x] 요구사항 45항목 100% 추출 (누락 시 실패) — 페이지 분할 표의 산출정보 이월 처리 포함
- [ ] 산출물 대조표 XLSX 출력

리스크 — RFP 표 구조는 기관마다 다르다. 마사회 형식에 과적합될 수 있다 → 다른 기관 RFP 2건으로 파서 일반화 검증.


S3 — 지식베이스와 도메인 추론 (3주) · 골든셋 9/13

목표 안내서를 구조화하고, 가장 가치 있는 룰을 먼저 켠다
왜 세 번째인가 R-DOMAIN-01은 사람이 가장 놓치기 쉬운 유형이고, 이번 분석에서 가장 강한 지적(위치정보·CCTV)을 만들어냈다. 커버리지 매핑(S4)보다 먼저 나와야 한다
포함 M4 전체, R-DOMAIN-01, R-IND-03, R-FLOW-01, R-IMPL-01

작업
- 안내서 p.57~59 → 지표 카탈로그 121개 (5영역 / 28분야), 조건부 적용 플래그 포함
- p.78~81 → 품질검토 체크리스트 12항목
- 단계별 필수 산출물 카탈로그 (흐름분석 6종 등)
- 산식 카탈로그 (위험도 = 영향도 + (발생가능성 × 법적준거성) × 2)
- 버전 diff (2025.10 신설 = 5.7 인공지능(AI))
- R-DOMAIN-01 신호 사전 — 기관 속성 → 필수 평가분야 역추론

담당 골든셋

룰 골든셋
R-DOMAIN-01 ✔ 위치정보(5.4)·고정형 영상정보처리기기(5.1) 누락
R-IND-03 ✔ AI(5.7) 미반영
R-FLOW-01 ✔ 개인정보 흐름표·흐름도 산출물 부재
R-IMPL-01 ✔ 개인정보 과업 이행점검 미배정

DoD
- [ ] 골든셋 9/13
- [ ] 지표 121개 전수 검증 (수·영역·분야 100% 일치)
- [ ] R-DOMAIN-01이 제안서 자신의 실적·수탁사 목록에서 신호를 추출 (§05 핵심)
- [ ] 지식베이스가 프롬프트 캐시 프리픽스로 직렬화 (~20K 토큰 목표, count_tokens 실측)

리스크 — 지표 추출은 표 파싱 정확도에 직결. 121개가 정확히 나오지 않으면 이후 전부 흔들린다 → 전수 대조를 DoD에 명시.


S4 — 커버리지 매핑과 인용 검증 (3주) · 골든셋 10/13

목표 첫 LLM 판정을 붙이되, 환각을 구조적으로 차단한 상태로 붙인다
포함 M6-F01/F02, M9-F02/F04, 임베딩 후보 추출, Citations API, Batch API

작업
- BGE-M3 임베딩 → 요구사항 ↔ 제안서 섹션 후보 상위 3건
- Citations API로 근거 추출 (자유 텍스트 경로)
- 구조화 출력으로 판정 (COVERED / PARTIAL / MISSING / INSUFFICIENT_EVIDENCE)
- 인용 검증: 인용문이 변환 산출물에 실제 존재하는지 문자열 대조 → 불일치 시 Finding 폐기
- 요약본 입력 시 MISSING → INSUFFICIENT_EVIDENCE 자동 강등
- Batch API로 42건 일괄 처리
- R-IND-01 (평가지표 모수·추가삭제 대조표 제시 여부)

⚠️ 구현 주의 — Citations와 구조화 출력은 동시 사용 시 400. 호출을 2단으로 분리한다 (§06-4.5).

DoD
- [ ] 골든셋 10/13
- [ ] 인용 불일치 0건 (전수 대조)
- [ ] 커버리지 매트릭스 XLSX (요구사항 × 판정 × 근거)
- [ ] 요약본 입력 시 MISSING이 하나도 나오지 않음
- [ ] 1회 실행 비용 로그 출력, ≤$3

리스크 — 의미 동등성(다른 용어로 같은 절차). 후보 3건 제시로 완화하되, MISSING은 사람 확인 필수를 리포트에 명시.


S5 — 방법론 정합성 룰 전체 (3주) · 골든셋 13/13 ✅

목표 기능 완성. 이번 세션 분석을 도구가 전부 재현한다
포함 M7 룰 카탈로그 16개 완성

남은 룰

룰 골든셋
R-RISK-01 ✔ 침해요인 도출 단계 부재
R-RISK-02 ✔ 위험도 산식에 법적 준거성 가중치 없음
R-METH-01 ✔ C.PIAM 미적용
R-SCOPE-01/02 영향평가 의무대상 판단 / 비용 분리·독립성
R-FLOW-02/03, R-RISK-03, R-IND-02, R-IMPL-02, R-HR-01 (확인필요 계열)

DoD
- [ ] 골든셋 13/13 ✅
- [ ] 오탐률 검증: 양호 문서 5건 투입, HIGH 이상 오탐 ≤1건/건
- [ ] 심각도 4단계 정확히 부여
- [ ] 권고사항이 우선순위 순으로 정렬
- [ ] §5 강점 섹션이 자동 생성 (결함만 있는 리포트는 의사결정에 못 씀 — §05 M10-F03)
- [ ] 1회 분석 비용 ≤$10, 소요 ≤30분

리스크 — 오탐. 여기서 처음으로 오탐률을 정면으로 측정한다. 기준 미달 시 룰을 끄는 것이 정답이다(신뢰가 커버리지보다 중요, R4).


S6 — 이미지 문서 판독 자동화 (2주)

목표 S0에서 동결한 픽스처를 도구가 스스로 생성한다
포함 M3 전체

작업
- M1-F02 텍스트 밀도 판정 (임계 50자/쪽) → 자동 분기
- 110 dpi 렌더링, 실패 시 200 dpi 재시도
- 판독 프롬프트 규격 (슬라이드 1장 = MD 섹션 1개, 표는 GFM, 도해는 A → B → C)
- 판독 불확실성 표기 → 해당 구간 Finding 자동 강등
- --offline PaddleOCR 폴백
- 슬라이드 번호 정합성 교차검증

DoD
- [ ] 자동 판독 결과로 골든셋 13/13 유지 (핵심 인수 기준)
- [ ] 동결 픽스처와 자동 판독 결과의 표 셀 일치율 ≥90%
- [ ] --offline 모드가 API 호출 0회로 완주
- [ ] 판독 한계 구간이 명시적으로 표기

리스크 — 자동 판독이 픽스처에 못 미쳐 골든셋이 깨질 수 있다. 그때는 픽스처를 낮추지 말고 판독을 고친다. 픽스처는 사람이 검증한 기준선이다.

구현 결과 (2026-08-04)

배관은 완료, 판독 품질은 아직 측정 전이다. 이 둘을 구분해서 기록한다.

DoD 상태 근거
텍스트 밀도 자동 분기 ✔ Document.is_image_only (50자/쪽)
110 dpi 렌더 · 실패 시 200 dpi 재시도 ✔ convert/render.py, 실패 판정 15자
판독 프롬프트 규격 ✔ vision.READ_SPEC — 해설 금지·추론 금지·불확실 표기
판독 불확실성 → Finding 강등 ✔ ⟨?⟩ 근거의 FAIL → INSUFFICIENT_EVIDENCE
쪽 번호 정합성 교차검증 ✔ check_slide_numbers — 중복·누락·역순 검출
--offline API 호출 0회 완주 ✔ --replay 경로. 오프라인+재생본 없으면 거부
자동 판독 결과로 골든셋 13/13 유지 배관만 확인 실제 PDF 50쪽 관통 → 13/13 (재생 모드)
동결 픽스처 대비 표 셀 일치율 ≥90% 미측정 pia-audit fidelity 준비 완료, 비전 실행 필요

재생(replay) 모드 100%는 판독 검증이 아니다. 배관이 맞다는 뜻일 뿐이다.
그래서 충실도 지표가 열화를 실제로 잡아내는지를 별도 시험으로 고정했다 —
행 삭제·글자 오독·열 병합을 넣으면 일치율이 떨어져야 하고, 강조 표기 차이로는
떨어지면 안 된다.

실제 판독 실행 (API 키 필요, 50쪽 약 $0.76 @ 110 dpi):

uv sync --extra vision
export ANTHROPIC_API_KEY=...
pia-audit read docs/제안서_발표자료-마사회.pdf --out auto.md --dry-run   # 비용 먼저
pia-audit read docs/제안서_발표자료-마사회.pdf --out auto.md
pia-audit fidelity app/tests/fixtures/03.md auto.md                      # 인수 기준 90%

미달이면 픽스처를 낮추지 말고 판독을 고친다. fidelity 가 일치율이 낮은 쪽을
낮은 순으로 찍어 주므로 그 쪽부터 본다.


S7 — 리포팅 고도화·배포 (2주, 선택)


부록 A. 골든셋 재현 사다리

슬라이스 누적 신규 재현 Finding
S0 0/13 (픽스처 동결만)
S1 5/13 수탁사 미기입 · 과거일자 재사용 · 교육 0회 · CNR-012 결번 · 표기 불일치
S2 6/13 산출물 3종 누락 (+ 일정 상충)
S3 9/13 평가영역5 누락(위치정보·CCTV·AI) · 흐름분석 산출물 부재 · 이행점검 미배정
S4 10/13 지표 체계 근거 미제시
S5 13/13 침해요인 도출 부재 · 위험도 산식 부재 · C.PIAM 미적용
S6 13/13 (자동 판독으로 유지)

부록 B. 슬라이스별 데모 시나리오

각 슬라이스 종료 시 이 명령 하나로 가치를 보인다.

슬라이스 데모
S1 pia-audit hygiene 제안서.pdf → "수탁사 18개사 전원 미기입, 교육 0회, CNR-012 결번"
S2 pia-audit outputs --rfp RFP.pdf --proposal 제안서.pdf → 산출물 대조표 XLSX
S3 pia-audit domain --proposal 제안서.pdf → "위치정보사업자 언급 → 5.4 위치정보 점검 없음"
S4 pia-audit coverage --rfp ... --proposal ... → 42×N 커버리지 매트릭스
S5 pia-audit run docs/ → 이번 세션 분석보고서와 동등한 리포트
S6 같은 명령이 이미지 PDF에도 동작

부록 C. 릴리스 기준

릴리스 슬라이스 대상 조건
v0.1 내부 S0~S1 컨설팅사 PM 셀프체크 골든셋 5/13, 오탐 0
v0.2 파일럿 S0~S3 발주기관 검수담당 골든셋 9/13, 사용자 2명 실사용
v1.0 정식 S0~S6 전체 골든셋 13/13, 오탐 ≤1/건, 비용 ≤$10, 문서화 완료

부록 D. 중단 조건

다음 중 하나에 해당하면 다음 슬라이스로 넘어가지 말고 멈춘다.

  1. S5에서 오탐률이 기준을 넘고 룰 조정으로 해결되지 않는다 → 해당 룰 영구 비활성, 범위 축소 재협의
  2. S3에서 지표 121개 추출이 정확해지지 않는다 → 안내서 파싱 대신 수작업 카탈로그 1회 작성 후 유지보수 체계로 전환 (기준문서는 3년 주기 개정이므로 수작업이 비합리적이지 않다)
  3. S6 자동 판독이 픽스처 대비 표 일치율 70% 미만 → 이미지 문서는 반자동(사람 검수 전제) 으로 범위 재정의