diff --git a/Last3Mon/71/LAB-02-A-ANSWER-FROM-POLICIES.md b/Last3Mon/71/LAB-02-A-ANSWER-FROM-POLICIES.md index 4afc43f..7ab46d5 100644 --- a/Last3Mon/71/LAB-02-A-ANSWER-FROM-POLICIES.md +++ b/Last3Mon/71/LAB-02-A-ANSWER-FROM-POLICIES.md @@ -60,3 +60,16 @@ cases/lab02-challenge.json, cases/lab02.json 둘 다 통과. - 지시문에 정확한 문장("규정에서 답을 찾지 못했습니다.")을 주어도 LLM은 "포함되어 있지 않습니다"처럼 **다르게** 말했다 → 문장 하나만 찾는 검사는 새고, 모양 여러 개를 찾아야 했다. - 틀린 전제("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절 표의 담당자 연결 (검사)). diff --git a/Last3Mon/71/LAB-02-Q-ANSWER-FROM-POLICIES.md b/Last3Mon/71/LAB-02-Q-ANSWER-FROM-POLICIES.md index 8faf91e..38333f4 100644 --- a/Last3Mon/71/LAB-02-Q-ANSWER-FROM-POLICIES.md +++ b/Last3Mon/71/LAB-02-Q-ANSWER-FROM-POLICIES.md @@ -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 ``` +### 마무리 · 신뢰도 기준 충족을 세기 (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 (빈 질문 — 질문이 아님) | + +
▶ 충족률이 높을수록 좋은가 + +아닙니다. 기준을 느슨하게 하면 충족률은 올라가지만, 규정에 답이 없는 질문까지 `자동 답변`으로 나갑니다. 충족률은 **"규정이 답할 수 있는 질문 중 얼마나"**와 함께 봐야 합니다. 그래서 갈래를 나눠 셉니다: 관련도 기준에서 넘어간 것은 "규정 밖 질문", 답 검사에서 넘어간 것은 "규정이 모자란 곳"(규정을 보완할 후보)입니다. +
+ ## 막혔을 때 | 증상 | 할 일 | @@ -256,3 +274,4 @@ uv run tools/flow.py test cases/lab02.json -v - [ ] 예제 1·2: `cases/lab02.json` 통과, 출처가 제목으로 나온다. - [ ] 과제: `cases/lab02-challenge.json` 3번 반복 통과, `lab02`도 통과. - [ ] `RAG-EVAL.md` 3절에 "기준값에 걸러지지 않았는데 답이 없는 질문"을 적었다. +- [ ] `RAG-EVAL.md` 3-1절에 신뢰도 기준 충족 수와 기준 미달(관련도 기준 · 답 검사)을 나눠 적었다. diff --git a/Last3Mon/71/LECTURE-71.md b/Last3Mon/71/LECTURE-71.md index b94eac8..51f230f 100644 --- a/Last3Mon/71/LECTURE-71.md +++ b/Last3Mon/71/LECTURE-71.md @@ -175,7 +175,7 @@ export OPENAI_API_KEY=$(grep '^OPENAI_API_KEY=' ~/aio-01d4-stu/Last3Mon/.env | c - [ ] 전날 71일차 데이터 API, `doctor` → `ready` - [ ] 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자, 기준값, 개선 전·후, 보고서 - [ ] `tdoc`: `SPEC.md` 먼저, R1~R5, `pytest`, 단계마다 commit - [ ] 72일차 준비 diff --git a/Last3Mon/71/templates/RAG-EVAL-TEMPLATE.md b/Last3Mon/71/templates/RAG-EVAL-TEMPLATE.md index 912546a..15b3b47 100644 --- a/Last3Mon/71/templates/RAG-EVAL-TEMPLATE.md +++ b/Last3Mon/71/templates/RAG-EVAL-TEMPLATE.md @@ -24,6 +24,18 @@ - 관련도 기준 0.33에 걸러지지 않았는데 규정에 답이 없는 질문: +## 3-1. 신뢰도 기준 충족 (Lab 02 과제 뒤) + +신뢰도 기준 = 관련도 기준(`top_score` ≥ 0.33, 답 만들기 전) + 답 검사 넷 모두 통과(답 만든 뒤). 빈 질문(400)은 세지 않습니다. + +| 테스트 파일 | 질문 수 | 기준 충족 (자동 답변) | 미달 · 관련도 기준 | 미달 · 답 검사 | 충족률 | +| --- | --- | --- | --- | --- | --- | +| `cases/lab02.json` | | | | | | +| `cases/lab02-challenge.json` (첫 실행) | | | | | | +| 합계 | | | | | | + +- 답 검사에서 넘어간 질문 (규정을 보완할 후보): + ## 4. 한 가지씩 바꾸고 재기 (Lab 03) | 설정 | 청크 수 | doc@1 | answer@1 | answer@3 | diff --git a/Lecture/71/02-STAGE2-RAG-ANSWER.md b/Lecture/71/02-STAGE2-RAG-ANSWER.md index e0fc073..fa91bb4 100644 --- a/Lecture/71/02-STAGE2-RAG-ANSWER.md +++ b/Lecture/71/02-STAGE2-RAG-ANSWER.md @@ -280,6 +280,19 @@ flowchart LR - 두 담당자 연결의 **말이 다릅니다.** 담당자는 "규정에 아예 없는 질문"과 "규정이 모자란 질문"을 다르게 처리합니다. 뒤쪽이 쌓이면 **규정을 보완할 곳**입니다 (VPN 속도, 노트북 사양, 비밀번호 찾기, 보안 교육 횟수). - 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 앞 일차와의 연결 오늘 2단계는 새로 배우는 것이 아니라 **앞에서 한 세 가지를 RAG에 다시 쓰는 것**입니다.