프로젝트 설명 — VOC를 6개 에이전트가 순차 처리하고, 처리 결과를 품질 게이트·독립 LLM Judge·레드팀·재현성·E2E 테스트로 검증합니다. 검증 목표 — 내부 파이프라인에서 계산한 품질 점수와 독립 LLM Judge 평가가 일치하는지 확인했습니다.
- 테스트 시나리오 설계, 평가 루브릭 설계, Judge 프롬프트 검증, 독립 Judge 결과 검토, 최종 발표·시연
- 멀티에이전트 파이프라인 개발, AWS 인프라, 리포팅 대시보드
요구사항 분석, 테스트 전략 수립, QA 문서화, API/E2E 테스트, AI/LLM 응답 품질평가, 결함 분석과 재검증까지 수행합니다. 20년+ IT 프로젝트를 기획·관리해 온 경험을 최근 AI 서비스 품질검증 영역으로 확장하고 있습니다.
20년+ IT 기획·PM 경험에서 나온 습관은 "무엇을 검증해야 하는가"를 먼저 정확히 정의하는 것입니다. 그 습관을 QA로 옮기면 아래 7단계가 됩니다. 각 단계는 주장이 아니라 실제 프로젝트에서 수행한 근거로 이어집니다.
기술명만 나열하지 않고, 각 역량 옆에 실제 통과시킨 테스트 건수와 프로젝트를 그대로 붙였습니다.
| 역량 | 실제 증거 |
|---|---|
| 테스트 전략 | Judge 단일 채점 대신 레드팀·PII·환각검출 등 12개 모듈로 교차검증 설계(02), 내부 채점과 별도로 독립 Judge를 배포 게이트로 설계(01) |
| Functional Test | pytest 84건(02) · 53건(06) · 품질 스위트 32건(01) 전부 PASS |
| AI/LLM 품질평가 | LLM-as-a-Judge 루브릭 설계(02·05), 8축 평가 체계(05) |
| 자동화 테스트 | 검증한 자동화 테스트 276건 · 팀 프로젝트 포함 전체 포트폴리오 합계 |
| Prompt Injection / Red Team | 레드팀 검증 모듈(정규식·패턴 기반, 02), 프롬프트 인젝션·권한공격 시나리오(01·02) |
| 성능 테스트 | k6 부하테스트 — 오류율 0% · p95 13~21ms(02) |
| 검증 이슈 분석 | 검증 중 확인한 보안·의존성·설정·테스트 용이성 등 이슈 7건을 증상→원인→조치까지 추적(검증 이슈 표) |
| Release 품질 판단 | pytest 32건 PASS했음에도 독립 Judge 81.2점(기준 95점 미달)로 HOLD 판정(Case Study) |
| 역량 | 실제 증거 |
|---|---|
| 요구사항 분석 | 요구사항정의서 작성(04) |
| 테스트 케이스 설계 | 단위·통합 테스트 계획서 작성(04) |
| Boundary Value Test | 비밀번호 검증 경계값(빈 값·길이 초과·특수문자 누락) 단위 테스트 설계(09) |
| Negative Test | 설정 파일을 못 찾으면 조용히 기본값 대신 즉시 예외(05), Judge 파싱 실패 시 임의 통과 대신 안전 실패 처리(07) |
| API Test | FastAPI 엔드포인트 테스트(01·02·06·08·10) |
| E2E Test | Cypress E2E(09), 라이브 E2E 18건(01) |
| RAG 평가 | RAG on/off 대조 실험으로 효과를 수치화(02), 근거 기반 답변 품질 평가(07) |
| PII 검증 | PII 스캔 모듈(02) |
| 모니터링 | Prometheus/Grafana 연동(02·06), 장애주입 모니터링 대시보드(08) |
| 재검증 | 수정 후 재실행해 exit 0 재확인 — 05·06·09·10 적용 완료(근거) |
| Jira | Jira 칸반 문서화(04), Jira 자동등록 모듈(02) |
| WBS | WBS 작성(04) |
| QA 문서 | 요구사항정의서·테스트계획서 등 13종(04) |
| 팀 협업 | 4인 팀 프로젝트에서 담당 범위를 팀원과 명시적으로 구분(01·04·06) |
실행 증적 유형이 서로 다른 4개 프로젝트를 선별했습니다. 나머지 5개는 아래 Additional Projects에 있습니다.
프로젝트 설명 — VOC를 6개 에이전트가 순차 처리하고, 처리 결과를 품질 게이트·독립 LLM Judge·레드팀·재현성·E2E 테스트로 검증합니다. 검증 목표 — 내부 파이프라인에서 계산한 품질 점수와 독립 LLM Judge 평가가 일치하는지 확인했습니다.
검증 목표 — 단일 LLM Judge 결과에 의존하지 않고, AI 응답의 정확성·안전성·개인정보·공격 대응·RAG 효과를 서로 다른 평가 방식으로 검증했습니다.
프로젝트 상황 — 4인 팀으로 AI 챗봇 QA 파이프라인 프로젝트를 수행하며 요구사항, 일정, 테스트 계획, 이슈 및 재검증 과정을 문서화했습니다.
문서 흐름 — 요구사항 → 일정 및 업무분장 → 테스트 계획 → 이슈 관리 → 재검증
React + Express 애플리케이션을 대상으로 Cypress E2E, Jest 통합 테스트, Node 단위 테스트를 구성했습니다.
cy.intercept()로 API를 네트워크 레벨에서 스텁 처리해 DB 연결 없이 프론트엔드 로직만 독립 검증npm test 실행 시 테스트 러너의 대상 파일이 중복되어 실패test:unit / test:integration으로 실행 범위 분리npm test01번 VOC 멀티에이전트 QA에서 실제로 있었던 판정 과정입니다. 내부 파이프라인과 pytest가 전부 통과했다는 사실과, 그럼에도 배포를 보류했다는 결론이 동시에 성립합니다.
| 검증 항목 | 결과 |
|---|---|
| 내부 품질 게이트 | 100점 |
| 독립 Judge | 68~74점 |
| Live E2E 평균 | 90.9점 |
| 독립 Judge 평균 | 81.2점 |
| Release 기준 | 95점 |
| 최종 판정 | HOLD |
Live E2E는 18/18 PASS·평균 90.9점이었지만 독립 Judge 평균이 Release 기준 95점에 미달하여
최종 판정은 HOLD로 기록했습니다.
나머지 5개입니다.
04와 같은 팀 프로젝트의 확장판(Docker·Jira·모니터링 추가). 본인 담당 — pytest 테스트 스위트 설계·구현, QA 문서 작성. 팀원 담당 — Service/Judge Agent 구현. 결과 — 53건 PASS · 테스트 실행 기록 14회. README →
정책 파일과 평가 엔진을 분리하고, 설정 누락 시 기본값으로 넘어가지 않고 즉시 예외를 던지도록 처리했습니다. 검증 — 정책 로딩 · CI Exit Code · Streamlit. README →
02번의 축약 원형. 외부 API 키 없이 완전히 로컬 mock으로 동작하며, 질문에 "오류"/"느리게"를 넣으면 장애·지연을 재현하는 테스트 시나리오를 설계. README →
도구 호출형 AI Agent를 Python/Node 두 스택으로 구현. 시스템 프롬프트에 내부지침 노출 거부·개인정보 요구 거부 등 안전성 원칙을 명시하고 이를 검증하는 시나리오를 함께 설계. README →
9개 프로젝트에서 실제로 사용한 스택만 적었습니다. 괄호 안 번호는 사용 프로젝트입니다.
이 저장소의 코드와 문서 작성에 AI 도구(Claude 등)를 코드 작성과 문서 초안의 보조 수단으로 활용했습니다. 요구사항 정의, 테스트 설계, 결과 검증, 오류 원인 분석, 최종 품질 판단은 직접 수행했습니다. 공개용으로 정리하면서 발견한 결함과 수정 내역은 VALIDATION_REPORT.md에 정리했습니다.
프로젝트별 실행 로그, 결함 기록, 코드, 테스트 케이스, 기술 스택을 확인할 수 있습니다. 한 대의 PC에서 처음부터 설치·실행해 얻은 결과입니다.
▸ 전체 실행 증적 펼치기 ▾ 접기QA 교육과정에서 시작해 이후 확장·보완한 프로젝트를 새 환경에서 다시 설치하고 실행 검증했습니다. 실제 실행 결과를 확인한 프로젝트와 외부 API Key 등 추가 조건이 필요한 프로젝트를 구분해 표시합니다. 그 과정에서 검증 이슈 7건을 원인까지 확인했습니다.
$ cd 01_VOC_Improve_MultiAgent $ python -m unittest discover -s tests Ran 98 tests in 20.319s OK $ cd ../02_AI_Quality_Platform && pytest -q 84 passed, 10 warnings in 48.29s $ cd ../06_AI_Chatbot_QA && pytest -q 53 passed, 33 warnings in 12.14s $ cd ../09_FullStack_WebApp/backend && npm test test:unit ℹ pass 5 ℹ fail 0 test:integration Tests: 4 passed, 4 total
새 가상환경을 만들고 requirements.txt / package.json만으로 설치한 뒤 실행한 결과입니다.
외부 API를 호출하지 않는 구성입니다.
고객 불만(VOC)을 6개 에이전트가 순차 처리하고, 그 결과를 LLM Judge·품질게이트·레드팀·재현성 관점으로 다시 검증하는 시스템입니다. Offline/Deterministic 모드에서는 외부 API 호출 없이 테스트와 증적 생성이 가능합니다.
$ python -m unittest discover -s tests Ran 98 tests in 20.319s OK $ python quality_diagnosis/run_quality_suite.py Ran 32 tests in 3.160s OK { "total": 32, "passed": 32, "failed": 0, "errors": 0, "successful": true } $ python e2e_runner.py --mode offline --domain ecommerce # exit 0 — JSON / CSV / 품질점수 MD / 배포판정 MD # + 증적 TXT·XML·HTML·JUnit XML 생성 $ python quality_diagnosis/run_fault_diagnosis.py { "successful": true } # Retriever 중단·포트충돌·CSV누락·키미설정·지연·빈검색 $ python quality_diagnosis/llm_judge.py --provider deterministic # exit 0
quality/ 아래 레드팀·환각검출·PII 스캔·RAG 절제(ablation)·검색품질·비용추적 등
12개 모듈이 독립적으로 검증을 수행합니다.
pytest 84건이 전부 통과하며 커버리지 리포트(HTML·XML)와 JUnit XML을 자동 생성합니다.
LLM 호출은 전부 모킹되어 있어 실제 API 키 없이(더미 값만으로) 전 구간이 실행됩니다.
$ pip install -r requirements.txt # 129개 패키지, exit 0 $ $env:OPENAI_API_KEY="sk-dummy-for-mocked-tests" # 테스트가 LLM 호출을 전부 모킹하므로 실제 API 호출은 발생하지 않습니다. # 키는 에이전트 생성자의 선조건 검사를 통과시키기 위한 더미 값입니다. $ pytest -q 84 passed, 10 warnings in 48.29s - generated xml file: tests_output\junit.xml - Coverage HTML written to dir tests_output/htmlcov TOTAL 2442 1022 58% # 참고: 키를 아예 설정하지 않으면 7건 실패 → 아래 결함표 02번 행
FastAPI 질의 API + Streamlit 품질 대시보드 + Prometheus 연동. 팀 단위로 진행한 프로젝트이고
RUN_GUIDE.md에 실행·k6 부하테스트·Prometheus 연결 절차가 정리되어 있습니다.
테스트 수행 이력이 reports/test_runs/에 14회분 남아 있습니다.
$ pytest -q ..................................................... [100%] 53 passed, 33 warnings in 12.14s
Express + React Todo 앱을 테스트 대상으로 두고 계층별 테스트를 붙인 프로젝트입니다.
Cypress 스펙은 cy.intercept로 API를 스텁해
백엔드 없이도 UI 흐름을 검증하도록 작성돼 있습니다.
$ cd backend && npm install added 490 packages in 22s $ npm test # 러너 분리 후 — 단위 + 통합 순차 실행 > test:unit — node --test "**/!(*.integration).test.js" ✔ rejects an empty password ✔ rejects a very long password ✔ accepts a password with special characters when all requirements are met ✔ rejects a password without a special character ✔ rejects a password without mixed case and a number ℹ tests 5 ℹ pass 5 ℹ fail 0 > test:integration — jest --runInBand Test Suites: 1 passed, 1 total Tests: 4 passed, 4 total EXIT=0
FastAPI가 Prometheus /metrics를 노출하고 Streamlit이 이를 시각화합니다.
Agent Mock에 오류·지연 조건을 넣어, API 키 없이
장애·응답 지연 시나리오를 반복 실행했습니다.
$ python -m uvicorn app:app --port 8001 SERVER_UP = True $ curl http://127.0.0.1:8001/metrics # HELP python_gc_objects_collected_total Objects collected during gc # TYPE python_gc_objects_collected_total counter python_gc_objects_collected_total{generation="0"} 382.0 ... $ python tests/run_tests.py TEST_EXIT = 0
평가 규정(policy_config.json)과 평가 엔진을 분리하고,
main.py는 Fail이면 sys.exit(1)로 배포를 중단하도록 설계했습니다.
화면용(Streamlit)과 CI/CD용(CLI)을 나눈 구조이며, 대시보드는
LLM을 전혀 호출하지 않는 순수 계산기이라 키 없이 기동을 확인했습니다.
# requirements.txt 고정 버전 그대로 (Python 3.12.9) $ pip install -r requirements.txt exit 0 # numpy 1.26.4 / streamlit 1.32.0 / pandas 2.2.1 $ streamlit run app/app.py --server.headless true --server.port 8599 $ curl http://127.0.0.1:8599/_stcore/health 200 ok # OPENAI_API_KEY 미설정 상태에서 기동 # 정책 로딩도 프로젝트 밖 경로에서 확인 high_risk_finance weights ST = 2.0
신규 환경 설치·실행 중 발견한 오류를 문제 → 원인 → 조치 → 재검증 기준으로 정리했습니다. 결함·개선사항 7건 = 아래 API 키 노출 1건 + 표 6건입니다.
.env.example 파일 2개(교육과정 원래 번호 15·18번, 현재는 제거됨)에서
실제 OpenAI API Key를 발견했습니다.
조치 — Key 제거 → 예제 값 초기화 → 저장소 전체 재검색.
재검증 — 잔여 Key 0건 확인. 두 프로젝트는 이후 웹 가동 불가로 폴더째 제거되었습니다. Key 폐기·재발급은 별도로 수행하지 않았습니다.
| 등급 | 위치 | 증상 | 원인 | 조치 | 상태 |
|---|---|---|---|---|---|
| HIGH | 01requirements.txt |
ModuleNotFoundError: mcp.server.fastmcp품질 스위트 28건 중 1건 ERROR |
mcp>=1.2가 2.0.0을 설치 →2.0에서 fastmcp 모듈 제거 (breaking change) |
mcp>=1.2,<2.0으로 고정→ 32건 전부 통과 (exit 0) |
조치 완료 |
| HIGH | 06requirements.txt |
설치 자체가 실패Failed building wheel for chroma-hnswlib |
chromadb==0.5.23이 C++ 확장을 소스 빌드 →Windows + Python 3.12에 사전 빌드 휠 없음 |
chromadb>=1.0,<2.0으로 완화→ 1.5.9 설치, pytest 53건 통과 |
조치 완료 |
| HIGH | 05src/utils/config_loader.py |
오류 없이 평가 점수만 조용히 달라짐 프로젝트 폴더 밖에서 실행할 때 재현 |
설정 경로가 상대경로라 CWD에 의존 → 못 찾으면 예외 대신 기본값 파일을 새로 씀 → high_risk_finance의 가중치ST·AT = 2.0이 1.0으로 대체됨 |
__file__ 기준 절대경로로 교체하고설정 누락·미등록 정책명은 즉시 예외 처리 → 다른 CWD에서 실행해 정상 로드 확인 |
조치 완료 |
| MEDIUM | 08requirements.txt |
서버·대시보드·테스트가 각각 다른 지점에서 실패 | prometheus-client, requests,streamlit, pandas 4종 누락 |
4종 추가 → 서버 기동·/metrics·테스트 전부 통과 |
조치 완료 |
| LOW | 09package.json |
npm test가 exit 1로 실패 |
node --test가 대상 지정 없이 실행돼Jest 전용 스펙까지 로드 → 두 러너의 담당 파일이 겹침 (Jest는 jest.config.js로 이미 범위가 좁혀져 있었음) |
test:unit/test:integration으로러너를 분리하고 npm test가 둘을 순차 실행→ 9건 전부 통과, exit 0 |
조치 완료 |
| LOW | 02app/service_agent.py |
키 없이 pytest 실행 시 7건 실패ValueError: OpenAI API Key가 설정되지 않았습니다 |
테스트는 LLM 호출을 전부 모킹하는데 생성자가 환경변수를 먼저 검사 → 모킹의 의미가 사라짐 (테스트 용이성 문제) |
더미 키로 84건 전부 통과 확인. 근본 해결은 키 검사를 호출 시점으로 미루거나 fixture로 주입하는 것 |
우회 확인 |
06·08 requirements.txt — 문제: Windows cp949 환경에서 pip install 파싱 실패.
원인: 한글 주석이 포함된 UTF-8 파일의 인코딩 처리. 조치: UTF-8 BOM 적용.
재검증: pip install -r requirements.txt 정상 완료.
06 Dockerfile — 문제: CMD/ENTRYPOINT가 없어 컨테이너가 즉시 종료.
원인: 기본 실행 명령 누락. 조치: CMD 라인 추가.
재검증: docker compose config 통과 — 이미지 빌드는 Docker 데몬 미가동으로 확인하지 못함.
프로젝트 구조와 의존성은 확인했으며 실제 LLM 응답 생성에는 OpenAI API Key가 필요합니다. 현재 검증 환경에서는 실제 API 호출까지 수행하지 않았습니다. 저장소에 포함된 기존 평가 리포트와 실행 산출물은 확인할 수 있습니다.
국민취업지원제도 업무매뉴얼 PDF를 색인해 답변하고, 별도 평가 에이전트가 답변 품질을 채점합니다.
reports/에 실제 평가 리포트 6회분이 남아 있어 키 없이도 결과를 제시할 수 있습니다.
같은 시나리오를 Python(FastAPI)과 Node 두 가지로 구현한 항목. 동일 요구사항의 언어별 구현 차이를 비교해 설명할 수 있습니다.
실행 대상이 아닌 QA/PM 문서 프로젝트입니다.
요구사항정의서 · 업무분장 · WBS · Jira 칸반 · 보안가이드 · 취약지표 분석기준 · 회의록 · 이슈트래킹시트 · 단위테스트 계획서 · 통합테스트 계획서 · 프로그램분석보고서.
QA 직무와 직접 관련된 프로젝트를 중심으로 선별해 구성했습니다.
| 프로젝트 | 유형 | 본인 역할 | 주요 검증 | 결과 |
|---|---|---|---|---|
| 01 VOC 멀티에이전트 QA | 팀(4인) | QA 시나리오·루브릭·Judge 검증 | LLM Judge, E2E 18건 | HOLD(81.2점, 기준 95점) |
| 02 AI 품질 평가 플랫폼 | 개인 확장 | 품질 모듈·대시보드·테스트 체계 확장 | pytest, k6, 레드팀 등 12모듈 | 84 PASS |
| 04 QA 문서 산출물 | 팀(4인) | 단위/통합 테스트계획서, 발표자료 | 문서화 | 문서 13종 |
| 05 RaiT 평가 시스템 | 개인 | 전체 | 정책 기반 평가 엔진 | Mock 기준 정상 동작 확인 |
| 06 AI 챗봇 QA | 팀(4인) | pytest 스위트, QA 문서 | pytest | 53 PASS |
| 07 RAG 챗봇 | 개인 | 전체 | Judge 평가 | 리포트 6회분 |
| 08 AI Agent 모니터링 | 개인 | 전체 | 장애주입 테스트 | 4 PASS |
| 09 FullStack Web QA | 개인 | 전체 | Unit/Integration/E2E | 9 PASS |
| 10 LangGraph 챗봇 | 개인 | 전체 | 수동 시나리오 검증 | 구조 확인 |
외부 API Key 또는 별도 인프라가 필요한 프로젝트는 공개 데모 대신 실행 결과, 테스트 로그 및 평가 리포트를 제공합니다.
아래 이미지는 설명용 그림이 아니라 각 프로젝트가 실행 중에 생성한 파일 그대로입니다.
각 프로젝트마다 깨끗한 가상환경을 새로 만들어 requirements.txt / package.json만으로
설치했습니다. 기존에 설치돼 있던 패키지의 도움을 받지 않았다는 뜻이고, 그래서 위 결함들이 드러났습니다.
# Python 프로젝트 python -m venv .venv .\.venv\Scripts\Activate.ps1 pip install -r requirements.txt copy .env.example .env # 키가 필요한 항목만, 본인 키 입력 # Node 프로젝트 (09) npm install
Activate.ps1이 막히면 Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass.
09번은 backend와 frontend에서 각각 npm install이 필요합니다.