[LangGraph] Command

Hunie_07·2025년 4월 7일
0

Langchain

목록 보기
17/35

[LangGraph] StateGraph 에서 이어집니다.

📌 LangGraph - Command

1️⃣ Command

  • Command 객체는 LangGraph의 핵심 제어 도구로, 노드 함수의 반환값으로 사용

  • 상태 관리와 흐름 제어를 동시에 수행할 수 있어 효율적인 그래프 운영이 가능

  • 그래프의 상태를 동적으로 업데이트하면서 다음 실행할 노드를 지정할 수 있음

    1. 상태 업데이트: 그래프의 상태(State)를 변경 (예: 새로운 정보를 추가하거나 기존 정보를 수정)
    2. 제어 흐름: 다음에 실행할 노드를 지정 가능

1. StateGraph 수정

  1. check_summary_quality 함수를 제거하고 해당 로직을 generate_summary 노드에 통합

  2. 각 노드가 Command 객체를 반환하도록 수정

    • goto: 다음에 실행할 노드 지정
    • update: 상태 업데이트 내용 지정
  3. 조건부 엣지 대신 Command를 통한 라우팅을 사용

    • 품질 평가에 따라 generate_summary에서 improve_summary 또는 finalize_summary로 라우팅
    • improve_summaryfinalize_summary는 모두 END로 라우팅
  4. 엣지 설정을 단순화

    • START에서 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)은 인간의 학습, 추론, 지각, 자연어 이해능력을 컴퓨터 프로그램으로 구현한 기술이며, 최근 기계학습과 '
            '딥러닝의 발전으로 다양한 분야에 활용되고 있다.'}
====================================================================================================

0개의 댓글