Skip to content
입문 NLP

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, 원문 전체는 저장소에 미포함

강의: 근거를 찾는 것과 답을 만드는 것 - 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제주 기후 기후120
B제주 관광101
C제주100
질문 q제주 기후110
  • 문서 수 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.6931
  • 1 +는 기본 평활화 설정. 수업에서는 이 식으로 계산해 라이브러리의 설정과 숫자를 일치시키는 방식
  • 단어 빈도에 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.9698
cos(q, B) = 0.5085 x 0.5085 = 0.2586
cos(q, C) = 0.5085 x 1 = 0.5085
검색 순서: A → C → B
  • “제주”만 있는 C보다 “제주 기후” 방향에 가까운 A가 먼저 나오는 결과. 관광 문서 B에도 제주가 있지만 기후 좌표가 없어 점수가 낮은 계산
  • 점수 0.9698은 정답 확률 96.98%가 아니다. 이 단어 좌표계에서 방향이 가깝다는 뜻. A에 잘못된 기후 설명을 써도 단어 구성이 같으면 높은 점수 가능
  • 긴 문서를 무조건 먼저 뽑지 않도록 길이를 정규화했지만 문서의 사실성까지 검증한 것은 아닌 점
계산용 A, B, C와 질문 q의 빈도 행렬, IDF 가중치, 정규화와 코사인 점수 0.9698, 0.5085, 0.2586을 연결한 계산 그림
  • 그림 읽기: 왼쪽 빈도 행렬의 각 열에 가운데 IDF를 곱하고 정규화. 오른쪽 순위는 그 결과의 내적. 어느 단계에도 사실 확인 연산이 없다는 것까지 읽는 연습

단어 검색과 문자 검색 - 후보가 생긴다는 것의 의미

Section titled “단어 검색과 문자 검색 - 후보가 생긴다는 것의 의미”

□ 실제 색인의 크기

단어 색인: (58, 1801)
문자 색인: (58, 18572)
  • 행 58은 문단 수, 열은 관찰된 특징 종류. 문자가 단어보다 작은 단위이지만 길이 2~4의 여러 연속 조합을 특징으로 만들기 때문에 열 수가 약 18,572 / 1,801 = 10.31배
  • 이것을 메모리 10.31배로 읽으면 안 된다. 희소 행렬은 0이 아닌 값 중심으로 저장하므로 실제 메모리는 값의 개수와 저장 형식에도 의존

□ “한라산”과 “한라산의”의 차이

  • 단어 분석기는 조사 제거 없이 정규식으로 단어를 분리. 질문 “한라산의 높이”의 단어 특징은 한라산의, 높이
  • 원문에는 한라산, 한라산을 같은 표기가 있어도 정확히 같은 특징이 없으면 공유 좌표가 0. 현재 실습 질의의 단어 검색 후보가 빈 목록이 된 원인
  • 문자 2-gram만 펼치면 “한라산의”에서 한라, 라산, 산의 생성. 문서의 “한라산”과 한라, 라산을 공유할 수 있는 구조
  • 하지만 산의가 겹쳐도 “높이”에 답한다는 뜻은 아니다. 문자 검색은 표기 차이를 일부 잇지만 질문 조건을 이해하는 모델이 아닌 방식
단어 TF-IDF, 문자 TF-IDF, 학습된 밀집 검색, 재순위, 질문별 평가의 역할을 비교한 개념도

○ 실제 후보를 읽어 보기

