day3_practice/reducer.py

리듀서는 "적는 규칙"이에요

노드가 새 값을 돌려주면, 그 값을 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를 붙여요.

기억할 것 세 가지