RAG2026-5일19차시 · Node 이해15 / 19← 이전목차다음 →MetaContents

19차시. Node 이해

실습 1 — Node 이해 실습 따라 하기

관련 수업 자료: 19차시 「7. 실습 ③ — Fallback 노드 만들기」(15쪽), 19차시 「10. 노드를 이어서 돌려보기」(20~21쪽) · 실습 코드 19/config.py, 19/retrieve.py, 19/generate.py, 19/fallback.py, 19/manual_flow.py

이 실습은 교안 해설(19_Node이해.md)의 실습 순서를 옮긴 것입니다. OpenAI 임베딩이나 채팅 모델을 부르는 파일은 .env 에 API 키가 있어야 돌아갑니다. 키가 없으면 실행 결과 샘플로 출력 모양을 확인합니다.

수업 자료와 이어지는 곳

실행 흐름

출력
query → retrieve node
retrieve node → retrieval ok
retrieval ok → generate node  (참)
retrieval ok → fallback node  (거짓)

실습 순서

python fallback.py를 먼저 실행해 안내 문장을 확인합니다. 키가 있으면 retrieve.py와 generate.py를 파일 하단의 단독 테스트로 실행합니다. 각 함수 주석의 읽기 키와 쓰기 키를 표로 옮겨 봅니다.

스스로 확인

  • 노드가 평범한 함수라는 점을 말할 수 있는가?
  • 검색과 생성을 한 함수에 두면 무엇이 테스트하기 어려운가?
  • fallback이 지어내지 않고 안내만 하는 이유를 아는가?

코드 설명

  • retrieve.py 는 store = get_store() 를 함수 밖 모듈 맨 위에서 한 번만 부릅니다. 노드 안에 두면 질문마다 인덱스를 다시 읽게 됩니다. 「9. 자주 하는 실수」의 "인덱스를 매번 로드"가 이것입니다.
  • retrieval_ok = len(documents) > 0 은 판단 재료를 노드가 미리 만들어 두는 줄입니다. 20차시의 분기 함수는 이 값 하나만 보면 되므로 짧아집니다.
  • scores 에는 기준을 넘지 못한 조각의 점수까지 모두 담고, documents 에는 config.MIN_SCORE 이상인 것만 담습니다. 로그의 3/5건 통과 처럼 앞뒤 숫자가 다른 까닭입니다.
  • generate.py 의 chain.invoke(...) 는 그래프 실행이 아니라 프롬프트, LLM, 문자열 변환 체인을 부르는 것입니다. 이름이 같아서 많이들 헷갈리십니다.
  • build_context 는 filename, file_name, source 순으로 파일명을 찾고 없으면 "unknown" 을 씁니다. 로더마다 metadata 키 이름이 달라도 멈추지 않게 하려는 것입니다.
  • manual_flow.py 는 그래프 밖이라 reducer가 없습니다. 그래서 new_log = state["log"] + result["log"] 로 먼저 합쳐 두고, state.update(result) 가 log 를 덮어쓴 뒤에 다시 넣습니다. 순서를 바꾸면 앞 노드의 로그가 사라집니다.
← 이전 절19차시 · 체크리스트와 과제다음 절 →19차시 · 퀴즈 1 — 지어내지 않고 안내만 하는 fallback 노드