18차시. State 이해
9. 실습 ④ — State 흐름 추적하기
출처: 원본 PDF 18차시_State이해.pdf 19~20쪽 · 쪽 그림 19쪽 20쪽
디버깅할 때 State가 어떻게 변하는지 보는 것이 가장 중요합니다.
9-1) 노드마다 로그 남기기
def retrieve(state: RAGState):
docs = search(state["query"])
return {
"documents": docs,
"log": [f"[retrieve] query='{state['query']}' "
f"→ {len(docs)}건"],
}
def generate(state: RAGState):
answer = make_answer(state["documents"], state["question"])
return {
"answer": answer,
"log": [f"[generate] 답변 {len(answer)}자 생성"],
}
실행 후 로그 확인
──────────────────────────────────────
final = app.invoke(make_initial_state("환불 규정은?"))
for line in final["log"]:
print(line)
# [retrieve] query='환불 규정은?' → 3건
# [generate] 답변 87자 생성9-2) stream으로 단계별 보기
for step in app.stream(make_initial_state("환불 규정은?")):
for node_name, update in step.items():
print(f"■ {node_name} 실행")
for k, v in update.items():
preview = str(v)[:60]
print(f" {k} = {preview}")
실행 결과
──────────────────────────────────────
■ retrieve 실행
documents = [Document(page_content='상품 수령 후 7일...
log = ["[retrieve] query='환불 규정은?' → 3건"]
■ generate 실행
answer = 환불은 상품 수령 후 7일 이내에 신청하실 수...
log = ['[generate] 답변 87자 생성']🔍 stream이 보여주는 것
어느 노드가 실행됐고
무엇을 반환했는지가 순서대로 보입니다.
반환한 키만 나온다는 점에 주목하세요.
"바꾼 것만 반환한다"는 규칙이 눈에 보입니다.
21차시에서 이 도구를 본격적으로 씁니다.