Command 객체는 LangGraph의 핵심 제어 도구로, 노드 함수의 반환값으로 사용
상태 관리와 흐름 제어를 동시에 수행할 수 있어 효율적인 그래프 운영이 가능
그래프의 상태를 동적으로 업데이트하면서 다음 실행할 노드를 지정할 수 있음
check_summary_quality
함수를 제거하고 해당 로직을 generate_summary
노드에 통합
각 노드가 Command
객체를 반환하도록 수정
goto
: 다음에 실행할 노드 지정update
: 상태 업데이트 내용 지정조건부 엣지 대신 Command
를 통한 라우팅을 사용
generate_summary
에서 improve_summary
또는 finalize_summary
로 라우팅improve_summary
와 finalize_summary
는 모두 END로 라우팅엣지 설정을 단순화
generate_summary
로의 엣지만 명시적으로 정의Command
를 통해 처리from typing import TypedDict, Literal
from langgraph.graph import StateGraph, START, END
from langgraph.types import Command
from langchain_openai import ChatOpenAI
# 상태 정의
class State(TypedDict):
original_text: str # 원본 텍스트
summary: str # 요약본
final_summary: str # 최종 요약본
# LLM 인스턴스 생성
summary_llm = ChatOpenAI(model="gpt-4o-mini") # 요약에 사용할 모델
eval_llm = ChatOpenAI(model="gpt-4o") # 품질 평가에 사용할 모델
# 요약 생성 노드
def generate_summary(state: State) -> Command[Literal["improve_summary", "finalize_summary"]]:
"""원본 텍스트를 요약하고 품질을 평가하는 노드"""
# 요약 생성
summary_prompt = f"""다음 텍스트를 핵심 내용 중심으로 간단히 요약해주세요:
[텍스트]
{state['original_text']}
[요약]
"""
summary = summary_llm.invoke(summary_prompt).content
# 품질 평가
eval_prompt = f"""다음 요약의 품질을 평가해주세요.
요약이 명확하고 핵심을 잘 전달하면 'good'을,
개선이 필요하면 'needs_improvement'를 응답해주세요.
요약본: {summary}
"""
quality = eval_llm.invoke(eval_prompt).content.lower().strip()
# 상태 업데이트와 함께 다음 노드로 라우팅
return Command(
goto="finalize_summary" if "good" in quality else "improve_summary",
update={"summary": summary}
)
# 요약 개선 노드
def improve_summary(state: State) -> Command[Literal[END]]:
"""요약을 개선하고 다듬는 노드"""
prompt = f"""다음 요약을 더 명확하고 간결하게 개선해주세요:
[기존 요약]
{state['summary']}
[개선 요약]
"""
improved_summary = llm.invoke(prompt).content
# 상태 업데이트와 함께 다음 노드로 라우팅
return Command(
goto=END,
update={"final_summary": improved_summary}
)
# 최종 요약 설정 노드
def finalize_summary(state: State) -> Command[Literal[END]]:
"""현재 요약을 최종 요약으로 설정하는 노드"""
# 상태 업데이트와 함께 다음 노드로 라우팅
return Command(
goto=END,
update={"final_summary": state["summary"]}
)
Command
vs. 조건부 엣지(Conditional Edges)
Command는 상태 업데이트와 노드 이동을 동시에 처리할 때 사용되며, 특히 정보 전달이 필요한 복잡한 전환에 적합
조건부 엣지는 단순한 분기 처리에 사용되며, 상태 변경 없이 조건에 따른 이동만 수행
두 방식의 선택 기준은 상태 업데이트 필요 여부에 따라 결정
# 워크플로우 구성
workflow = StateGraph(State)
# 노드 추가
workflow.add_node("generate_summary", generate_summary)
workflow.add_node("improve_summary", improve_summary)
workflow.add_node("finalize_summary", finalize_summary)
# 기본 엣지 추가
workflow.add_edge(START, "generate_summary")
# 그래프 컴파일
graph = workflow.compile()
# 그래프 시각화
display(Image(graph.get_graph().draw_mermaid_png()))
- 출력
# 그래프 실행 및 결과 확인
text = """
인공지능(AI)은 컴퓨터 과학의 한 분야로, 인간의 학습능력과 추론능력, 지각능력,
자연언어의 이해능력 등을 컴퓨터 프로그램으로 실현한 기술이다.
최근에는 기계학습과 딥러닝의 발전으로 다양한 분야에서 활용되고 있다.
"""
initial_state = {
"original_text": text,
}
for chunk in graph.stream(initial_state, stream_mode="values"):
pprint(chunk)
print("=" * 100)
- 출력
{'original_text': '\n'
'인공지능(AI)은 컴퓨터 과학의 한 분야로, 인간의 학습능력과 추론능력, 지각능력,\n'
'자연언어의 이해능력 등을 컴퓨터 프로그램으로 실현한 기술이다.\n'
'최근에는 기계학습과 딥러닝의 발전으로 다양한 분야에서 활용되고 있다.\n'}
====================================================================================================
{'original_text': '\n'
'인공지능(AI)은 컴퓨터 과학의 한 분야로, 인간의 학습능력과 추론능력, 지각능력,\n'
'자연언어의 이해능력 등을 컴퓨터 프로그램으로 실현한 기술이다.\n'
'최근에는 기계학습과 딥러닝의 발전으로 다양한 분야에서 활용되고 있다.\n',
'summary': '인공지능(AI)은 인간의 학습, 추론, 지각, 자연어 이해능력을 컴퓨터 프로그램으로 구현한 기술이며, 최근 기계학습과 '
'딥러닝의 발전으로 다양한 분야에 활용되고 있다.'}
====================================================================================================
{'final_summary': '인공지능(AI)은 인간의 학습, 추론, 지각, 자연어 이해능력을 컴퓨터 프로그램으로 구현한 기술이며, 최근 '
'기계학습과 딥러닝의 발전으로 다양한 분야에 활용되고 있다.',
'original_text': '\n'
'인공지능(AI)은 컴퓨터 과학의 한 분야로, 인간의 학습능력과 추론능력, 지각능력,\n'
'자연언어의 이해능력 등을 컴퓨터 프로그램으로 실현한 기술이다.\n'
'최근에는 기계학습과 딥러닝의 발전으로 다양한 분야에서 활용되고 있다.\n',
'summary': '인공지능(AI)은 인간의 학습, 추론, 지각, 자연어 이해능력을 컴퓨터 프로그램으로 구현한 기술이며, 최근 기계학습과 '
'딥러닝의 발전으로 다양한 분야에 활용되고 있다.'}
====================================================================================================