LangGraph를 활용한 AI Agent 강의를 들으면서 LangGraph를 학습중이다.
## 🧩 전체 실습 개요
이번 실습에서는 단순히 “문서 검색 + 답변 생성”을 넘어서,
**LangGraph를 활용한 상태(State) 기반 RAG 파이프라인**을 직접 구성해보았다.
전체 흐름은 다음과 같다.
1. 국세청 홈페이지에서 소득세 법령 PDF 다운로드
2. PDF → `.txt`, `.md`로 변환 후 `documents/` 디렉토리에 저장
3. 텍스트 분할(Text Split)
4. 임베딩 생성 후 Chroma Vector DB 저장
5. Retriever 생성
6. LangGraph로 Retrieve → Generate 흐름 구성
7. 질문을 입력하면 상태(state)를 따라 응답 생성
- k=3 → 가장 관련도 높은 문서 3개 검색
- 질문과 가장 유사한 법령 조항을 Retriever가 반환
👉 여기까지는 검색 단계
🧠 3. LangGraph를 위한 State 정의
LangGraph는 상태(State)를 중심으로 동작한다.
from typing_extensions import List, TypedDict
from langchain_core.documents import Document
class AgentState(TypedDict):
query: str
context: List[Document]
answer: str
State 구성
- query : 사용자 질문
- context : Retriever가 검색한 문서
- answer : 최종 LLM 응답
LangGraph는 이 State를 노드 간에 전달하며 흐름을 제어한다.
🔗 4. Retrieve 노드 구현
def retrieve(state: AgentState) -> AgentState:
query = state['query']
docs = retriever.invoke(query)
return {'context': docs}
- 입력: 사용자 질문
- 출력: 관련 문서 목록
👉 벡터 스토어 검색만 담당하는 노드
🤖 5. Generate 노드 구현 (RAG 핵심)
langchain 1.2.0 기준으로 from langchain import hub는 동작하지 않아,
langsmith.Client()로 프롬프트를 가져오는 방식으로 진행했다.
from langsmith import Client
from langchain_openai import ChatOpenAI
client = Client()
prompt = client.pull_prompt("rlm/rag-prompt")
llm = ChatOpenAI(model="gpt-4o")
def generate(state: AgentState) -> AgentState:
context = state['context']
query = state['query']
rag_chain = prompt | llm
response = rag_chain.invoke({
'question': query,
'context': context
})
return {'answer': response}
핵심 포인트
- rlm/rag-prompt : 표준 RAG 프롬프트
- Retriever 결과(context)를 LLM 입력에 포함
- 법령 근거 기반 답변 생성
🧱 6. LangGraph로 파이프라인 구성
Graph 정의
from langgraph.graph import StateGraph
graph_builder = StateGraph(AgentState)
graph_builder.add_node('retrieve', retrieve)
graph_builder.add_node('generate', generate)
Edge 연결
from langgraph.graph import START, END
graph_builder.add_edge(START, 'retrieve')
graph_builder.add_edge('retrieve', 'generate')
graph_builder.add_edge('generate', END)
컴파일
graph = graph_builder.compile()
실행 흐름은 다음과 같다.
START → retrieve → generate → END
🖼️ 7. Graph 시각화
from IPython.display import Image, display
display(Image(graph.get_graph().draw_mermaid_png()))
LangGraph의 장점:
- 실행 흐름을 시각적으로 확인 가능
- 복잡한 에이전트 구조로 확장하기 쉬움

▶️ 8. 실행
initial_state = {'query': query}
graph.invoke(initial_state)
- 입력: 사용자 질문
- 출력: 소득세 법령을 근거로 한 답변
🧠 정리하며 느낀 핵심 포인트
단순 RAG vs LangGraph RAG
구분차이
| 일반 RAG | 체인 기반, 순서 고정 |
| LangGraph | 상태 기반, 확장 가능 |
LangGraph의 강점
- 상태(State) 중심 설계
- 조건 분기, 반복, 멀티 에이전트 확장 용이
- 실제 Agent 시스템 구조에 가까움
✨ 마무리
이번 실습을 통해:
- 법령 같은 긴 문서도 RAG로 충분히 다룰 수 있고
- LangGraph를 활용하면 검색 + 생성 그 이상의 구조적인 에이전트 설계가 가능하다는 점을 체감했다.
다음 단계로는:
- 계산 도구 추가
- 조건 분기 그래프
- Multi-hop Retrieval
- Tool Calling 연계
같은 확장이 자연스럽게 이어질 것 같다.
'Python > LangGraph' 카테고리의 다른 글
| LangGraph 첫 실습: LangChain에서 그래프로 사고하기 (0) | 2026.01.02 |
|---|