17차시. LangGraph 입문
실습 1 — LangGraph 입문 실습 따라 하기
관련 수업 자료: 17차시 「실제 코드로 만들어보기」(7~9쪽), 17차시 「Graph를 그림으로 보기」(11~12쪽) · 실습 코드 17/설치확인.py, 17/simple_graph.py, 17/conditional_graph.py, 17/visual_graph.py
이 실습은 교안 해설(17_LangGraph입문.md)의 실습 순서를 옮긴 것입니다. OpenAI 임베딩이나 채팅 모델을 부르는 파일은 .env 에 API 키가 있어야 돌아갑니다. 키가 없으면 실행 결과 샘플로 출력 모양을 확인합니다.
수업 자료와 이어지는 곳
| 실습 코드 | 원본 PDF | 이어지는 내용 |
|---|---|---|
17/설치확인.py | - | 원본 PDF 에 짝이 되는 쪽이 없어 이 페이지 아래에 실었습니다 |
17/simple_graph.py | 8쪽 | 17차시 「실제 코드로 만들어보기」 › Step 3: Graph 만들기 아래에 실었습니다 |
17/conditional_graph.py | 8쪽 | 17차시 「실제 코드로 만들어보기」 › Step 3: Graph 만들기 아래에 실었습니다 |
17/visual_graph.py | 11~12쪽 | 17차시 「Graph를 그림으로 보기」 아래에 실었습니다 |
실행 흐름
START → 검색 노드
검색 노드 → 결과 있나
결과 있나 → 답변 노드 (있다)
결과 있나 → 다시 또는 안내 (없다)
답변 노드 → END
다시 또는 안내 → END실습 순서
실습/src/17에서 python 설치확인.py, python simple_graph.py, python conditional_graph.py를 실행합니다. 조건 분기의 실제 출력은 파일 하단 샘플과 같습니다.
스스로 확인
- 노드와 엣지를 함수와 호출 순서로 말할 수 있는가?
- State를 공유 딕셔너리로 설명할 수 있는가?
- 조건부 분기가 if를 그래프 밖으로 꺼낸 것이라는 점을 아는가?
이어지는 실습 코드
실습 코드 · 17/설치확인.py
실습 코드: 실습/src/17/설치확인.py · 원본 PDF 에 같은 이름의 쪽이 없어 여기에 실었습니다.
# ============================================================
# 17차시 | LangGraph 입문
# 교안: 17차시_LangGraph입문.pptx
# 역할: LangGraph 패키지를 불러와 설치가 되었는지 확인한다.
# 입력: 없음
# 출력: 설치 완료 한 줄
#
# 이 파일에는 그래프가 없다.
# 다음 파일부터 쓰는 말:
# State = 노드들이 함께 고치는 공용 딕셔너리. 공유 노트.
# Node = 그 노트를 읽고, 고친 칸만 돌려주는 함수.
# Edge = 한 함수가 끝난 뒤 다음에 호출할 함수. 다음 단계.
# START = 시작 표시. END = 끝 표시.
# compile = 연결을 확정해서 실행 가능한 앱으로 만든다.
# invoke = 처음 노트를 넣고 END까지 한 번에 실행한다.
#
# 흐름
# (그래프 없음) import → print
# ============================================================
from langgraph import graph
print("LangGraph 설치 완료!")실행 결과 샘플 (교안 기록. API 키가 필요한 코드는 키 없이 맞춘 예시이고, 모델의 답은 실행할 때마다 달라집니다)
===== 실행 결과 샘플 =====
실행: cd 실습/src/17
python 설치확인.py
(실제 실행 출력)
LangGraph 설치 완료!코드 해설
LangGraph 패키지를 불러와 설치가 되었는지 확인한다. 입력은 없음이고, 출력은 설치 완료 한 줄입니다.
주석에 적힌 흐름입니다.
흐름
(그래프 없음) import → print코드 앞에서 고정해 두는 말입니다.
- 17차시 | LangGraph 입문
- 교안: 17차시_LangGraph입문.pptx
- 이 파일에는 그래프가 없다.
- 다음 파일부터 쓰는 말:
- State = 노드들이 함께 고치는 공용 딕셔너리. 공유 노트.
- Node = 그 노트를 읽고, 고친 칸만 돌려주는 함수.
- Edge = 한 함수가 끝난 뒤 다음에 호출할 함수. 다음 단계.
- START = 시작 표시. END = 끝 표시.
파일 맨 아래 실행 결과 샘플 주석은 실행되지 않습니다. 화면 출력은 다음 절에 다시 적어 두었습니다.
코드 설명
return {"results": results}처럼 노드는 바꾼 칸만 돌려줍니다. 원본 PDF Step 2 의state["results"] = results; return state도 돌아가지만, 실습 코드는 바꾼 칸만 돌려주는 쪽으로 씁니다. 18차시에서 그 까닭을 다룹니다.graph.add_node("search", search_node)의 첫 인자가 노드 이름입니다.add_edge와 조건부 엣지의 표는 함수가 아니라 이 이름을 가리킵니다. 이름 철자가 다르면 컴파일에서 오류가 납니다.add_edge(START, "search")와add_edge("answer", END)는 원본 PDF 의set_entry_point,set_finish_point와 같은 일을 합니다. 실습 코드는 START, END 쪽을 씁니다.check_search_quality는 노드가 아닙니다. State를 고치지 않고 "good" 이나 "bad" 라는 이름만 돌려주며,add_conditional_edges의 표가 그 이름을 실제 노드로 바꿉니다.- conditional_graph.py 는 질문에 '가격'이 없어 결과가 늘 비므로 search 로 계속 돌아갑니다.
{"recursion_limit" : 10}에 걸려GraphRecursionError가 나고, except 에서 안내 문장으로 끝납니다. 되돌아가는 길을 만들면 상한도 함께 두셔야 합니다. - visual_graph.py 의
get_graph().draw_mermaid_png()는 compile 한 앱에서 부릅니다. 원본 PDF 는graph.get_graph()로 적었지만 실습 코드는app.get_graph()입니다. 창을 띄우는 파일이라 교안에서는 실행 결과 샘플만 실었습니다.