Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion 01-QuickStart/01-QuickStart-LangGraph-Tutorial.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -1744,6 +1744,11 @@
"런타임 파라미터 수정은 재실행 비용을 줄이면서 최적화를 빠르게 검증할 수 있습니다."
]
},
{
"cell_type": "markdown",
"source": "---\n\n# 📚 학습 정리 및 핵심 요약\n\n## 🎯 이 튜토리얼에서 배운 내용\n\n이 노트북을 통해 **LangGraph의 핵심 개념과 실전 패턴**을 모두 경험했습니다. 아래는 각 파트별 핵심 내용입니다.\n\n---\n\n### Part 1: 기본 챗봇 구축 🤖\n\n**배운 개념:**\n- `StateGraph`: 대화 흐름을 정의하는 그래프 구조\n- `State`: 메시지와 컨텍스트를 저장하는 타입 정의\n- `add_messages`: 메시지를 누적하는 리듀서 함수\n- 노드(Node)와 엣지(Edge)의 기본 구조\n\n**핵심 코드 패턴:**\n```python\nclass State(TypedDict):\n messages: Annotated[list, add_messages]\n\ngraph_builder = StateGraph(State)\ngraph_builder.add_node(\"chatbot\", chatbot_function)\ngraph_builder.add_edge(START, \"chatbot\")\ngraph_builder.add_edge(\"chatbot\", END)\ngraph = graph_builder.compile()\n```\n\n**실무 적용:**\n- 기본적인 대화형 챗봇 구현\n- 메시지 기반 워크플로우 설계\n\n---\n\n### Part 2: 도구(Tools) 추가 🔧\n\n**배운 개념:**\n- `bind_tools`: LLM에 도구 사용 능력 부여\n- `ToolNode`: 외부 API/함수 호출을 담당하는 노드\n- `tools_condition`: 도구 사용 여부를 판단하는 조건부 라우팅\n- 도구 호출과 결과 처리 루프\n\n**핵심 코드 패턴:**\n```python\nllm_with_tools = llm.bind_tools([tool1, tool2])\ntool_node = ToolNode(tools=[tool1, tool2])\n\nbuilder.add_conditional_edges(\"chatbot\", tools_condition)\nbuilder.add_edge(\"tools\", \"chatbot\")\n```\n\n**실무 적용:**\n- 검색 엔진 연동 (Tavily, Google 등)\n- 외부 API 호출 (날씨, 뉴스, 데이터베이스 등)\n- 함수 호출 기반 작업 자동화\n\n---\n\n### Part 3: 메모리 추가 💾\n\n**배운 개념:**\n- `Checkpointer`: 대화 상태를 저장/복원하는 메커니즘\n- `thread_id`: 세션을 구분하는 식별자\n- `InMemoryStore`: 장기 기억을 위한 키-밸류 저장소\n- `remember` 키워드 기반 메모리 추출 패턴\n\n**핵심 코드 패턴:**\n```python\nmemory_saver = InMemorySaver()\nmemory_store = InMemoryStore()\n\ngraph = builder.compile(\n checkpointer=memory_saver,\n store=memory_store\n)\n\nconfig = {\"configurable\": {\"thread_id\": \"session-1\", \"user_id\": \"user-1\"}}\n```\n\n**실무 적용:**\n- 사용자별 개인화 챗봇\n- 세션 관리 시스템\n- 컨텍스트 유지가 중요한 긴 대화\n\n---\n\n### Part 4: Human-in-the-Loop 🙋\n\n**배운 개념:**\n- `interrupt`: 실행을 중단하고 인간 개입 요청\n- `Command(resume=...)`: 중단된 실행 재개\n- 승인 기반 워크플로우\n- 체크포인트 기반 상태 관리\n\n**핵심 코드 패턴:**\n```python\n@tool\ndef human_assistance(query: str) -> str:\n human_response = interrupt({\"query\": query})\n return human_response[\"data\"]\n\n# 재개\ngraph.invoke(Command(resume={\"data\": \"승인 내용\"}), config)\n```\n\n**실무 적용:**\n- 금융 거래 승인\n- 중요 이메일 발송 전 검토\n- 의료/법률 조언 검증\n- 민감한 작업의 최종 확인\n\n---\n\n### Part 5: 상태 커스터마이징 🎨\n\n**배운 개념:**\n- 커스텀 State 필드 추가\n- 도구에서 `Command(update=...)`로 상태 업데이트\n- `InjectedToolCallId`를 통한 도구 호출 추적\n- 도메인 특화 상태 설계\n\n**핵심 코드 패턴:**\n```python\nclass CustomState(TypedDict):\n messages: Annotated[list, add_messages]\n custom_field: str\n metadata: dict\n\n@tool\ndef custom_tool(data, tool_call_id: Annotated[str, InjectedToolCallId]):\n return Command(\n update={\"messages\": [ToolMessage(result, tool_call_id=tool_call_id)]}\n )\n```\n\n**실무 적용:**\n- 복잡한 비즈니스 로직 구현\n- 다단계 승인 프로세스\n- 작업 추적 및 모니터링\n\n---\n\n### Part 6: 상태 이력 관리 ⏰\n\n**배운 개념:**\n- `get_state_history`: 체크포인트 이력 조회\n- `update_state`: 특정 시점의 상태 수정\n- 시간 여행(Time Travel) 패턴\n- A/B 테스트 및 재실행 전략\n\n**핵심 코드 패턴:**\n```python\n# 이력 조회\nfor state in graph.get_state_history(config):\n print(state.config['configurable']['checkpoint_id'])\n\n# 상태 수정 후 재실행\ngraph.update_state(values={\"messages\": [modified_message]}, config=old_config)\ngraph.invoke(None, config=updated_config)\n```\n\n**실무 적용:**\n- 디버깅 및 문제 추적\n- 실험적인 프롬프트 최적화\n- 오류 복구 및 재시도\n- 사용자 피드백 기반 개선\n\n---\n\n## 🔑 핵심 개념 정리\n\n### 1. StateGraph의 구성 요소\n- **State**: 데이터 구조 정의\n- **Node**: 작업을 수행하는 함수\n- **Edge**: 실행 흐름 연결\n- **Conditional Edge**: 조건부 분기\n\n### 2. 메모리 관리 계층\n- **단기 메모리**: Thread 단위 (Checkpointer)\n- **장기 메모리**: User 단위 (Store)\n- **세션 관리**: thread_id + user_id\n\n### 3. 실행 제어 패턴\n- **순차 실행**: `add_edge(A, B)`\n- **조건 분기**: `add_conditional_edges(node, condition_func)`\n- **일시 중단**: `interrupt()`\n- **재개**: `Command(resume=...)`\n\n### 4. 상태 업데이트 방식\n- **함수 반환**: `return {\"key\": value}`\n- **Command 객체**: `Command(update={...})`\n- **외부 수정**: `graph.update_state(...)`\n\n---\n\n## 💡 실무 활용 시나리오\n\n### 시나리오 1: 고객 지원 챗봇\n```\n기본 챗봇 + 검색 도구 + 메모리 + 에스컬레이션(HITL)\n→ 고객 정보 기억, 지식베이스 검색, 복잡한 문의는 상담원 연결\n```\n\n### 시나리오 2: 문서 생성 어시스턴트\n```\n도구 통합 + 상태 커스터마이징 + HITL\n→ 초안 작성, 검토 요청, 수정 반영, 최종 승인\n```\n\n### 시나리오 3: 데이터 분석 에이전트\n```\n도구 체인 + 메모리 + 상태 이력\n→ 데이터 수집, 분석, 시각화, 결과 검증, 재분석\n```\n\n---\n\n## 🚀 다음 학습 방향\n\n### 심화 학습\n1. **Graph API**: 더 복잡한 그래프 구조 설계\n2. **Subgraph**: 모듈화된 워크플로우 구성\n3. **Multi-Agent**: 여러 에이전트 협업 시스템\n4. **RAG 통합**: 검색 증강 생성 패턴\n\n### 실전 프로젝트\n1. 도메인 특화 챗봇 구축\n2. 자동화 워크플로우 시스템\n3. 의사결정 지원 도구\n4. 지식 관리 시스템\n\n---\n\n## 📌 체크리스트\n\n이 튜토리얼을 완료했다면 다음을 할 수 있어야 합니다:\n\n- ✅ StateGraph로 기본 대화 흐름 구현\n- ✅ 외부 도구를 연동하고 조건부 라우팅 설정\n- ✅ Checkpointer와 Store로 메모리 관리\n- ✅ interrupt로 인간 개입 지점 구현\n- ✅ 커스텀 State와 Command로 복잡한 상태 관리\n- ✅ 상태 이력 조회 및 시간 여행 패턴 활용\n\n---\n\n## 🎓 마무리\n\n**축하합니다!** 🎉\n\nLangGraph의 핵심 기능을 모두 학습했습니다. 이제 실제 프로젝트에 적용할 준비가 되었습니다.\n\n**기억할 점:**\n- 작게 시작하고 점진적으로 확장하세요\n- 각 컴포넌트를 독립적으로 테스트하세요\n- 상태 설계를 신중하게 하세요\n- 체크포인트를 적극 활용하세요\n\n**다음 단계:**\n1. 실제 유스케이스를 선택하세요\n2. 간단한 프로토타입부터 시작하세요\n3. 점진적으로 기능을 추가하세요\n4. 커뮤니티와 경험을 공유하세요\n\n**행운을 빕니다!** 🚀",
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
Expand Down Expand Up @@ -1852,4 +1857,4 @@
},
"nbformat": 4,
"nbformat_minor": 4
}
}