8차시. 첫 번째 RAG 실습
퀴즈 2 — 인덱스는 한 번만 만들고 질문만 반복하기
질문 함수 밖에서 한 번만 만들 인덱스 자리를 주석이 아니라 코드로 나누세요.
빈칸 코드에서 시작합니다.
def boot(build_index, ask, question):
# build_index는 한 번, ask는 질문마다
pass결과 보기 (예시 풀이)
# 퀴즈 2. 인덱스는 한 번, 질문은 여러 번
# first_rag.py에서 "인덱싱은 ask 밖에서 한 번"을 지킨 구조를 함수로 연습합니다.
def boot(build_index, ask, question):
# build_index는 한 번, ask는 질문마다
index = build_index()
return ask(index, question)
# 몇 번 불렸는지 세기 위한 칸입니다. 실제로는 이 횟수만큼 임베딩 비용이 듭니다.
calls = {"build": 0}
def build_index():
# 가짜 인덱스: 조각 번호 → 본문
calls["build"] += 1
return {0: "환불은 상품 수령 후 7일 이내", 1: "불량품 교환은 30일 이내"}
def ask(index, question):
# 가짜 검색: 질문의 첫 두 글자가 들어 있는 조각을 찾습니다.
for text in index.values():
if question[:2] in text:
return text
return "자료에서 확인할 수 없습니다"
# 확인 1: boot 한 번 → build_index도 한 번
print(boot(build_index, ask, "환불 기한은?"))
print("build_index 호출 횟수:", calls["build"])
# 확인 2: 질문이 여러 개일 때 boot를 반복하면 인덱스를 매번 다시 만듭니다 (나쁜 예).
calls["build"] = 0
for q in ["환불 기한은?", "교환 기한은?", "대표이사는?"]:
boot(build_index, ask, q)
print("질문 3개를 boot로 반복:", calls["build"], "번 생성")
# 확인 3: 좋은 예. 인덱스는 밖에서 한 번 만들고 ask만 반복합니다.
calls["build"] = 0
index = build_index()
for q in ["환불 기한은?", "교환 기한은?", "대표이사는?"]:
print(q, "→", ask(index, q))
print("밖에서 한 번 만든 경우:", calls["build"], "번 생성")
실행 결과
환불은 상품 수령 후 7일 이내
build_index 호출 횟수: 1
질문 3개를 boot로 반복: 3 번 생성
환불 기한은? → 환불은 상품 수령 후 7일 이내
교환 기한은? → 불량품 교환은 30일 이내
대표이사는? → 자료에서 확인할 수 없습니다
밖에서 한 번 만든 경우: 1 번 생성채점 기준: build_index 호출은 한 번뿐이어야 한다.
관련 교안: 8차시 「2. 전체 구조 다시 보기」