diff --git a/01-QuickStart/01-QuickStart-LangGraph-Tutorial.ipynb b/01-QuickStart/01-QuickStart-LangGraph-Tutorial.ipynb index 3780851..f1b8585 100644 --- a/01-QuickStart/01-QuickStart-LangGraph-Tutorial.ipynb +++ b/01-QuickStart/01-QuickStart-LangGraph-Tutorial.ipynb @@ -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, @@ -1852,4 +1857,4 @@ }, "nbformat": 4, "nbformat_minor": 4 -} +} \ No newline at end of file