질문단어 검색 후보 (순서대로)문자 검색 후보 (순서대로)
한라산D019, D018, D016, D015, D038D016, D018, D019, D010, D038
한라산의 높이없음D018, D016, D019, D038, D015
제주도의 기후D019, D036, D011, D032, D004D011, D013, D019, D004, D032
제주 관광지 오늘 운영 시간D047, D049, D031, D000, D044D025, 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위
최상위로 선택한 문단D019D011
선택 문장의 주제저지대·한라산의 기후조선 시대 김만덕의 육지 방문
해석질문 조건을 직접 지지기후 답변 근거로 부적절
  • “제주도”라는 주제는 맞아도 “기후”라는 조건은 맞지 않는다. 후보에 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가 붙어도 그 문단이 숫자를 지지하지 않으면 인용 실패. 인용 형식이 있다와 근거가 있다의 차이
    • 단어 검색에서는 후보가 없어 “검색 근거 없음”으로 생성 생략. 문자 검색은 생성을 진행했지만 이 사례의 결과가 더 좋은 답이라고 볼 수 없는 관찰
    실제 높이 질의의 단어 검색 0후보와 문자 검색 D018 동물 문단, 그 문맥을 받아 나온 근거 없는 1000m 답변을 연결한 실행 결과 그림
    • 그림 읽기: 후보 증가 → 동물 문장 전달 → 높이 숫자 생성. 화살표는 처리 경로를 나타내며, 동물 문장이 높이를 논리적으로 도출했다는 의미가 아님

    □ 새 기본 실행에서는 무엇을 볼까

    • 높이 질문의 실패는 유지하고, 단어 검색에도 근거가 있는 “제주도의 기후” 질문의 생성 비교를 함께 실행
    • 따라서 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.6309
    nDCG@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로 숫자를 내는 대신 손으로 지표 차이를 이해하는 활동
    정답 A·B가 같은 두 검색 순위 비교. 예제 1 C-A-D는 Recall 1/2, RR 1/2, nDCG 0.3869. 예제 2 A-C-B는 Recall 1, RR 1, nDCG 0.9197인 교육용 계산 그림
    • 코드 실행 전 예측: “한라산의 높이”에서 단어와 문자 검색 중 어느 쪽에 후보가 생길지와 그 이유 작성
    • 코드 실행 후 대조: 후보가 늘었다는 관찰과 높이 근거가 맞다는 판정을 두 문장으로 분리
    • “제주도의 기후”에서 후보에 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 비용을 줄이지만 답변 완결성을 희생. 입력 근거의 오류와 출력 길이 제한의 오류를 별도로 기록

    그래프 기반 검색 확장 - 두 번 연결했다고 답이 되는가

    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가 같은 문장에 등장한 것만으로 소속 관계를 만들면 안 된다. 구역 이름이 같아도 동명이거나 기준 시점이 다르면 경로가 잘못 연결될 위험
    문서 A, 개체 X, 출처가 있는 X와 Y의 관계, 문서 B, 확장 결과를 연결한 그래프 검색 개념도
    • 그림 읽기: 문서 두 개를 단순히 모으는 것이 아니라 가운데 개체 판정과 관계 출처를 확인하는 과정. 이 그림도 실제 제주 관계 그래프 측정값이 아닌 모형

    □ 확장의 비용과 제약

    • 가상의 균일 분기수 b = 10, 시작 노드 1개. 중복·순환이 없다고 가정하면 1홉 10개, 2홉 최대 100개의 노드 검사. 시작점을 포함해 최대 111개 방문
    • 2홉이라고 작은 작업이 아니다. 연결 수가 커지면 후보가 빠르게 늘어나므로 홉 수·관계 종류·날짜·개체 타입으로 탐색 범위 제한
    • 실제 그래프에는 중복과 순환 존재. 방문한 노드 집합을 두지 않으면 같은 근거를 반복 수집하는 위험
    • 문단 검색으로 해결할 조사 문제에 그래프를 붙이는 선택은 원인과 처방 불일치. 표기 문제, 근거 누락, 관계 결합 문제를 먼저 구분
    문제그래프가 줄 수 있는 도움그래프로 해결하지 못하는 것
    여러 문서의 관계 결합공유 개체와 관계를 따라 근거 연결잘못된 개체 병합
    문서 집합의 공통 주제커뮤니티·요약으로 전체 구조 탐색요약 과정의 누락·왜곡
    조사 때문에 검색 후보 0개직접적인 해결책으로 보기 어려움토큰화·표현 문제
    오늘의 운영 시간 없음추가 근거 위치의 탐색 가능원문에 없는 현재 사실 생성

    □ GraphRAG 논문과 2홉 개념의 구분

    • GraphRAG 논문은 개체 그래프와 커뮤니티 요약을 구성해 문서 집합 전체를 묻는 질문에 접근. 단순히 그래프에서 2홉 이웃을 가져오는 알고리즘과 다른 설계
    • 앞의 X-Z-Y는 관계 결합을 이해하는 모형, 논문 재현이 아님. 커뮤니티 요약 구축·개체 추출·원문 갱신의 비용까지 검토하는 필요
    • 큰 문서 집합의 주제를 묻는 질문과 특정 장소의 높이를 묻는 질문은 요구하는 근거의 형태가 다르므로 같은 확장법이 항상 유리하지 않은 점

    □ 세 팀의 진단 연습

    1. 표기 팀: “한라산의 높이”의 0후보를 단어 특징과 문서 특징의 교집합 관점에서 설명
    2. 근거 팀: 문자 검색의 D018 동물 문장과 1000m의 관계를 확인, 단어 포함 proxy가 놓친 것 제시
    3. 전달 팀: 기후 질문의 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, 실제 전달한 문장과 제한
    답변원문 그대로, 근거에 없는 사실 표시
    실패 분류수집 범위 / 검색 / 재순위 / 문맥 절단 / 근거 사용
    개선 검증바뀌어야 할 산출물과 평가 기준
    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홉이면 연결된 사실을 답해도 되는가?
    • 각 간선의 원문 근거, 개체 동일성, 시점이 일치해야 관계 결합 가능. 같은 문장에 등장한 개체를 임의로 연결하면 잘못된 경로 생성
    • 그래프는 근거를 찾을 길을 제공할 수 있으나 누락된 현재 정보를 만들어 주지 않는 구조
    1. 1,000토큰 문서를 길이 200, 겹침 50으로 자른다. 창은 몇 개이며 색인되는 총 토큰은?
    2. N = 3, df = 1일 때 기본 평활화 IDF는? 같은 단어가 한 문서에 두 번 나오면 df가 2인가?
    3. 정규화된 q = (0.5085, 0.8610, 0), A = (0.2832, 0.9591, 0), C = (1, 0, 0)일 때 어느 문서가 먼저 검색되는가?
    4. 실제 단어 색인 (58, 1801), 문자 색인 (58, 18572)에서 행·열은 무엇이며 열이 10.31배면 메모리도 같은 배수인가?
    5. Q1의 정답 근거 A·B, 후보 C-A-D일 때 Hit@3, Recall@3, RR은? Q2의 RR = 1, Q3의 RR = 0이면 MRR은?
    6. 관련성 [1, 0, 1]의 DCG@3와 nDCG@3를 계산하라. 관련성 이득은 이진 값 그대로 사용.
    7. 높이 질문의 proxy가 False → True가 되었는데 왜 개선으로 확정할 수 없는가?
    8. 후보에 D019가 있지만 모델에 D011을 넣은 기후 질문의 실패를 어떻게 분류할 것인가?
    9. 전체 문맥 768토큰, 지시문·질문 120토큰, 근거 3개 각 250토큰이면 초과량은? 600자 제한과 600토큰 제한은 같은가?
    10. 분기수 10, 중복·순환이 없는 2홉 탐색에서 시작점을 포함한 최대 방문 수는? 이 가정이 실제 그래프와 다른 점은?
    정답 보기
    1. 시작점 0, 150, 300, 450, 600, 750, 900의 7개 창. 마지막은 100토큰이므로 총 6 x 200 + 100 = 1,300. 중복 300토큰은 경계 보존의 비용
    2. ln(4/2) + 1 = 1.6931. df는 문서 수이므로 같은 문서 안 반복은 TF만 늘리고 df는 1 유지
    3. q·A = 약 0.9698, q·C = 0.5085. A가 먼저. 방향 유사도는 높지만 사실성까지 확인한 수치가 아님
    4. 행은 문단, 열은 특징. 차원은 10.31배지만 희소 행렬의 값 개수·자료형·인덱스 저장도 메모리를 결정하므로 같은 배수로 단정 불가
    5. Hit = 1, Recall = 1/2, RR = 1/2. MRR = (1/2 + 1 + 0)/3 = 0.5. 첫 정답을 찾았어도 필수 근거 B 누락
    6. DCG = 1 + 1/2 = 1.5. 이상적 순서 [1, 1, 0]의 IDCG = 1 + 1/log2(3) = 1.6309. nDCG = 0.9197
    7. proxy는 한라산 문자열 포함만 확인. 실제 선택한 D018 문장은 동물 종류이며 높이 근거가 아님. 생성 1000m도 전달 문맥에 없는 수치
    8. 후보 포함은 성공했으나 재순위·근거 선택 실패. 실제 모델 입력을 확인한 뒤 생성 모델의 근거 사용 능력과 구분
    9. 근거 예산 648, 요청 근거 750이므로 102토큰 초과. 문자와 모델 토큰은 단위가 다르므로 600자 = 600토큰이 아님
    10. 1 + 10 + 100 = 111. 실제에는 중복·순환·불균일 분기와 관계 오류가 있어 방문 집합과 범위 제한 필요
    용어한 줄 뜻
    RAG질문 관련 외부 근거를 검색해 생성 입력에 연결하는 구조
    chunk색인·검색 단위로 나눈 문서 조각
    겹침분할 경계의 정보 손실을 줄이기 위해 중복하는 부분
    TF / df문서 안 등장 횟수 / 해당 단어가 등장한 문서 수
    IDF여러 문서에 흔한 특징의 가중치를 줄이는 값
    L2 정규화벡터를 길이 1로 맞추는 계산
    코사인 유사도벡터의 방향 유사도, 정답 확률과 구별
    희소 검색단어·문자 특징의 겹침을 사용하는 검색
    문자 n-gram길이 n의 연속 문자 부분 문자열
    밀집 검색학습된 벡터로 의미 유사도를 표현하는 검색
    이중 인코더질문과 문단을 따로 인코딩하는 구조
    재순위이미 확보한 후보의 관련성을 다시 비교하는 단계
    문맥 예산생성 입력에 넣을 근거의 길이 제한
    grounding답의 사실을 실제 전달된 근거로 뒷받침하는 것
    Hit@k / Recall@k근거 하나라도 발견 / 정답 근거 집합의 회수 비율
    MRR첫 정답 근거 순위의 역수를 질문별 평균
    nDCG위치별 관련성 이득을 이상적 순서로 정규화한 값
    proxy직접 판정을 대신하는 예비 신호, 참값과 구별
    홉그래프의 간선을 한 번 따라가는 이동
    개체 해소서로 다른 이름·표기를 같은 개체로 볼지 확인하는 과정

    Open In Colab

    • 공개 원문 다운로드 → 58문단 색인 → 단어 검색 기준선 → 한 줄 교체 → 동일 재순위·근거 선택 → 짧은 CPU 생성 → 실패 기록의 제공 골격
    • 바꿀 곳은 retrieve = retrieve_word 한 줄, 교체 예시는 retrieve = retrieve_char. 미수정 상태에서도 전체 실행과 실제 생성 가능
    • 기본 기후 질문은 생성 단계를 관찰하고, 높이 질문은 후보 누락과 무관한 근거의 실패 보존. 질문별 결과를 합쳐 한 숫자로 승패를 선언하지 않는 목표
    • 무료 CPU 런타임 사용, GPU 의존 없음. 모델·원문 다운로드 실패를 가짜 자료로 대체하지 않고 실제 오류 기록
    • 7-1절의 공개 표 어댑터는 완성 제공, 학생의 추가 파서 구현 없음. 확인된 원본·출처 설정 파일이 없으면 미수집 결과와 남은 조건 저장
    • 다음 주 연결: SFT → RLHF(PPO) → DPO → GRPO. 이번 주는 정보 선택, 다음 주는 응답 행동과 선호 목표 학습. 근거가 존재하는지와 근거에 충실한 응답을 선호하도록 학습했는지를 구분