Conditional Edge

2026. 2. 22. 16:25·AI/LangGraph
반응형


❓Conditional Edge 만들기

 

1️⃣ 기존 간단한 그래프

graph_builder.add_node('retrieve', retrieve)
graph_builder.add_node('generate', generate)

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()

 

2️⃣ Conditional Edge가 있는 그래프

여기서 중요한 점은, 기존 노드와 차이점을 알아야한다.

 

  • 기존 노드의 리턴은 State다.
  • 기존 노드는 .add_node를 통해 등록된다.
  • Conditional Edge에 사용되는 노드에 일반적으로 등록되지 않는다.
  • Conditional Edge에 사용되는 노드는 State가 아닌 노드이름을 리턴한다.
from langchain import hub
from typing import Literal

def check_doc_relevance(state: AgentState) -> Literal['generate', 'rewrite']:
    """
    주어진 state를 기반으로 문서의 관련성을 판단합니다.

    Args:
        state (AgentState): 사용자의 질문과 문맥을 포함한 에이전트의 현재 state.

    Returns:
        Literal['generate', 'rewrite']: 문서가 관련성이 높으면 'generate', 그렇지 않으면 'rewrite'를 반환합니다.
    """
    query = state['query']  # state에서 사용자의 질문을 추출합니다.
    context = state['context']  # state에서 문맥을 추출합니다.

    # 문서 관련성 판단 체인을 구성합니다.
    doc_relevance_chain = doc_relevance_prompt | llm
    
    # 질문과 문맥을 사용하여 문서의 관련성을 판단합니다.
    response = doc_relevance_chain.invoke({'question': query, 'documents': context})

    # 관련성이 높으면 'generate'를 반환하고, 그렇지 않으면 'rewrite'를 반환합니다.
    if response['Score'] == 1:
        return 'generate'
    
    return 'rewrite'
graph_builder.add_node('retrieve', retrieve)
graph_builder.add_node('generate', generate)
graph_builder.add_node('rewrite', rewrite)

# check_doc_relevance 노드 등록 ❌


from langgraph.graph import START, END

graph_builder.add_edge(START, 'retrieve')
graph_builder.add_conditional_edges('retrieve', check_doc_relevance) # conditional_edge 등록
graph_builder.add_edge('rewrite', 'retrieve')
graph_builder.add_edge('generate', END)

 

3️⃣ Conditional Edge 추가 고급편

이렇게 처리하면, 그래프의 가독성이 훨씬 좋아진다.

graph_builder.add_conditional_edges(
    'retrieve',             # 시작점: 문서를 찾아온 후
    check_doc_relevance,    # 판단 함수: 이 문서가 질문과 관련 있는지 검사
    {
        'relevant': 'generate', # 관련 있다면 -> 답변 생성 단계로!
        'irrelevant': END       # 관련 없다면 -> 여기서 종료(END)
    }
)

 

Conidtional Edge 사용 시, 노드를 추가하고 싶다면, 다음과 같이 노드와
실제 동작할 노드(등록 안할 노드)를 구분한다.

 

  • 여기서 check_heplfulness는 등록될 노드
  • check_heplfulness_grader는 실제 동작되고, 등록도지 않을 노드
  • check_heplfulness -> check_heplfulness_grader로 감
def check_helpfulness_grader(state: AgentState) -> str:
    """
    사용자의 질문에 기반하여 생성된 답변의 유용성을 평가합니다.

    Args:
        state (AgentState): 사용자의 질문과 생성된 답변을 포함한 에이전트의 현재 state.

    Returns:
        str: 답변이 유용하다고 판단되면 'helpful', 그렇지 않으면 'unhelpful'을 반환합니다.
    """
    # state에서 질문과 답변을 추출합니다
    query = state['query']
    answer = state['answer']

    # 답변의 유용성을 평가하기 위한 체인을 생성합니다
    helpfulness_chain = helpfulness_prompt | llm
    
    # 질문과 답변으로 체인을 호출합니다
    response = helpfulness_chain.invoke({'question': query, 'student_answer': answer})

    # 점수가 1이면 'helpful'을 반환하고, 그렇지 않으면 'unhelpful'을 반환합니다
    if response['Score'] == 1:
        return 'helpful'
    
    return 'unhelpful'

