71일차 신뢰도 기준 충족 추가 (2단계 6절, Lab 02 과제 마무리, RAG-EVAL 3-1절)

This commit is contained in:
mcchae committed 2026-10-27 22:09:36 +09:00
1 parent 3ff10aadcf
commit 4ef0464525
5 files changed
+58 -1

No files matched your search

@@ -60,3 +60,16 @@ cases/lab02-challenge.json, cases/lab02.json 둘 다 통과.
- 지시문에 정확한 문장("규정에서 답을 찾지 못했습니다.")을 주어도 LLM은 "포함되어 있지 않습니다"처럼 **다르게** 말했다 → 문장 하나만 찾는 검사는 새고, 모양 여러 개를 찾아야 했다. - 지시문에 정확한 문장("규정에서 답을 찾지 못했습니다.")을 주어도 LLM은 "포함되어 있지 않습니다"처럼 **다르게** 말했다 → 문장 하나만 찾는 검사는 새고, 모양 여러 개를 찾아야 했다.
- 틀린 전제("30일마다 바꾸면 되죠?")는 발췌로만 답하게 하자 예제 상태에서도 90일로 바로잡았다. 검사는 그 답을 막지 않는다 (숫자 90이 발췌에 있음). - 틀린 전제("30일마다 바꾸면 되죠?")는 발췌로만 답하게 하자 예제 상태에서도 90일로 바로잡았다. 검사는 그 답을 막지 않는다 (숫자 90이 발췌에 있음).
- 검색 점수(앞)와 답 검사(뒤)는 **다른 실패**를 잡는다: 점수는 "엉뚱한 질문", 답 검사는 "비슷하지만 답이 없는 질문". - 검색 점수(앞)와 답 검사(뒤)는 **다른 실패**를 잡는다: 점수는 "엉뚱한 질문", 답 검사는 "비슷하지만 답이 없는 질문".
### 마무리 · 신뢰도 기준 충족 (`RAG-EVAL.md` 3-1절 답)
수업 준비 때 보고서(`answers/08-lab02-challenge.json` `--repeat 3`, `answers/09-lab02-after-challenge.json`, 2026-10-22)에서 센 값입니다. `lab02-challenge`는 세 번 모두 같은 갈래로 갔습니다 (24건 = 8 × 3: 자동 답변 9 · 관련도 기준 3 · 답 검사 12).
| 테스트 파일 | 질문 수 | 기준 충족 (자동 답변) | 미달 · 관련도 기준 | 미달 · 답 검사 | 충족률 |
| --- | --- | --- | --- | --- | --- |
| `cases/lab02.json` (빈 질문 400 빼고) | 5 | 4 | 1 (점심 메뉴 0.202) | 0 | 4/5 |
| `cases/lab02-challenge.json` (한 번) | 8 | 3 | 1 (연차 0.259) | 4 (VPN 속도 · 노트북 사양 · 비밀번호 찾기 · 보안 교육 횟수) | 3/8 |
| 합계 | 13 | 7 | 2 | 4 | 7/13 |
- 풀이 포인트: `lab02-challenge`의 충족률 3/8은 **낮아서 좋은 결과**입니다. 이 파일은 일부러 "점수는 높은데 답이 없는" 질문을 모은 것이라, 넘어간 4건이 모두 맞게 넘어간 것입니다. 충족률은 질문 묶음의 성격과 함께 읽습니다.
- 답 검사에서 넘어간 4건이 곧 "규정을 보완할 곳"입니다 (강의 6절 표의 담당자 연결 (검사)).
@@ -242,6 +242,24 @@ uv run tools/flow.py test cases/lab02-challenge.json -v --repeat 3
uv run tools/flow.py test cases/lab02.json -v uv run tools/flow.py test cases/lab02.json -v
``` ```
### 마무리 · 신뢰도 기준 충족을 세기 (5분)
과제까지 끝나면 Q&A에 **신뢰도 기준**이 두 겹으로 완성됩니다 ([2단계 강의](../../Lecture/71/02-STAGE2-RAG-ANSWER.md) 6절): 답을 만들기 **전**의 관련도 기준(`top_score` ≥ 0.33, 예제 2)과 답을 만든 **뒤**의 답 검사 넷(과제). 둘 다 통과한 답만 `자동 답변`으로 나갑니다.
방금 돌린 두 보고서(`runs/lab02-challenge-…json`의 첫 번째 실행 · `runs/lab02-…json`)에서 질문마다 어느 갈래로 갔는지 세어 `RAG-EVAL.md` 3-1절 표를 채웁니다.
| 갈래 | 보고서에서 알아보는 법 |
| --- | --- |
| 기준 충족 → 자동 답변 | `route` = `자동 답변` |
| 기준 미달 · 관련도 기준 | `route` = `담당자 연결`, `failed` 없음 (`top_score` < 0.33, LLM을 부르지 않음) |
| 기준 미달 · 답 검사 | `route` = `담당자 연결`, `failed`에 검사 이름 (`draft`에 원래 답) |
| (세지 않음) | HTTP 400 (빈 질문 — 질문이 아님) |
<details><summary>▶ 충족률이 높을수록 좋은가</summary>
아닙니다. 기준을 느슨하게 하면 충족률은 올라가지만, 규정에 답이 없는 질문까지 `자동 답변`으로 나갑니다. 충족률은 **"규정이 답할 수 있는 질문 중 얼마나"**와 함께 봐야 합니다. 그래서 갈래를 나눠 셉니다: 관련도 기준에서 넘어간 것은 "규정 밖 질문", 답 검사에서 넘어간 것은 "규정이 모자란 곳"(규정을 보완할 후보)입니다.
</details>
## 막혔을 때 ## 막혔을 때
| 증상 | 할 일 | | 증상 | 할 일 |
@@ -256,3 +274,4 @@ uv run tools/flow.py test cases/lab02.json -v
- [ ] 예제 1·2: `cases/lab02.json` 통과, 출처가 제목으로 나온다. - [ ] 예제 1·2: `cases/lab02.json` 통과, 출처가 제목으로 나온다.
- [ ] 과제: `cases/lab02-challenge.json` 3번 반복 통과, `lab02`도 통과. - [ ] 과제: `cases/lab02-challenge.json` 3번 반복 통과, `lab02`도 통과.
- [ ] `RAG-EVAL.md` 3절에 "기준값에 걸러지지 않았는데 답이 없는 질문"을 적었다. - [ ] `RAG-EVAL.md` 3절에 "기준값에 걸러지지 않았는데 답이 없는 질문"을 적었다.
- [ ] `RAG-EVAL.md` 3-1절에 신뢰도 기준 충족 수와 기준 미달(관련도 기준 · 답 검사)을 나눠 적었다.
+1 -1
View File
@@ -175,7 +175,7 @@ export OPENAI_API_KEY=$(grep '^OPENAI_API_KEY=' ~/aio-01d4-stu/Last3Mon/.env | c
- [ ] 전날 71일차 데이터 API, `doctor` → `ready` - [ ] 전날 71일차 데이터 API, `doctor` → `ready`
- [ ] Lab 01: 정답표, `lab01`, `lab01-challenge` - [ ] Lab 01: 정답표, `lab01`, `lab01-challenge`
- [ ] Lab 02: `lab02`, `lab02-challenge`, `RAG-EVAL.md` 3절 - [ ] Lab 02: `lab02`, `lab02-challenge`, `RAG-EVAL.md` 3절 · 3-1절(신뢰도 기준 충족)
- [ ] Lab 03: doc@1 · answer@1 · answer@3, 200자 · 400자, 기준값, 개선 전·후, 보고서 - [ ] Lab 03: doc@1 · answer@1 · answer@3, 200자 · 400자, 기준값, 개선 전·후, 보고서
- [ ] `tdoc`: `SPEC.md` 먼저, R1~R5, `pytest`, 단계마다 commit - [ ] `tdoc`: `SPEC.md` 먼저, R1~R5, `pytest`, 단계마다 commit
- [ ] 72일차 준비 - [ ] 72일차 준비
@@ -24,6 +24,18 @@
- 관련도 기준 0.33에 걸러지지 않았는데 규정에 답이 없는 질문: - 관련도 기준 0.33에 걸러지지 않았는데 규정에 답이 없는 질문:
## 3-1. 신뢰도 기준 충족 (Lab 02 과제 뒤)
신뢰도 기준 = 관련도 기준(`top_score` ≥ 0.33, 답 만들기 전) + 답 검사 넷 모두 통과(답 만든 뒤). 빈 질문(400)은 세지 않습니다.
| 테스트 파일 | 질문 수 | 기준 충족 (자동 답변) | 미달 · 관련도 기준 | 미달 · 답 검사 | 충족률 |
| --- | --- | --- | --- | --- | --- |
| `cases/lab02.json` | | | | | |
| `cases/lab02-challenge.json` (첫 실행) | | | | | |
| 합계 | | | | | |
- 답 검사에서 넘어간 질문 (규정을 보완할 후보):
## 4. 한 가지씩 바꾸고 재기 (Lab 03) ## 4. 한 가지씩 바꾸고 재기 (Lab 03)
| 설정 | 청크 수 | doc@1 | answer@1 | answer@3 | | 설정 | 청크 수 | doc@1 | answer@1 | answer@3 |
+13
View File
@@ -280,6 +280,19 @@ flowchart LR
- 두 담당자 연결의 **말이 다릅니다.** 담당자는 "규정에 아예 없는 질문"과 "규정이 모자란 질문"을 다르게 처리합니다. 뒤쪽이 쌓이면 **규정을 보완할 곳**입니다 (VPN 속도, 노트북 사양, 비밀번호 찾기, 보안 교육 횟수). - 두 담당자 연결의 **말이 다릅니다.** 담당자는 "규정에 아예 없는 질문"과 "규정이 모자란 질문"을 다르게 처리합니다. 뒤쪽이 쌓이면 **규정을 보완할 곳**입니다 (VPN 속도, 노트북 사양, 비밀번호 찾기, 보안 교육 횟수).
- 69일차 검토자의 fail-closed와 같은 생각입니다: **확실하지 않으면 자동으로 내보내지 않습니다.** - 69일차 검토자의 fail-closed와 같은 생각입니다: **확실하지 않으면 자동으로 내보내지 않습니다.**
**이 두 겹이 곧 "신뢰도 기준"입니다.** 평가 기준이나 요구서에 "RAG 검색 후 답변을 생성하고 검증해 **신뢰도 기준을 충족**하면 자동 답변, 아니면 이관"이라는 말이 나오면, 오늘 만든 것이 그 장치입니다. 신뢰도를 숫자 하나(예: LLM이 스스로 매긴 확신 점수)로 두지 않고, **확인할 수 있는 조건 두 겹**으로 나눴습니다.
| 신뢰도 기준 | 오늘의 장치 | 언제 보나 | 기준 |
| --- | --- | --- | --- |
| 근거가 있나 (검색 신뢰도) | 관련도 기준 | 답을 만들기 전 | `top_score` ≥ 0.33 (3절, 규정 질문 0.46~0.62 · 규정 밖 0.20~0.26 사이에서 재서 정함) |
| 답이 근거를 따랐나 (답변 신뢰도) | 답 검사 넷 | 답을 만든 뒤 | `found_in_policies` · `cites_excerpt` · `grounded`(두 글자 묶음 30%) · `numbers_from_policies` **모두** 통과 (5절) |
| 기준 충족 | 자동 답변 + 출처 | | 두 겹 모두 통과 |
| 기준 미달 | 담당자 연결 | | 어느 하나라도 실패 → `top_score` 또는 `draft` · `failed`를 담당자에게 |
- LLM에게 "얼마나 확신하나"를 물어 점수로 쓰는 방법도 있지만, 그 점수도 LLM이 만든 글이라 흔들리고 근거를 보여 주지 못합니다. 오늘 기준은 **코드가 계산해 늘 같은 결과**이고, 미달이면 **어느 조건에서 떨어졌는지**(`top_score`, `failed`) 결과에 남습니다.
- 기준값은 정해진 정답이 아니라 **재서 정하고 테스트로 고정**한 것입니다 (`cases/lab03-threshold.json`, `lab02-challenge`). 모델 · 청크 · 문서가 바뀌면 다시 잽니다.
- 그래서 결과서에 "신뢰도 기준 충족률"을 쓸 때는 `자동 답변`으로 나간 비율, 그리고 기준 미달로 넘어간 건을 **관련도 기준 · 답 검사로 나눈 수**를 함께 적습니다.
### 6.1 앞 일차와의 연결 ### 6.1 앞 일차와의 연결
오늘 2단계는 새로 배우는 것이 아니라 **앞에서 한 세 가지를 RAG에 다시 쓰는 것**입니다. 오늘 2단계는 새로 배우는 것이 아니라 **앞에서 한 세 가지를 RAG에 다시 쓰는 것**입니다.