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 키가 있어야 돌아갑니다. 키가 없으면 실행 결과 샘플로 출력 모양을 확인합니다.
수업 자료와 이어지는 곳
| 실습 코드 | 원본 PDF | 이어지는 내용 |
|---|---|---|
19/config.py | 15쪽 | 19차시 「7. 실습 ③ — Fallback 노드 만들기」 › 7-1) 지금까지 만든 노드 정리 아래에 실었습니다 |
19/retrieve.py | 15쪽 | 19차시 「7. 실습 ③ — Fallback 노드 만들기」 › 7-1) 지금까지 만든 노드 정리 아래에 실었습니다 |
19/generate.py | 15쪽 | 19차시 「7. 실습 ③ — Fallback 노드 만들기」 › 7-1) 지금까지 만든 노드 정리 아래에 실었습니다 |
19/fallback.py | 15쪽 | 19차시 「7. 실습 ③ — Fallback 노드 만들기」 › 7-1) 지금까지 만든 노드 정리 아래에 실었습니다 |
19/manual_flow.py | 20~21쪽 | 19차시 「10. 노드를 이어서 돌려보기」 아래에 실었습니다 |
실행 흐름
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 를 덮어쓴 뒤에 다시 넣습니다. 순서를 바꾸면 앞 노드의 로그가 사라집니다.