def check_helpfulness(state: AgentState) -> AgentState:
    """
    유용성을 확인하는 자리 표시자 함수입니다. 
    graph에서 conditional_edge를 연속으로 사용하지 않고 node를 추가해
    가독성을 높이기 위해 사용합니다

    Args:
        state (AgentState): 에이전트의 현재 state.

    Returns:
        AgentState: 변경되지 않은 state를 반환합니다.
    """
    # 이 함수는 현재 아무 작업도 수행하지 않으며 state를 그대로 반환합니다
    return state

graph_builder.add_conditional_edges(
    'check_helpfulness',
    check_helpfulness_grader,
    {
        'helpful': END,
        'unhelpful': 'rewrite'
    }
)

✏️ 프롬프트 만들기

from langchain_core.prompts import PromptTemplate
from langchain import hub

generate_prompt = hub.pull("rlm/rag-prompt") # 허브에서 가져온 프롬프트

dictionary = ['사람과 관련된 표현 -> 거주자']

rewrite_prompt = PromptTemplate.from_template(f"""
사용자의 질문을 보고, 우리의 사전을 참고해서 사용자의 질문을 변경해주세요 
사전: {dictionary}                                           
질문: {{query}}
""") # 직접 작성하는 프롬프트

출처

반응형

'AI > LangGraph' 카테고리의 다른 글

SubGraph와 Router  (0) 2026.02.22
Corrective RAG  (0) 2026.02.22
Self RAG  (0) 2026.02.22
PDF 전처리 해보기  (0) 2026.02.21
랭그래프 시작  (0) 2026.02.21
'AI/LangGraph' 카테고리의 다른 글
  • Corrective RAG
  • Self RAG
  • PDF 전처리 해보기
  • 랭그래프 시작
Hamp
Hamp
남들에게 보여주기 부끄러운 잡다한 글을 적어 나가는 자칭 기술 블로그입니다.
  • Hamp
    Hamp의 분리수거함
    Hamp
  • 전체
    오늘
    어제
    • 분류 전체보기 (339)
      • CS (30)
        • 객체지향 (2)
        • Network (7)
        • OS (6)
        • 자료구조 (1)
        • LiveStreaming (3)
        • 이미지 (1)
        • 잡다한 질문 정리 (0)
        • Hardware (2)
        • 이론 (6)
        • 컴퓨터 그래픽스 (0)
      • Firebase (3)
      • Programing Langauge (41)
        • swift (34)
        • python (6)
        • Kotlin (1)
      • iOS (134)
        • UIKit (37)
        • Combine (1)
        • SwiftUI (34)
        • Framework (7)
        • Swift Concurrency (22)
        • Tuist (6)
        • Setting (11)
        • Modularization (1)
        • Instruments (6)
      • PS (59)
        • 프로그래머스 (24)
        • 백준 (13)
        • LeetCode (19)
        • 알고리즘 (3)
      • Git (18)
        • 명령어 (4)
        • 이론 (2)
        • hooks (1)
        • config (2)
        • action (7)
      • Shell Script (2)
      • Linux (6)
        • 명령어 (5)
      • Spring (21)
        • 어노테이션 (6)
        • 튜토리얼 (14)
      • CI-CD (4)
      • Android (0)
        • Jetpack Compose (0)
      • AI (21)
        • 이론 (10)
        • MCP (1)
        • LangGraph (10)
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    SwiftUI
    CS
    property
    dp
    IOS
    GIT
    백준
    UIKit
    dfs
    투포인터
    boostcamp
    dispatch
    AVFoundation
    protocol
    lifecycle
    concurrency
    Swift
    프로그래머스
    Spring
    Tuist
  • 최근 댓글

  • 최근 글

  • 반응형
  • hELLO· Designed By정상우.v4.10.0
Hamp
Conditional Edge
상단으로

티스토리툴바