9주차: 검색 결합 생성(RAG)의 구조
검색 결합 생성(RAG)의 구조
□ 이 주차가 놓이는 자리
- 7주차에서 긴 문서를 넣어도 필요한 사실을 놓칠 수 있다는 것을 확인했다. 이번에는 순서를 바꿔 **“필요한 문단부터 찾아서 넣으면 어떨까?”**라는 질문에서 출발
- 8주차까지는 모델 안의 가중치와 어댑터가 중심이었다. 이번에는 가중치를 그대로 두고 답변에 사용할 외부 근거를 선택하는 구조 학습
- 검색 결합 생성은 검색과 생성을 잇는 구조. 그런데 연결만 했다고 근거가 맞아지지는 않는다. 실제 실습에서 검색 후보는 늘었는데 답변은 근거 없는
1000m로 바뀐 사례를 따라가며 실패 지점 분리
- 이번 주의 기준: 문서를 찾았는가, 필요한 문장이 전달되었는가, 답이 그 문장에 근거하는가를 따로 판정. 5주차의 “지표가 놓치는 것”을 검색과 생성에 적용하는 시간
□ 이번 주가 답하는 질문
- “한라산”은 검색되는데 “한라산의 높이”는 후보가 0개인 이유
- 문자 검색으로 후보가 생기면 검색을 고쳤다고 말해도 되는가
- 정답 근거가 후보에 있는데 최종 답변이 틀리는 경로
- Hit@k, Recall@k, MRR이 각각 보는 것과 놓치는 것
- 그래프 2홉 탐색이 도움을 주는 질문과 잘못된 연결을 늘리는 질문
□ 읽기 안내 - 이 노트의 어디와 이어지나
| 읽기 | 이 노트에서 다루는 곳 |
|---|---|
| RAG, Lewis et al. (2020) | 검색과 생성의 연결, 원 논문과 CPU 골격의 차이 |
| DPR, Karpukhin et al. (2020) | 희소 검색과 이중 인코더 밀집 검색 |
| scikit-learn TF-IDF 설명 | IDF, 정규화와 작은 벡터 계산 |
| Lost in the Middle, Liu et al. (2023) | 문맥 예산과 근거 전달 실패 |
| GraphRAG, Edge et al. (2024, 개정 2025) | 개체·관계와 문서 집합의 전역 질문 |
□ 데이터와 숫자의 구분
- 실습 데이터: 위키백과 「제주특별자치도」 고정 판 42464087. 7주차와 같은 공개 문서, 실행 때 API로 다운로드
- 실제 측정: 이 판에서 전처리한 58문단, 단어 색인 1,801차원, 문자 색인 18,572차원, 아래 문단 ID·후보 순서·생성 실패
- 계산 연습: 문서 A·B·C의 짧은 문자열과 가상 정답 집합. 제주 원문에서 측정한 자료와 구별
- 가중치·시간·답변은 모델과 실행 조건에 의존. 논문 성능이나 제주 전체 데이터의 품질로 일반화하지 않는 범위
- 원문 저자 목록·역사는 원문 링크에서 확인. CC BY-SA 4.0, 원문 전체는 저장소에 미포함
온라인 (2시수)
Section titled “온라인 (2시수)”강의: 근거를 찾는 것과 답을 만드는 것 - RAG의 다섯 단계
Section titled “강의: 근거를 찾는 것과 답을 만드는 것 - RAG의 다섯 단계”□ 문제부터 보기 - 문서가 있는데 왜 틀리는가
- 질문이 “제주도의 기후”라면 원문 전체를 넣을 수도 있다. 하지만 역사·행정·관광산업이 함께 들어가면 모델이 어느 문장을 사용할지 다시 골라야 한다. 7주차에서 본 긴 입력 안의 근거 선택 문제가 그대로 남는 상황
- RAG는 먼저 검색기로 관련 문단을 고른다. 문서 전체 대신 적은 문단을 전달하므로 입력을 줄일 수 있다. 대신 검색기가 빠뜨린 문단은 생성 모델이 볼 수 없다는 새 병목 발생
- 도서관에 비유하면 검색기는 책을 찾는 사서, 문맥 구성은 책에서 복사할 쪽을 고르는 과정, 생성 모델은 그 복사본으로 답안을 쓰는 사람. 다른 책을 가져오거나 필요한 쪽을 빼면 문장력이 좋아도 답의 근거 부족
- 그림은 왼쪽부터 읽되 끝의 오답이 시작 단계의 탓이라고 바로 결론내리지 않는 것이 핵심. 단계마다 실제 산출물 확인 필요
| 단계 | 입력 → 출력 | 확인할 질문 |
|---|---|---|
| 색인 | 원문 → 문단 ID와 벡터 | 정답 정보가 색인에 들어 있는가 |
| 검색 | 질문 → 후보 문단 k개 | 정답 문단이 후보 안에 있는가 |
| 재순위 | 후보 → 다시 정렬한 후보 | 직접 근거가 앞에 놓였는가 |
| 문맥 구성 | 상위 문단 → 길이 제한 내 문장 | 필요한 문장이 잘리지 않았는가 |
| 생성 | 근거와 질문 → 답변 | 답의 사실이 전달한 근거에 있는가 |
○ 원 논문과 수업 골격의 차이
- RAG 논문: 학습된 검색기와 생성 모델을 결합하는 방법 제시. 가중치에 저장된 패턴과 외부 문서 지식을 함께 사용하는 설계
- 수업 골격: TF-IDF로 검색, 단순 토큰 포함 기준으로 재순위, Qwen3-0.6B-Base로 짧은 생성. 검색기 학습과 공동 미세조정은 하지 않는 범위
- 따라서 이 실습은 논문 성능 재현이 아니다. 검색 한 단계를 바꿨을 때 후보·근거·답변이 어떻게 달라지는지 추적하는 실험
문단을 어떻게 자를까 - 검색 단위의 선택
Section titled “문단을 어떻게 자를까 - 검색 단위의 선택”□ 문서 하나와 문장 하나 사이
- 원문을 문서 하나로 색인하면 관련 문장을 찾아도 역사·행정 전체가 함께 검색된다. 검색 점수 하나에 여러 주제가 섞이고 생성 입력도 길어지는 문제
- 반대로 문장 하나씩 자르면 “이곳”, “그 시기”의 앞 문장이 사라질 수 있다. 검색 단위는 짧아지지만 사실을 해석할 문맥 손실
- 이번 골격은 HTML의 문단 태그를 단위로 사용하고 40자 미만 문단을 제외. 그 결과 58문단에
D000부터 ID를 부여한 구조 - 이 방식은 간단하지만 표·제목·짧은 문장을 제외한다. 원문에 사실이 있다는 것과 색인에 사실이 있다는 것의 차이가 여기서 시작
○ 고정 길이 분할의 계산 연습
- 설명용으로 1,000토큰 문서를 창 길이 200, 겹침 50으로 자르는 상황. 실습 문서의 실제 토큰 수가 아닌 연습 조건
- 다음 창의 시작은 200이 아니라
200 - 50 = 150만큼 전진
창 1: 0~199창 2: 150~349창 3: 300~499창 4: 450~649창 5: 600~799창 6: 750~949창 7: 900~999- 마지막 창은 100토큰. 색인되는 총 토큰은
6 x 200 + 100 = 1,300, 원문보다 300토큰 많은 계산 - 겹침은 경계에 걸린 근거를 보존할 수 있지만 중복 근거를 여러 개 검색하는 비용 발생. 후보 5개가 사실상 같은 내용이면 다양한 근거 5개를 확보한 것과 다름
- 이번 TODO는 검색 방식만 바꾸므로 분할은 고정. 분할까지 바꾸면 결과 차이가 검색기 때문인지 조각 경계 때문인지 구분하기 어려운 혼합 변수 발생
| 분할 단위 | 장점 | 빠질 수 있는 정보 |
|---|---|---|
| 전체 문서 | 문맥 보존 | 관련 문장만 구별하기 어려움 |
| HTML 문단 | 자연스러운 내용 묶음 | 표·제목·짧은 문장 |
| 고정 길이 창 | 크기 예산 예측 가능 | 창 경계의 관계 |
| 문장 | 짧고 직접적인 검색 | 앞 문장의 주어·조건 |
단어를 숫자로 바꾸기 - TF-IDF를 손으로 계산
Section titled “단어를 숫자로 바꾸기 - TF-IDF를 손으로 계산”□ 먼저 빈도 행렬 만들기
- TF는 단어가 문서 안에 등장한 횟수. 그러나 모든 문서에 나오는 말까지 중요한 것으로 세면 질문의 차이를 구별하기 어려움
- IDF는 여러 문서에 퍼진 말의 가중치를 줄이고 드문 말에 더 큰 가중치를 주는 방법. 드물다와 참이다는 서로 다른 판단임에 주의
- 아래 세 문자열은 계산용 예시. 제주 공개 원문의 인용이 아닌, 좌표를 세 개로 줄인 장난감 데이터
| 문서 | 계산용 문자열 | 제주 | 기후 | 관광 |
|---|---|---|---|---|
| A | 제주 기후 기후 | 1 | 2 | 0 |
| B | 제주 관광 | 1 | 0 | 1 |
| C | 제주 | 1 | 0 | 0 |
| 질문 q | 제주 기후 | 1 | 1 | 0 |
- 문서 수 N = 3, 각 단어가 등장한 문서 수 df는 제주 3, 기후 1, 관광 1
- 같은 단어가 A에서 두 번 등장해도 기후의 df는 2가 아니라 1. TF는 횟수, df는 문서 수
○ 실습 라이브러리의 기본 IDF
idf(t) = ln((1 + N) / (1 + df(t))) + 1제주: ln(4/4) + 1 = 1기후: ln(4/2) + 1 = 1.6931관광: ln(4/2) + 1 = 1.69311 +는 기본 평활화 설정. 수업에서는 이 식으로 계산해 라이브러리의 설정과 숫자를 일치시키는 방식- 단어 빈도에 IDF를 곱하면 A의 기후 좌표는
2 x 1.6931 = 3.3863. 이제 단순 빈도 대신 중요도 가중치 표현
| 벡터 | TF-IDF (제주, 기후, 관광) | L2 길이 | 정규화 후 |
|---|---|---|---|
| A | (1, 3.3863, 0) | 3.5309 | (0.2832, 0.9591, 0) |
| B | (1, 0, 1.6931) | 1.9664 | (0.5085, 0, 0.8610) |
| C | (1, 0, 0) | 1 | (1, 0, 0) |
| q | (1, 1.6931, 0) | 1.9664 | (0.5085, 0.8610, 0) |
○ 코사인 유사도 - 길이보다 방향
cos(q, A) = (q · A) / (||q|| x ||A||)정규화 후: 0.5085 x 0.2832 + 0.8610 x 0.9591 = 0.9698cos(q, B) = 0.5085 x 0.5085 = 0.2586cos(q, C) = 0.5085 x 1 = 0.5085검색 순서: A → C → B- “제주”만 있는 C보다 “제주 기후” 방향에 가까운 A가 먼저 나오는 결과. 관광 문서 B에도 제주가 있지만 기후 좌표가 없어 점수가 낮은 계산
- 점수 0.9698은 정답 확률 96.98%가 아니다. 이 단어 좌표계에서 방향이 가깝다는 뜻. A에 잘못된 기후 설명을 써도 단어 구성이 같으면 높은 점수 가능
- 긴 문서를 무조건 먼저 뽑지 않도록 길이를 정규화했지만 문서의 사실성까지 검증한 것은 아닌 점
- 그림 읽기: 왼쪽 빈도 행렬의 각 열에 가운데 IDF를 곱하고 정규화. 오른쪽 순위는 그 결과의 내적. 어느 단계에도 사실 확인 연산이 없다는 것까지 읽는 연습
단어 검색과 문자 검색 - 후보가 생긴다는 것의 의미
Section titled “단어 검색과 문자 검색 - 후보가 생긴다는 것의 의미”□ 실제 색인의 크기
단어 색인: (58, 1801)문자 색인: (58, 18572)- 행 58은 문단 수, 열은 관찰된 특징 종류. 문자가 단어보다 작은 단위이지만 길이 2~4의 여러 연속 조합을 특징으로 만들기 때문에 열 수가 약
18,572 / 1,801 = 10.31배 - 이것을 메모리 10.31배로 읽으면 안 된다. 희소 행렬은 0이 아닌 값 중심으로 저장하므로 실제 메모리는 값의 개수와 저장 형식에도 의존
□ “한라산”과 “한라산의”의 차이
- 단어 분석기는 조사 제거 없이 정규식으로 단어를 분리. 질문 “한라산의 높이”의 단어 특징은
한라산의,높이 - 원문에는
한라산,한라산을같은 표기가 있어도 정확히 같은 특징이 없으면 공유 좌표가 0. 현재 실습 질의의 단어 검색 후보가 빈 목록이 된 원인 - 문자 2-gram만 펼치면 “한라산의”에서
한라,라산,산의생성. 문서의 “한라산”과한라,라산을 공유할 수 있는 구조 - 하지만
산의가 겹쳐도 “높이”에 답한다는 뜻은 아니다. 문자 검색은 표기 차이를 일부 잇지만 질문 조건을 이해하는 모델이 아닌 방식
○ 실제 후보를 읽어 보기
| 질문 | 단어 검색 후보 (순서대로) | 문자 검색 후보 (순서대로) |
|---|---|---|
| 한라산 | D019, D018, D016, D015, D038 | D016, D018, D019, D010, D038 |
| 한라산의 높이 | 없음 | D018, D016, D019, D038, D015 |
| 제주도의 기후 | D019, D036, D011, D032, D004 | D011, D013, D019, D004, D032 |
| 제주 관광지 오늘 운영 시간 | D047, D049, D031, D000, D044 | D025, D035, D023, D054, D000 |
- 고정 판·k = 5·같은 분할의 실행 결과. 같은 조건에서 검색 함수만 바뀌었을 때 관찰한 후보 변화
- 높이 질문: 0후보 → 5후보. 검색 결과가 생겼다는 것은 사실. 높이 근거를 찾았다는 것은 아직 판정하지 않은 주장
- 기후 질문: 정답을 뒷받침하는 D019가 문자 검색에서도 후보에 포함되지만 3위로 내려감. 후보 포함과 상위 문맥 선택을 따로 평가해야 하는 사례
□ 밀집 검색으로 바꾸면 해결되는가
- 밀집 검색은 학습된 벡터로 의미 유사도를 표현. DPR의 이중 인코더는 질문과 문단을 따로 인코딩해 문단 벡터를 미리 계산하는 구조
- 문자 겹침이 없어도 관련 의미를 찾을 가능성이 있지만 제주 지명, 한국어 조사, 높이·운영 시간 조건까지 잘 처리하는지는 별도 검증 필요
- 이번 노트북은 이중 인코더를 학습하지 않는다. 희소 검색에서 실패 원인을 읽는 것이 먼저이며 검색 모델 이름을 바꾸는 것과 오류를 진단하는 것을 동일시하지 않는 순서
재순위와 문맥 - 찾은 근거도 잃어버릴 수 있다
Section titled “재순위와 문맥 - 찾은 근거도 잃어버릴 수 있다”□ 후보 안에서만 다시 고르기
- 전체 문서를 자세히 비교하면 비용이 커질 수 있어 빠른 검색으로 후보를 좁힌 뒤 다시 관련성을 확인하는 구조
- 실습의 재순위는 단순 기준선: 질문의 단어가 문단 안에 부분 문자열로 포함된 비율. 학습된 cross-encoder가 아니며 문장을 읽어 조건을 판단하지 못하는 수준
overlap(q, d) = 문단 안에 포함된 질의 단어 수 / 질의 단어 수정렬: overlap 내림차순 → 검색 점수 내림차순 → 문단 번호- 질문에 단어 2개가 있고 한 개만 포함되면 1/2. 그러나 “높이”와 “한라산의”를 모두 놓친 후보들이라면 모두 0으로 동점, 결국 기존 검색 점수 순서를 유지
- 높이 질의의 문자 후보에서 D018을 먼저 고른 것은 재순위가 높이를 확인해서가 아니다. 후보들의 질의 토큰 포함 점수가 같아 검색 순서를 그대로 따른 결과
- 운영 시간 질의에서는 문자 검색 2위 D035와 3위 D023이 재순위 후 자리 교체. 순서가 바뀐다는 사실만으로 관련성 개선이라고 말할 수 없는 점
○ 기후 질문의 실패를 한 단계씩 읽기
| 단계 | 단어 검색 | 문자 검색 |
|---|---|---|
| 후보에 기후 근거 D019 존재 | 있음, 1위 | 있음, 3위 |
| 최상위로 선택한 문단 | D019 | D011 |
| 선택 문장의 주제 | 저지대·한라산의 기후 | 조선 시대 김만덕의 육지 방문 |
| 해석 | 질문 조건을 직접 지지 | 기후 답변 근거로 부적절 |
- “제주도”라는 주제는 맞아도 “기후”라는 조건은 맞지 않는다. 후보에 D019가 있다는 이유로 최종 문맥이 옳다고 판정하면 재순위·선택 실패를 놓침
- 개선 실험의 방향: 질의에서 장소와 속성을 분리해 조건 일치 확인. 이번 TODO 범위에서는 자동 구현하지 않고 어떤 지표와 근거로 개선을 검증할지 제시하는 활동
□ 문맥 예산의 계산
- 검색 후보 수 k = 5와 생성 모델에 전달하는 문단 수는 다른 값. 현재 골격은 재순위 1위 문단의 선택 문장 한 개를 최대 600자로 제한
- 전체 프롬프트에도 768토큰 제한 적용. 600자는 600토큰이 아님. 한국어 글자, 공백, 숫자가 모델 토큰으로 나뉘는 방식에 따라 길이 변화
- 설명용 토큰 예산: 전체 768, 지시문·질문 120이면 근거에 쓸 수 있는 예산은 648. 근거 3개가 각각 250토큰이면 750이라 102토큰 초과
- 근거를 늘리면 놓친 사실이 들어올 수 있지만 마지막 근거의 결론·단위가 잘릴 수도 있다. 실제 입력 ID와 잘린 텍스트를 기록해야 하는 이유
- 노트북은 600자 제한 전후와 768토큰 제한 전후를 별도 추적.
context는 토큰화 전 근거,actual_input_text는 절단 후 실제 ID의 디코딩, 두 값을 같다고 가정하지 않음
근거 전달 실험: 점수는 설명용 가상 값, 노트북 실측과 무관.
- 조작 순서: k = 3에서 재순위를 켜도 D4가 나타나지 않음 → k = 4에서 D4가 후보에 들어옴 → 문맥 수 2라면 여전히 제외 가능 → 재순위로 D4를 앞으로 이동
- 모형의 끝은 “근거 전달 성공”이지 “정답 성공”이 아님. 생성 모델이 전달된 근거를 사용하는지는 다음 단계에서 확인
- Lost in the Middle 연구는 관련 정보의 위치에 따른 변화 보고. 이번 짧은 실습이 해당 연구 전체를 재현한 것은 아니지만 넣은 정보와 사용한 정보의 구분을 연결하는 근거
생성과 grounding - 실제 실패 출력으로 확인
Section titled “생성과 grounding - 실제 실패 출력으로 확인”□ 높이를 묻는데 동물 문장이 들어간 경우
- 실행에서 문자 검색이 고른 D018의 추출 문장:
동물은 한대성, 열대성 동물이 함께 서식하고 있는데,77종의 포유류, 조류 198종 등을 비롯하여 파충류, 양서류가 각각 8종,곤충류와 거미류가 873종과 74종 등이다.- 이 문장은 동물의 종류·수를 설명. 한라산의 높이가 몇 m인지 뒷받침하는 문장이 없음
- Qwen3-0.6B-Base의 CPU greedy 생성, 최대 32새 토큰으로 실제 나온 답의 시작:
1000m근거 [D018]: 동물은 한대성, 열대성 동물이 함께 서식하고1000m를 뒷받침하는 수치가 전달 문맥에 없으므로 근거 충실성 실패. 이 문서의 실제 높이 정답을 기억으로 덧붙이는 것보다, 전달 문맥으로 이 답을 정당화할 수 없다는 판정이 우선- D018이라는 인용 ID가 붙어도 그 문단이 숫자를 지지하지 않으면 인용 실패. 인용 형식이 있다와 근거가 있다의 차이
- 단어 검색에서는 후보가 없어 “검색 근거 없음”으로 생성 생략. 문자 검색은 생성을 진행했지만 이 사례의 결과가 더 좋은 답이라고 볼 수 없는 관찰
- 그림 읽기: 후보 증가 → 동물 문장 전달 → 높이 숫자 생성. 화살표는 처리 경로를 나타내며, 동물 문장이 높이를 논리적으로 도출했다는 의미가 아님
□ 새 기본 실행에서는 무엇을 볼까
- 높이 질문의 실패는 유지하고, 단어 검색에도 근거가 있는 “제주도의 기후” 질문의 생성 비교를 함께 실행
- 따라서 TODO 미수정 기본 상태에도 실제 생성 출력 존재. 문자 검색으로 바꾸면 기후 질문의 문맥이 기후 문장에서 역사 문장으로 달라지는 효과 관찰
- 생성 답변의 원문은 실행 결과에서 읽고 기록. 검색 성공만으로 모델이 제대로 답할 것이라고 미리 쓰지 않는 실험
- 최대 32토큰의 짧은 출력에서 어색함·미완성이 나오면 그대로 보존. Base 모델의 지시 수행 능력과 근거의 품질을 분리해서 설명할 필요
검색 평가 - 무엇을 정답 근거로 셀까
Section titled “검색 평가 - 무엇을 정답 근거로 셀까”□ 정답 라벨부터 확인
- 높이 질문에 “한라산”이 들어 있는 문단을 전부 정답으로 삼으면 D018 같은 동물 설명까지 정답 집합에 포함 가능
- 실습의
proxy_hit는 문자열 포함 문단의 후보 등장 여부. 높이 질의에서 False → True가 되어도 직접 근거를 찾았다는 뜻이 아님 - 지명 기반 예비 지표와 사람이 확인한 질문별 정답 근거 집합을 분리. gold_ids를 수동 판정 전에는 미판정으로 두는 이유
- 정답 근거가 없거나 아직 확인되지 않은 질문은 0점으로 뭉개지 않고 원문 범위·미판정 상태를 따로 기록
□ Hit@k, Recall@k, MRR 계산
- 아래는 계산 연습. 실제 제주 질문의 수동 정답 라벨을 꾸며 넣은 것이 아닌 예시
- 질문 Q1의 정답 근거는 A와 B 두 개. 검색 순서는
[C, A, D], k = 3
Hit@3 = 1 (A가 있으므로 하나라도 찾음)Recall@3 = 1/2 (A, B 중 A만 찾음)RR = 1/2 (첫 정답 A가 2위)- 질문 Q2에서 첫 정답 1위, Q3에서 정답 없음이라면 MRR =
(1/2 + 1 + 0) / 3 = 0.5 - 세 지표가 동시에 보는 결과가 다른 이유: Hit은 존재, Recall은 근거 집합의 회수, MRR은 첫 근거의 앞쪽 배치
- Q1에 두 근거를 결합해야 답할 수 있다면 Hit이 1이어도 답변에 필요한 B가 없다. 검색 성공의 정의를 질문의 근거 요구에 맞춰야 하는 조건
| 지표 | 높은 값의 의미 | 놓치는 것 |
|---|---|---|
| Hit@k | 적어도 하나의 정답 근거 발견 | 필요한 근거 전부인지 |
| Recall@k | 정답 근거 집합을 많이 회수 | 앞에 놓였는지, 답이 맞는지 |
| MRR | 첫 정답이 앞쪽에 배치 | 두 번째 필수 근거, 최종 생성 |
| 답변 정확성 | 질문의 답이 맞음 | 제공 근거로 뒷받침되는지 |
| 근거 충실성 | 답의 사실을 문맥이 지지 | 원문 자체의 최신성·사실성 |
○ 순위 전체를 비교하는 nDCG - 선택 심화
- 첫 정답만 보는 MRR은 뒤쪽 순서를 놓친다. 관련 문서가 여러 개이거나 관련성에 등급이 있으면 위치마다 이득을 할인하는 DCG 사용 가능
- 같은 Q1의 정답 집합 A·B를 유지하고, 다른 검색기가
[A, C, B]를 반환한 두 번째 예제를 비교. 앞의[C, A, D]와 서로 다른 검색 순위 - 두 번째 예제의 관련성은
[1, 0, 1]. 이진 관련성에서gain = relevance로 계산하며, 등급 관련성에서는 이득 정의를 먼저 고정할 필요
DCG@3 = sum(relevance_i / log2(i + 1))관련성 [1, 0, 1]: DCG = 1/log2(2) + 1/log2(4) = 1.5이상적 순서 [1, 1, 0]: IDCG = 1 + 1/log2(3) = 1.6309nDCG@3 = 1.5 / 1.6309 = 0.9197- 첫 번째
[C, A, D]의 관련성은[0, 1, 0]. DCG =1/log2(3) = 0.6309, 같은 IDCG로 나누면 nDCG =0.3869. Recall은 1/2 - 두 번째
[A, C, B]는 두 정답을 모두 찾았으므로 Recall은 1. 그러나 B를 3위에 둔 비용을 nDCG가 반영해 0.9197. 첫 정답 순위만 보는 RR은 1 - 같은 정답 집합에 대한 두 검색 순위의 차이를 비교하는 계산이며 실제 제주 실측 아님. 원문 정답이 없는 경우는 평가 집계 규칙을 별도로 명시
- 이번 골격은 nDCG 자동 점수를 만들지 않는다. 미판정 gold_ids로 숫자를 내는 대신 손으로 지표 차이를 이해하는 활동
- 코드 실행 전 예측: “한라산의 높이”에서 단어와 문자 검색 중 어느 쪽에 후보가 생길지와 그 이유 작성
- 코드 실행 후 대조: 후보가 늘었다는 관찰과 높이 근거가 맞다는 판정을 두 문장으로 분리
- “제주도의 기후”에서 후보에 D019가 있는지, 실제 선택 문장에 D019가 전달됐는지 비교
- 같은 모델·같은 분할·같은 k를 유지한 채 검색 함수 한 곳만 변경한 이유 설명
□ 새 기후 생성 출력까지 대조하기
- 동일 고정판과 CPU 모델에서 기후 질문도 짧게 생성한 결과. Qwen3-0.6B-Base, fp32, CPU 2스레드, greedy decoding, 최대 새 토큰 32, 2026-10-11 실행
- 앞의 높이 질문은 검색 후보 누락을 보여 주는 사례. 이번 질문은 후보가 있어도 재순위와 문장 선택에서 근거가 달라지는 사례
| 검색 | 실제 입력 근거 | 생성 출력(최대 32새 토큰) | 판정 범위 |
|---|---|---|---|
| 단어 | D019의 저지대·한라산 기후 문장 | 제주도는 아열대성 기후를 보이나, 한라산 등 고지대는 여름에도 서늘한 편이며 | 입력을 따른 부분 답. 마지막 문장이 잘려 완전한 답은 아님 |
| 문자 교체 | D011의 김만덕·육지 구경 역사 문장 | 제주도의 기후는 서부와 남부의 차이가 크다. 서부는 강수량이 많고, 남부는 | 문맥에 없는 기후 주장. 근거 충실성 실패, 실제 기후 사실의 별도 검증은 미판정 |
- 문자 검색의 후보에는 기후 문단 D019도 있었지만, 단순 재순위와 문장 선택으로 D011의 역사 문장을 전달. 후보 확보와 입력 근거 선택을 분리해서 확인해야 하는 이유
- 생성 답변이 기후에 관해 말한다는 사실만으로 근거를 잘 사용했다고 판정할 수 없음. 답변의 각 사실을 실제 입력 문장과 대조하는 순서
- 모델·토크나이저 revision:
da87bfb608c14b7cf20ba1ce41287e8de496c0cd, 환경·seed·decoding 조건을execution_conditions에 저장. 위 생성 예를 재검증할 때 동일 revision과 조건 대조 - 각 생성의 기록: 입력 제한 전 토큰 수·실제 입력 토큰 수·실제 출력 토큰 수·절단 여부·프롬프트와 실제 입력 ID hash·실제 입력 디코딩.
seconds는 generate 구간만 측정 - 후보가 없어 생성하지 않은 경우 상태는 생성 생략, 소요 시간·토큰·hash는 null. 미측정을 0초 실행이나 0토큰 생성으로 표시하지 않음
- TODO를 바꾸지 않은 기본 실행은 기후 질문의 전후 근거·출력이 동일. 한 곳만 교체한 실행과 구분해
generated_climate_before·generated_climate_after에 저장 - 짧은 출력 제한은 CPU 비용을 줄이지만 답변 완결성을 희생. 입력 근거의 오류와 출력 길이 제한의 오류를 별도로 기록
대면 (1시수)
Section titled “대면 (1시수)”그래프 기반 검색 확장 - 두 번 연결했다고 답이 되는가
Section titled “그래프 기반 검색 확장 - 두 번 연결했다고 답이 되는가”□ 문단 하나로 답하지 못하는 질문
- “장소 X가 속한 행정구역에서 제공하는 행사 Y는 무엇인가”라는 가상의 질문 구조 검토. 실제 제주 행사나 행정 관계를 꾸며 넣은 예시가 아닌 조건 설명
- 문서 A에는 장소 X의 소속 구역 Z, 문서 B에는 구역 Z와 행사 Y의 관계가 있다면 두 문서의 결합 필요
- 질문과 단어가 가까운 A만 찾으면 장소의 소속까지만 확인. B까지 찾아 같은 Z를 공유하는지 확인해야 답변의 조건을 이어 갈 수 있는 구조
장소 X --소속(문서 A, 기준 시점 t)--> 구역 Z구역 Z --제공(문서 B, 기준 시점 t)--> 행사 Y- 1홉은 X → Z, 2홉은 Z → Y. 그러나 두 간선의 근거와 시점이 맞아야 “X가 속한 구역의 행사 Y”라는 답이 성립
- X와 Z가 같은 문장에 등장한 것만으로 소속 관계를 만들면 안 된다. 구역 이름이 같아도 동명이거나 기준 시점이 다르면 경로가 잘못 연결될 위험
- 그림 읽기: 문서 두 개를 단순히 모으는 것이 아니라 가운데 개체 판정과 관계 출처를 확인하는 과정. 이 그림도 실제 제주 관계 그래프 측정값이 아닌 모형
□ 확장의 비용과 제약
- 가상의 균일 분기수 b = 10, 시작 노드 1개. 중복·순환이 없다고 가정하면 1홉 10개, 2홉 최대 100개의 노드 검사. 시작점을 포함해 최대 111개 방문
- 2홉이라고 작은 작업이 아니다. 연결 수가 커지면 후보가 빠르게 늘어나므로 홉 수·관계 종류·날짜·개체 타입으로 탐색 범위 제한
- 실제 그래프에는 중복과 순환 존재. 방문한 노드 집합을 두지 않으면 같은 근거를 반복 수집하는 위험
- 문단 검색으로 해결할 조사 문제에 그래프를 붙이는 선택은 원인과 처방 불일치. 표기 문제, 근거 누락, 관계 결합 문제를 먼저 구분
| 문제 | 그래프가 줄 수 있는 도움 | 그래프로 해결하지 못하는 것 |
|---|---|---|
| 여러 문서의 관계 결합 | 공유 개체와 관계를 따라 근거 연결 | 잘못된 개체 병합 |
| 문서 집합의 공통 주제 | 커뮤니티·요약으로 전체 구조 탐색 | 요약 과정의 누락·왜곡 |
| 조사 때문에 검색 후보 0개 | 직접적인 해결책으로 보기 어려움 | 토큰화·표현 문제 |
| 오늘의 운영 시간 없음 | 추가 근거 위치의 탐색 가능 | 원문에 없는 현재 사실 생성 |
□ GraphRAG 논문과 2홉 개념의 구분
- GraphRAG 논문은 개체 그래프와 커뮤니티 요약을 구성해 문서 집합 전체를 묻는 질문에 접근. 단순히 그래프에서 2홉 이웃을 가져오는 알고리즘과 다른 설계
- 앞의 X-Z-Y는 관계 결합을 이해하는 모형, 논문 재현이 아님. 커뮤니티 요약 구축·개체 추출·원문 갱신의 비용까지 검토하는 필요
- 큰 문서 집합의 주제를 묻는 질문과 특정 장소의 높이를 묻는 질문은 요구하는 근거의 형태가 다르므로 같은 확장법이 항상 유리하지 않은 점
실패 사례를 개선안으로 연결
Section titled “실패 사례를 개선안으로 연결”□ 세 팀의 진단 연습
- 표기 팀: “한라산의 높이”의 0후보를 단어 특징과 문서 특징의 교집합 관점에서 설명
- 근거 팀: 문자 검색의 D018 동물 문장과
1000m의 관계를 확인, 단어 포함 proxy가 놓친 것 제시 - 전달 팀: 기후 질문의 D019가 후보에 있는데 D011이 선택된 과정을 분리, 재순위와 문맥 구성 중 검증할 지점 제시
- 개선안은 “더 좋은 검색기를 쓰기”로 끝내지 않고 어떤 산출물이 어떻게 달라져야 개선으로 인정하는가를 함께 기록
- 예: 기후 질문은 D019의 후보 포함만 유지하는 것이 아니라 최종 전달 문장이 기후를 직접 설명하는지 확인
- 예: 높이 질문은 한라산 문자열 포함이 아닌 실제 높이·단위를 뒷받침하는 근거 확인. 원문·색인에 없으면 수집 범위로 분류
[이론] 검색 실패가 생성 품질로 전파되는 경로 정리. 0후보, 무관한 근거, 근거 없는 수치 생성의 세 상태를 연결하고, 후보 수가 늘었다는 지표와 답변의 근거 충실성이 어긋난 이유 설명
[구현] 색인-검색-재순위가 이어진 골격을 실행하고 검색 함수 선택 한 줄만 retrieve_word에서 retrieve_char로 변경. 같은 질문·분할·k·생성 설정으로 전후 후보와 전달 문장, 생성 답변 비교. 기본 상태에서도 실제 생성이 실행되며, 높이 질의의 실패도 그대로 기록
[실무] 과제 3, 제공된 골격으로 제주데이터허브·관광 빅데이터 플랫폼 공개 데이터 색인 구성 후 실패 유형과 원인 제시. 데이터 실물·접근·이용 조건을 먼저 확인하며, 다음 3단계 부분점수 구조 사용
- 1단계: 골격 실행과 기준선 산출물, 실제 출처·접근 상태 기록
- 2단계: 검색 한 단계 교체와 같은 설정의 전후 비교
- 3단계: 실패 유형·원인·개선안을 검증할 근거 제시
□ 데이터 실물 확인과 과제 범위
- 제주데이터허브와 제주 관광 빅데이터 서비스 플랫폼의 공개 파일·필드·이용 조건은 교수자가 확인, 학생의 추가 수집 코드 작성 없음
- 노트북 7-1절에 완성된 CSV/JSON →
id, text, source어댑터와 단어·문자 검색 비교 코드 제공 - 준비 파일:
week09-public.csv또는week09-public.json, 출처 설정week09-public-source.json. 교수자가 확인해 배포한 원본·설정 파일을 런타임에 놓으면 코드 변경 없이 자동 대조 - 출처 설정 항목: 지정 포털의 HTTPS 자료 페이지, 확인한 이용 조건·수집 시각·파일 hash, 실제 공개 텍스트 컬럼, ID 컬럼 또는 null. 예시 컬럼을 실제 파일에서 확인한 필드로 간주하지 않는 원칙
- UTF-8 CSV 또는 행 객체 배열 JSON, 2MB 이내, 앞 50행 색인. 이름·연락처 필드를 선택하거나 도내 기업 자료를 연결하지 않기
- 원본·설정 파일이 없으면 미수집, hash·필드·이용 조건이 맞지 않으면 미확인 결과. 행 수와 검색·정답 판정의 미확인은 null로 보존
- 2026-10-11 재조회: 데이터허브 초기·이용 안내 경로의 HTTP 200은 실제 파일 확보 증거가 아님. 웹 조회에서는 방화벽 차단도 관찰
- 관광 포털 방문 목적별 내국인 입도객 자료 페이지의 CSV 형식 메타데이터는 검색으로 확인했으나 Python HTTPS 조회에서 인증서 검증 실패, 별도 curl 조회에서도 HTTP 403. 실제 파일·필드·이용 조건 미확인
- 현재 기본 실행의 포털 자료 상태는 미수집. 위키백과 기준선과 어댑터 준비 완료를 두 포털 자료 색인 과제 전체 완료로 보고하지 않는 구분
- 제공 어댑터의 검색 비교는 후보·근거 선택까지, 포털 자료의 생성·정답 판정은 미측정. 같은 생성 실험으로 확장하려면 확보한 자료의 질문·정답 근거를 먼저 확인
- 도내 기업 데이터 사용 금지. 데이터 원본을 커밋하지 않고 출처·수집 시각·해시·이용 조건 기록, 학번 폴더에 이름·연락처 미포함
- 정확한 배점과 제출 경로는 별도 과제 공지 기준
□ 실패 기록 항목표
| 항목 | 기록할 것 |
|---|---|
| 질문과 조건 | 장소, 속성, 기준 시점 |
| 원문·색인 | URL, 판 번호, 직접 근거 ID 또는 미확인 |
| 검색 | 후보 ID와 순서, 방법, k |
| 문맥 | 선택 ID, 실제 전달한 문장과 제한 |
| 답변 | 원문 그대로, 근거에 없는 사실 표시 |
| 실패 분류 | 수집 범위 / 검색 / 재순위 / 문맥 절단 / 근거 사용 |
| 개선 검증 | 바뀌어야 할 산출물과 평가 기준 |
자주 하는 오해 Q&A
Section titled “자주 하는 오해 Q&A”Q1. RAG를 붙이면 모델이 사실만 말하는가?
- 외부 문서를 전달하는 구조이지 사실 판정 장치가 아님. 실제 동물 문장을 받고 높이
1000m를 생성한 사례처럼 무관한 문맥에서도 유창한 답 생성 가능 - 검색 결과와 실제 문맥, 답의 사실을 각각 확인하는 필요
Q2. 문자 검색으로 후보가 늘었으니 단어 검색보다 우수한가?
- 높이 질문에서 0개에서 5개로 늘어난 것은 후보 수의 변화. D018의 동물 문장이 높이를 지지하지 않으므로 답변 근거 개선으로 볼 수 없는 결과
- 기후 질문은 직접 근거 D019 대신 역사 문장 D011이 선택. 질문별 실패를 읽어야 하는 이유
Q3. 검색 점수 0.97이면 정답일 확률 97%인가?
- 단어 좌표의 코사인 유사도이지 정답 확률이 아님. 계산용 A의 0.9698은 기후 특징이 질문과 비슷한 방향이라는 뜻
- 거짓 내용을 같은 단어로 쓰면 높은 점수가 나올 수 있고, 서로 다른 검색기 점수도 같은 확률 척도로 비교 불가
Q4. 재순위를 잘하면 모든 검색 실패를 고칠 수 있는가?
- 후보 안의 순서를 바꾸므로 후보 밖 정답 문서를 새로 찾지 못하는 구조. 인터랙티브의 k = 3에서는 재순위를 켜도 D4가 없음
- 후보가 있더라도 단순 토큰 포함 기준은 높이·시점 같은 조건을 충분히 확인하지 못함
Q5. 정답 문서가 후보 안에 있으니 생성 실패는 모델 탓인가?
- 최종 입력을 먼저 확인할 필요. 기후 질문의 D019는 후보에 있었지만 실제로 선택된 것은 D011. 모델은 기후 근거를 받지 못한 상태
- 모델에 전달된 근거가 충분할 때 비로소 근거 사용 실패를 분리하는 순서
Q6. 인용 ID가 붙은 답변은 근거가 있는가?
- ID는 문서 위치만 가리킴.
1000m와 D018이 함께 출력되어도 D018의 동물 문장이 그 수치를 지지하지 않으면 근거 없는 인용 - 답의 각 사실과 실제 문장을 대조하는 판정 필요
Q7. Hit@5가 1이면 필요한 근거를 모두 찾은 것인가?
- 정답 두 개 중 하나만 찾아도 Hit은 1. 두 근거의 결합이 필요한 질문이면 Recall은 1/2이고 답할 정보가 부족할 수 있음
- 정답 근거 집합과 질문의 요구를 먼저 정의하는 필요
Q8. 그래프 2홉이면 연결된 사실을 답해도 되는가?
- 각 간선의 원문 근거, 개체 동일성, 시점이 일치해야 관계 결합 가능. 같은 문장에 등장한 개체를 임의로 연결하면 잘못된 경로 생성
- 그래프는 근거를 찾을 길을 제공할 수 있으나 누락된 현재 정보를 만들어 주지 않는 구조
스스로 점검
Section titled “스스로 점검”- 1,000토큰 문서를 길이 200, 겹침 50으로 자른다. 창은 몇 개이며 색인되는 총 토큰은?
- N = 3, df = 1일 때 기본 평활화 IDF는? 같은 단어가 한 문서에 두 번 나오면 df가 2인가?
- 정규화된 q = (0.5085, 0.8610, 0), A = (0.2832, 0.9591, 0), C = (1, 0, 0)일 때 어느 문서가 먼저 검색되는가?
- 실제 단어 색인 (58, 1801), 문자 색인 (58, 18572)에서 행·열은 무엇이며 열이 10.31배면 메모리도 같은 배수인가?
- Q1의 정답 근거 A·B, 후보 C-A-D일 때 Hit@3, Recall@3, RR은? Q2의 RR = 1, Q3의 RR = 0이면 MRR은?
- 관련성 [1, 0, 1]의 DCG@3와 nDCG@3를 계산하라. 관련성 이득은 이진 값 그대로 사용.
- 높이 질문의 proxy가 False → True가 되었는데 왜 개선으로 확정할 수 없는가?
- 후보에 D019가 있지만 모델에 D011을 넣은 기후 질문의 실패를 어떻게 분류할 것인가?
- 전체 문맥 768토큰, 지시문·질문 120토큰, 근거 3개 각 250토큰이면 초과량은? 600자 제한과 600토큰 제한은 같은가?
- 분기수 10, 중복·순환이 없는 2홉 탐색에서 시작점을 포함한 최대 방문 수는? 이 가정이 실제 그래프와 다른 점은?
정답 보기
- 시작점 0, 150, 300, 450, 600, 750, 900의 7개 창. 마지막은 100토큰이므로 총 6 x 200 + 100 = 1,300. 중복 300토큰은 경계 보존의 비용
- ln(4/2) + 1 = 1.6931. df는 문서 수이므로 같은 문서 안 반복은 TF만 늘리고 df는 1 유지
- q·A = 약 0.9698, q·C = 0.5085. A가 먼저. 방향 유사도는 높지만 사실성까지 확인한 수치가 아님
- 행은 문단, 열은 특징. 차원은 10.31배지만 희소 행렬의 값 개수·자료형·인덱스 저장도 메모리를 결정하므로 같은 배수로 단정 불가
- Hit = 1, Recall = 1/2, RR = 1/2. MRR = (1/2 + 1 + 0)/3 = 0.5. 첫 정답을 찾았어도 필수 근거 B 누락
- DCG = 1 + 1/2 = 1.5. 이상적 순서 [1, 1, 0]의 IDCG = 1 + 1/log2(3) = 1.6309. nDCG = 0.9197
- proxy는 한라산 문자열 포함만 확인. 실제 선택한 D018 문장은 동물 종류이며 높이 근거가 아님. 생성
1000m도 전달 문맥에 없는 수치 - 후보 포함은 성공했으나 재순위·근거 선택 실패. 실제 모델 입력을 확인한 뒤 생성 모델의 근거 사용 능력과 구분
- 근거 예산 648, 요청 근거 750이므로 102토큰 초과. 문자와 모델 토큰은 단위가 다르므로 600자 = 600토큰이 아님
- 1 + 10 + 100 = 111. 실제에는 중복·순환·불균일 분기와 관계 오류가 있어 방문 집합과 범위 제한 필요
이번 주 용어 정리
Section titled “이번 주 용어 정리”| 용어 | 한 줄 뜻 |
|---|---|
| RAG | 질문 관련 외부 근거를 검색해 생성 입력에 연결하는 구조 |
| chunk | 색인·검색 단위로 나눈 문서 조각 |
| 겹침 | 분할 경계의 정보 손실을 줄이기 위해 중복하는 부분 |
| TF / df | 문서 안 등장 횟수 / 해당 단어가 등장한 문서 수 |
| IDF | 여러 문서에 흔한 특징의 가중치를 줄이는 값 |
| L2 정규화 | 벡터를 길이 1로 맞추는 계산 |
| 코사인 유사도 | 벡터의 방향 유사도, 정답 확률과 구별 |
| 희소 검색 | 단어·문자 특징의 겹침을 사용하는 검색 |
| 문자 n-gram | 길이 n의 연속 문자 부분 문자열 |
| 밀집 검색 | 학습된 벡터로 의미 유사도를 표현하는 검색 |
| 이중 인코더 | 질문과 문단을 따로 인코딩하는 구조 |
| 재순위 | 이미 확보한 후보의 관련성을 다시 비교하는 단계 |
| 문맥 예산 | 생성 입력에 넣을 근거의 길이 제한 |
| grounding | 답의 사실을 실제 전달된 근거로 뒷받침하는 것 |
| Hit@k / Recall@k | 근거 하나라도 발견 / 정답 근거 집합의 회수 비율 |
| MRR | 첫 정답 근거 순위의 역수를 질문별 평균 |
| nDCG | 위치별 관련성 이득을 이상적 순서로 정규화한 값 |
| proxy | 직접 판정을 대신하는 예비 신호, 참값과 구별 |
| 홉 | 그래프의 간선을 한 번 따라가는 이동 |
| 개체 해소 | 서로 다른 이름·표기를 같은 개체로 볼지 확인하는 과정 |
- 원문 데이터: 위키백과 고정 판 42464087, CC BY-SA 4.0. 문단 ID는 노트북 전처리 결과 기준
- TF-IDF 설정: scikit-learn Feature extraction, 기본 평활화·L2 정규화 확인
- 순위 평가 심화: Introduction to Information Retrieval, ranked retrieval evaluation
- 연구 읽기: 앞의 RAG·DPR·Lost in the Middle·GraphRAG 원문 링크. 그림은 강의용 제작물, 논문 그림이나 성능 그래프의 복제가 아닌 자료
- 실행 근거: 같은 판·노트북의 단어 기본 및 문자 교체 실행에서 나온 후보와 문장. 새 실험에서는
week09-results.json에 실제 출력 보존
실습 노트북
Section titled “실습 노트북”- 공개 원문 다운로드 → 58문단 색인 → 단어 검색 기준선 → 한 줄 교체 → 동일 재순위·근거 선택 → 짧은 CPU 생성 → 실패 기록의 제공 골격
- 바꿀 곳은
retrieve = retrieve_word한 줄, 교체 예시는retrieve = retrieve_char. 미수정 상태에서도 전체 실행과 실제 생성 가능 - 기본 기후 질문은 생성 단계를 관찰하고, 높이 질문은 후보 누락과 무관한 근거의 실패 보존. 질문별 결과를 합쳐 한 숫자로 승패를 선언하지 않는 목표
- 무료 CPU 런타임 사용, GPU 의존 없음. 모델·원문 다운로드 실패를 가짜 자료로 대체하지 않고 실제 오류 기록
- 7-1절의 공개 표 어댑터는 완성 제공, 학생의 추가 파서 구현 없음. 확인된 원본·출처 설정 파일이 없으면 미수집 결과와 남은 조건 저장
- 다음 주 연결: SFT → RLHF(PPO) → DPO → GRPO. 이번 주는 정보 선택, 다음 주는 응답 행동과 선호 목표 학습. 근거가 존재하는지와 근거에 충실한 응답을 선호하도록 학습했는지를 구분