LangGraph를 코드로 체화하기
오늘은 LangGraph의 개념을 이해했다면, 다음 공부의 목표는 명확하다. State, Node, Edge를 실제 코드로 만들어보고, 단순 라우터 구조에서 RAG Loop 구조까지 확장하는 것이다.
1. 다음 공부의 핵심 목표
다음 학습은 “LangGraph를 이해한다”에서 끝내지 않고, 작은 Agent를 직접 만들어보며 운영 가능한 구조 감각을 익히는 데 초점을 둔다.
사용자 질문을 State에 담고, Node를 거치며 값이 어떻게 변하는지 확인한다.
질문 유형에 따라 weather, qa, chat 흐름으로 분기하는 구조를 만든다.
검색 결과가 부족하면 질문을 재작성하고 다시 검색하는 반복 흐름을 만든다.
2. 1차 실습: Router Agent 만들기
첫 번째 실습은 가장 단순한 Router Agent다. 사용자의 질문을 입력받고, 질문 유형을 분류한 뒤 알맞은 Node로 보내는 구조를 만든다.
처음 만들 Agent의 범위
-
1weather 질문 날씨, 날짜, 위치가 포함된 질문을 weather_node로 보낸다.
-
2qa 질문 정보 검색이나 문서 기반 답변이 필요한 질문을 qa_node로 보낸다.
-
3chat 질문 일상 대화, 의견, 짧은 응답은 chat_node로 보낸다.
class AgentState(TypedDict):
user_query: str
chat_type: str
final_answer: str
error: str | None
3. 2차 실습: RAG Loop 만들기
Router 구조가 익숙해지면 다음 단계는 RAG Loop다. 단순히 검색하고 답변하는 구조가 아니라, 검색 결과가 충분한지 평가하고 부족하면 다시 검색하는 구조를 만든다.
검색 결과가 질문과 관련 있는지, 답변에 충분한지 판단한다.
바로 답변하지 않고 질문을 재작성한 뒤 다시 검색한다.
Retrieve
↓
Grade Documents
↓
Is Enough?
├─ Yes → Generate Answer
└─ No → Rewrite Query → Retrieve Again
4. 단계별 실행 계획
langgraph, langchain, langchain-openai 등 필요한 패키지를 설치하고 기본 실행 환경을 만든다.
처음부터 많은 값을 넣지 않고 user_query, chat_type, final_answer, error 정도로 작게 시작한다.
classify_intent, weather_node, qa_node, chat_node, generate_answer처럼 책임을 작게 나눈다.
chat_type 값에 따라 다음 Node를 선택하도록 조건부 Edge를 연결한다.
retrieve, grade_documents, rewrite_query, generate_answer Node를 추가해 반복 구조를 만든다.
5. 실수하기 쉬운 지점
-
!State를 처음부터 크게 설계하는 것 처음에는 작게 시작해야 한다. State가 커지면 Node 책임도 흐려진다.
-
!Node 하나에 여러 책임을 넣는 것 분류, 검색, 답변 생성을 한 함수에 넣으면 LangGraph를 쓰는 의미가 약해진다.
-
!성공 흐름만 만드는 것 운영 가능한 Agent는 실패했을 때 어디로 갈지까지 설계해야 한다.
-
!LLM에게 모든 판단을 맡기는 것 LLM은 Node 안에서 필요한 판단만 맡고, 전체 흐름은 Graph가 통제해야 한다.
6. 다음 공부의 완료 기준
공부가 끝났다고 말하려면 개념을 읽는 것보다, 아래 결과물을 직접 만들어봐야 한다.
-
✓질문 유형에 따라 다른 Node로 분기된다 weather, qa, chat 중 하나로 안정적으로 이동해야 한다.
-
✓각 Node가 State를 읽고 수정한다 Node의 입력과 출력이 State 중심으로 이해되어야 한다.
-
✓검색 결과 부족 시 재검색 Loop가 돈다 RAG가 검색 후 답변이 아니라 검색, 평가, 재검색, 답변 구조로 동작해야 한다.
-
✓실패 흐름이 코드에 드러난다 error, fallback, retry 흐름이 프롬프트가 아니라 그래프 구조로 표현되어야 한다.