Files
aio-01d4-stu/Last3Mon/78/answers/14-lab02-challenge.txt
T

437 lines
15 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
$ uv run tools/flow.py push answers/78-lab02-challenge-log-alert.json
! unpublished '78 FAQ import + LLM check (reference)' (wee5dfb169c284f5): it used the same webhook path
✔ pushed '78 FAQ import + quality log and alerts (answer)' (id w53039b5a517bf0d)
POST http://localhost:5678/webhook/my-faq-import
$ uv run tools/flow.py test cases/lab02-challenge.json -v
✔ before: POST http://localhost:8800/faq-reset · HTTP 200 · 0.1s · {"cleared": 0}
→ request POST http://localhost:8800/faq-reset
{}
← response HTTP 200
{
"cleared": 0
}
✔ before: POST http://localhost:8800/quarantine-clear · HTTP 200 · 0.0s · {"cleared": 2}
→ request POST http://localhost:8800/quarantine-clear
{}
← response HTTP 200
{
"cleared": 2
}
✔ before: POST http://localhost:8800/quality-log-clear · HTTP 200 · 0.0s · {"cleared": 0}
→ request POST http://localhost:8800/quality-log-clear
{}
← response HTTP 200
{
"cleared": 0
}
✔ before: POST http://localhost:8800/alerts-clear · HTTP 200 · 0.0s · {"cleared": 0}
→ request POST http://localhost:8800/alerts-clear
{}
← response HTTP 200
{
"cleared": 0
}
POST http://localhost:5678/webhook/my-faq-import · 5 case(s) × 1
✔ 거절도 품질 기록 · 1.3s
→ request POST /webhook/my-faq-import
{
"batch": "B-1",
"items": [
{
"id": "FAQ-101",
"title": "사내 와이파이 연결",
"keywords": [
"와이파이",
"wifi",
"무선"
],
"answer": "사내 와이파이는 'CORP-WIFI'에 사번으로 로그인합니다. 잡히지 않으면 공유기 번호를 IT 포털에 신고합니다."
},
{
"id": "FAQ-102",
"title": "회의실 예약",
"keywords": [
"회의실",
"예약"
],
"answer": "사내 포털의 '회의실 예약' 메뉴에서 날짜 · 시간 · 인원을 적어 예약합니다."
},
{
"id": "FAQ-103",
"title": "",
"keywords": [
"출입증"
],
"answer": "출입증을 잃어버렸으면 총무팀에 재발급을 신청합니다."
},
{
"id": "FAQ-10",
"title": "노트북 반납",
"keywords": [
"노트북",
"반납"
],
"answer": "퇴사 5영업일 전까지 IT팀에 노트북을 반납합니다."
},
{
"id": "FAQ-105",
"title": "모니터 추가 신청",
"keywords": [
"모니터"
],
"answer": ""
},
{
"id": "FAQ-106",
"title": "회의실 예약 규칙",
"keywords": [
"회의실 규칙"
],
"answer": "회의실은 사내 포털의 '회의실 예약' 메뉴에서 날짜와 시간을 고른 뒤 인원과 목적을 적어 예약합니다. 회의실은 사내 포털의 '회의실 예약' 메뉴에서 날짜와 시간을 고른 뒤 인원과 목적을 적어 예약합니다. 회의실은 사내 포털의 '회의실 예약' 메뉴에서 날짜와 시간을 고른 뒤 인원과 목적을 적어 예약합니다. 회의실은 사내 포털의 '회의실 예약' 메뉴에서 날짜와 시간을 고른 뒤 인원과 목적을 적어 예약합니다. 회의실은 사내 포털의 '회의실 예약' 메뉴에서 날짜와 시간을 고른 뒤 인원과 목적을 적어 예약합니다. 회의실은 사내 포털의 '회의실 예약' 메뉴에서 날짜와 시간을 고른 뒤 인원과 목적을 적어 예약합니다. "
},
{
"id": "FAQ-102",
"title": "회의실 예약 (중복)",
"keywords": [
"회의실"
],
"answer": "사내 포털에서 회의실을 예약합니다. 취소도 같은 메뉴에서 합니다."
},
{
"id": "FAQ-108",
"title": "화상회의 장비",
"keywords": [],
"answer": "화상회의 장비는 각 층 비품실에서 빌릴 수 있습니다."
},
{
"id": "FAQ-109",
"title": "보안 사고 신고",
"keywords": [
"보안",
"신고"
],
"answer": "보안 사고는 IT팀 김민지(010-1234-5678)에게 바로 전화해 주세요."
},
{
"id": "FAQ-110",
"title": "사내 메신저 설치",
"keywords": [
"메신저"
],
"answer": "사내 메신저는 http://bit.ly/corp-msg 에서 받아 설치합니다."
},
{
"id": "FAQ-003",
"title": "VPN 접속 오류 (새 판)",
"keywords": [
"재택근무"
],
"answer": "VPN 클라이언트를 최신으로 업데이트하고 인증서를 확인합니다."
},
{
"id": "FAQ-112",
"title": "VPN 접속 오류",
"keywords": [
"vpn",
"재택근무"
],
"answer": "재택근무 중 VPN이 끊기면 클라이언트를 다시 시작하고 인증서 만료일을 확인합니다."
},
{
"id": "FAQ-113",
"title": "프린터 토너 교체",
"keywords": [
"토너"
],
"answer": "메일함 용량이 꽉 차면 오래된 메일을 보관함으로 옮겨 용량을 확보합니다."
}
]
}
← response HTTP 422
{
"error": "batch rejected",
"batch": "B-1",
"invalid_ratio": 0.7692,
"max_invalid_ratio": 0.3,
"codes": {
"title_missing": 1,
"id_format": 1,
"answer_missing": 1,
"answer_too_long": 1,
"duplicate_in_batch": 1,
"keywords_missing": 1,
"pii": 1,
"external_link": 1,
"exists_id": 1,
"same_title": 1
}
}
✔ 배치 2 가져오기 · 9.4s
→ request POST /webhook/my-faq-import
{
"batch": "B-2",
"items": [
{
"id": "FAQ-201",
"title": "회의실 예약",
"keywords": [
"회의실",
"예약"
],
"answer": "사내 포털의 '회의실 예약' 메뉴에서 날짜 · 시간 · 인원을 적어 예약합니다."
},
{
"id": "FAQ-202",
"title": "출입증 재발급",
"keywords": [
"출입증",
"재발급"
],
"answer": "출입증을 잃어버렸으면 총무팀에 신분증을 가지고 가서 재발급을 신청합니다."
},
{
"id": "FAQ-203",
"title": "노트북 반납",
"keywords": [
"노트북",
"반납"
],
"answer": "퇴사 5영업일 전까지 IT팀에 노트북과 충전기를 반납합니다."
},
{
"id": "FAQ-204",
"title": "모니터 추가 신청",
"keywords": [
"모니터",
"추가"
],
"answer": "IT 포털의 '장비 신청'에서 모니터 추가를 신청하면 재고 확인 뒤 지급합니다."
},
{
"id": "FAQ-205",
"title": "윈도우 업데이트",
"keywords": [
"업데이트",
"윈도우"
],
"answer": "윈도우 업데이트는 매달 둘째 주 수요일 밤에 자동으로 설치됩니다. 끝나면 다시 시작합니다."
},
{
"id": "FAQ-206",
"title": "화상회의 장비 대여",
"keywords": [
"화상회의",
"카메라"
],
"answer": "화상회의 카메라와 마이크는 각 층 비품실에서 빌리고 같은 날 돌려줍니다."
},
{
"id": "FAQ-207",
"title": "사내 메신저 설치",
"keywords": [
"메신저"
],
"answer": "사내 메신저는 IT 포털(https://intra.example.com/msg)에서 받아 설치합니다."
},
{
"id": "FAQ-208",
"title": "공유 드라이브 권한",
"keywords": [
"공유 드라이브",
"권한"
],
"answer": "공유 드라이브 권한은 팀장이 IT 포털에서 신청하면 하루 안에 열립니다."
},
{
"id": "FAQ-209",
"title": "보안 사고 신고",
"keywords": [
"보안",
"신고"
],
"answer": "보안 사고는 security.desk@example.com 으로 바로 메일을 보내 주세요."
},
{
"id": "FAQ-210",
"title": "모니터 밝기 조절",
"keywords": [
"밝기"
],
"answer": "연차 휴가는 입사 1년 뒤부터 15일이며 인사 포털에서 신청합니다."
}
]
}
← response HTTP 200
{
"batch": "B-2",
"total": 10,
"imported": 8,
"quarantined": 2,
"rejected": false,
"score": 0.8,
"max_invalid_ratio": 0.3,
"codes": {
"pii": 1,
"llm_mismatch": 1
},
"imported_ids": [
"FAQ-201",
"FAQ-202",
"FAQ-203",
"FAQ-204",
"FAQ-205",
"FAQ-206",
"FAQ-207",
"FAQ-208"
],
"quarantined_ids": [
"FAQ-209",
"FAQ-210"
]
}
✔ 품질 기록 두 줄 (거절 · 0.8) · 0.0s
→ request POST http://localhost:8800/quality-log/list
{}
← response HTTP 200
{
"count": 2,
"items": [
{
"batch": "B-1",
"dataset": "faq",
"total": 13,
"valid": 3,
"quarantined": 0,
"rejected": true,
"score": 0,
"codes": {
"title_missing": 1,
"id_format": 1,
"answer_missing": 1,
"answer_too_long": 1,
"duplicate_in_batch": 1,
"keywords_missing": 1,
"pii": 1,
"external_link": 1,
"exists_id": 1,
"same_title": 1
},
"at": "2026-11-01T18:07:21"
},
{
"batch": "B-2",
"dataset": "faq",
"total": 10,
"valid": 8,
"quarantined": 2,
"rejected": false,
"score": 0.8,
"codes": {
"pii": 1,
"llm_mismatch": 1
},
"at": "2026-11-01T18:07:31"
}
]
}
✔ 알림 두 건 (거절 · 낮은 점수) · 0.0s
→ request POST http://localhost:8800/alerts/list
{}
← response HTTP 200
{
"count": 2,
"alerts": [
{
"workflow": "faq-import",
"node": "Batch ok?",
"severity": "high",
"reason": "batch_rejected",
"batch": "B-1",
"message": "B-1 rejected",
"at": 1793524041.7771661
},
{
"workflow": "faq-import",
"node": "Low score?",
"severity": "high",
"reason": "low_quality",
"batch": "B-2",
"score": 0.8,
"message": "B-2 quality 0.8",
"at": 1793524051.234785
}
]
}
✔ 알림에 낮은 점수 · 0.0s
→ request POST http://localhost:8800/alerts/list
{}
← response HTTP 200
{
"count": 2,
"alerts": [
{
"workflow": "faq-import",
"node": "Batch ok?",
"severity": "high",
"reason": "batch_rejected",
"batch": "B-1",
"message": "B-1 rejected",
"at": 1793524041.7771661
},
{
"workflow": "faq-import",
"node": "Low score?",
"severity": "high",
"reason": "low_quality",
"batch": "B-2",
"score": 0.8,
"message": "B-2 quality 0.8",
"at": 1793524051.234785
}
]
}
Passed 5/5
report: runs/lab02-challenge-20261101-180731.json
✔ after: POST http://localhost:8800/faq-reset · HTTP 200 · 0.0s · {"cleared": 8}
→ request POST http://localhost:8800/faq-reset
{}
← response HTTP 200
{
"cleared": 8
}
$ uv run tools/flow.py test cases/lab02.json
✔ before: POST http://localhost:8800/faq-reset · HTTP 200 · 0.0s · {"cleared": 0}
✔ before: POST http://localhost:8800/quarantine-clear · HTTP 200 · 0.0s · {"cleared": 2}
✔ before: POST http://localhost:8800/quality-log-clear · HTTP 200 · 0.0s · {"cleared": 2}
✔ before: POST http://localhost:8800/alerts-clear · HTTP 200 · 0.0s · {"cleared": 2}
POST http://localhost:5678/webhook/my-faq-import · 6 case(s) × 1
✔ 나쁜 배치는 통째로 거절 (422) · 0.1s
✔ 배치 2 · 통과한 줄만 넣고 나쁜 줄은 격리 · 8.8s
✔ FAQ에 들어갔고 메일 주소는 안 들어감 · 0.0s
✔ 격리함에 이유와 함께 · 0.0s
✔ before: POST http://localhost:8800/faq-reset · HTTP 200 · 0.0s · {"cleared": 8}
✔ before: POST http://localhost:8800/quarantine-clear · HTTP 200 · 0.0s · {"cleared": 2}
✔ LLM · 제목과 답이 다른 줄 (FAQ-210) · 8.6s
✔ LLM · 규칙에 걸린 줄은 그대로 (FAQ-305) · 4.5s
Passed 6/6
report: runs/lab02-20261101-180753.json
✔ after: POST http://localhost:8800/faq-reset · HTTP 200 · 0.0s · {"cleared": 13}
$ uv run tools/flow.py quality
FAQ: 6 (nothing added)
quarantine: 3
B-2 FAQ-210 llm_mismatch
B-2 FAQ-209 pii
B-3 FAQ-305 answer_too_short
quality log: 4
B-1 faq total 13 valid 3 score 0 rejected True
B-2 faq total 10 valid 8 score 0.8 rejected False
B-2 faq total 10 valid 8 score 0.8 rejected False
B-3 faq total 6 valid 5 score 0.8333 rejected False
alerts: 4
[high] faq-import · low_quality · B-2 quality 0.8
[high] faq-import · low_quality · B-2 quality 0.8
[high] faq-import · low_quality · B-3 quality 0.8333