리듀서는 "적는 규칙"이에요
노드가 새 값을 돌려주면, 그 값을 State에 어떻게 적을지 정하는 규칙이 리듀서예요.
방법은 크게 두 가지예요. 칠판처럼 지우고 새로 쓰기, 아니면 공책처럼 아래에 이어 쓰기.
칠판 vs 공책
기본 규칙 (리듀서 없음)
안녕하세요?
안녕하세요, 반갑습니다.
칠판은 새로 쓰려면 원래 있던 걸 지워요. 그래서 마지막에 쓴 것 하나만 남아요.
messages: list 처럼 그냥 쓰면 이렇게 돼요.
add_messages 리듀서
안녕하세요?
+ 안녕하세요, 반갑습니다.
공책은 원래 쓴 건 그대로 두고 아랫줄에 이어서 써요. 그래서 대화가 차곡차곡 쌓여요.
add_messages를 붙이면 이렇게 돼요.
코드 한 줄 뜯어보기
messages: Annotated[list, add_messages]
messages
공책의 이름표예요. "대화 공책"이라고 이름 붙인 거예요.
list
공책에 여러 줄을 담을 수 있다는 뜻이에요.
add_messages
"새 메시지는 아래에 이어 써라" 하는 규칙이에요.
Annotated[...]는 "이 칸은 list인데, 적을 때는 add_messages 규칙을 써"라고 두 가지를 한꺼번에 알려 주는 포장지예요.
실제로 따라가 보기
chat 노드는 항상 똑같이 "안녕하세요, 반갑습니다." 한 줄만 돌려줘요. 그 한 줄이 공책에 어떻게 쌓이는지 봐요.
초록 점선 = 이번에 새로 이어 쓴 줄
1차 실행
내가 넣은 것
Human안녕하세요?
→
chat 노드가 돌려준 것
AI안녕하세요, 반갑습니다.
→
공책 (결과)
Human안녕하세요?
AI안녕하세요, 반갑습니다.
메시지 2개
2차 실행
그래프는 실행이 끝나면 공책을 기억하지 못해요. 그래서 1차 공책 2줄에 새 질문 1줄을 붙여서 내가 직접 다시 넘겨줘요.
내가 넣은 것 (3줄)
Human안녕하세요?
AI안녕하세요, 반갑습니다.
Human잘 지내시나요?
→
chat 노드가 돌려준 것
AI안녕하세요, 반갑습니다.
→
공책 (결과)
Human안녕하세요?
AI안녕하세요, 반갑습니다.
Human잘 지내시나요?
AI안녕하세요, 반갑습니다.
메시지 4개
실제 출력과 똑같아요: 1차 실행 후 메시지 개수: 2, 2차 실행 후 메시지 개수: 4
만약 add_messages를 빼면?
messages: list 로만 바꿔서 1차 실행을 직접 돌려 봤어요. 칠판처럼 지우고 새로 써서 내 질문이 사라졌어요.
내가 넣은 것
Human안녕하세요?
→
chat 노드가 돌려준 것
AI안녕하세요, 반갑습니다.
→
칠판 (결과)
AI안녕하세요, 반갑습니다.
메시지 1개
챗봇이 내가 뭘 물어봤는지 잊어버리는 거예요. 그래서 대화를 담는 칸에는 꼭 add_messages를 붙여요.
기억할 것 세 가지
- 리듀서 = 적는 규칙. 노드는 "새로 쓸 것"만 돌려주고, 어떻게 적을지는 리듀서가 정해요.
- 규칙을 안 정하면 칠판(덮어쓰기)이에요.
hello_graph.py에서clean노드가user_input을 바꿔 쓴 게 바로 이거예요. - 실행할 때마다 새 공책이에요. 이어 쓰기는 한 번 실행하는 동안만 돼요. 다음 실행에서 이어 쓰려면 이전 메시지를 직접 넘겨줘야 해요. 그래프가 알아서 기억하게 하려면 체크포인터라는 기능을 써요.