18장 · 그래프 기반 워크플로우왜 그래프가 필요한가 — if문이 뒤엉키기 시작한다상태·노드·엣지 — 그래프를 이루는 세 가지그래프 조립과 실행 — 등록하고, 잇고, 굳히고, 돌린다따라하기 — 첫 상태 그래프정리와 체크리스트실습문제와 해답
18장. 그래프 기반 워크플로우
정리와 체크리스트
18장에서 배운 것
- 오케스트레이션 — 부품과 에이전트를 엮어 하나의 흐름으로 일하게 만드는 일. STEP 7(18~24장)의 주제입니다.
- 상태 그래프 — 흐름을 상태·노드·엣지로 선언한 구조. LangGraph로 만듭니다.
- 상태(State) — 흐름이 함께 보는 데이터.
TypedDict로 칸을 선언합니다. - 노드(Node) — 상태를 받아 바뀐 칸만 돌려주는 함수.
- 엣지(Edge) — 노드 사이의 길.
START에서 시작해END에서 끝납니다. - 덮어쓰기 — 반환값을 상태에 합치는 기본 규칙. 쌓을 칸은 이어 붙여 돌려줍니다.
- compile / invoke — 그래프를 실행할 수 있게 굳히는 것 / 처음 상태를 넣어 실행하는 것.
- 체크포인트 — 실행 상태를 저장해 두었다가 이어 가는 기능. 23장에서 씁니다.
한눈에 보는 핵심
class CSState(TypedDict): # 1. 상태: 함께 보는 데이터
question: str
answer: str
log: list[str]
def answer_node(state: CSState) -> dict: # 2. 노드: 바뀐 칸만 돌려준다
return {"answer": "...", "log": state["log"] + ["응답 생성 완료"]}
builder = StateGraph(CSState) # 3. 조립: 등록하고 잇는다
builder.add_node("answer", answer_node)
builder.add_edge(START, "answer")
builder.add_edge("answer", END)
graph = builder.compile() # 4. 굳히고
result = graph.invoke({"question": "...", "answer": "", "log": []}) # 5. 돌린다
| if문으로 엮은 흐름 | 상태 그래프 | |
|---|---|---|
| 흐름을 알려면 | 코드를 처음부터 읽는다 | 엣지 선언을 본다. 그림으로 뽑는다 |
| 한 단계만 시험하려면 | 떼어 내기 어렵다 | 노드는 함수다. 딕셔너리를 넣어 부른다 |
| 한 단계를 바꾸려면 | 다른 갈래에 영향이 없는지 확인해야 한다 | 그 이름에 다른 함수를 등록한다 |
| 코드의 길이 | 짧다 | 선언하는 줄이 더 든다 |
체크리스트
- [ ] if문으로 엮은 흐름의 문제 세 가지를 말할 수 있다.
- [ ] 상태·노드·엣지가 각각 무엇인지 순서도에 빗대어 설명할 수 있다.
- [ ] 노드가 상태 전체가 아니라 바뀐 칸만 돌려주는 이유를 설명할 수 있다.
- [ ]
log를state["log"] + [...]로 돌려주는 이유를 덮어쓰기 규칙으로 설명할 수 있다. - [ ]
compile()없이 실행할 수 없다는 것,invoke()에 무엇을 넣는지 안다. - [ ] 그래프 그림의 화살표와
add_edge선언을 하나씩 맞춰 볼 수 있다. - [ ] 이번 실행의 금액이 어느 노드에서 무엇을 근거로 나왔는지, 답하는 방식을 바꾸려면 무엇을 교체하는지 말할 수 있다.
- [ ] 이번 장의 코드가 4장의 어느 파일에 기대고 있는지 안다.
- [ ] 흐름이 단순할 때와 복잡할 때, if문과 그래프 가운데 무엇을 고를지 말할 수 있다.
한 줄 핵심
그래프는 답을 똑똑하게 만드는 도구가 아닙니다. 흐름을 눈에 보이게 하고, 바꿀 곳을 노드 하나로 좁혀 주는 구조입니다.