Copyfrom langgraph.graph import END, StateGraph
from langgraph.checkpoint.memory import MemorySaver
from langchain_teddynote.graphs import visualize_graph
# (1): Conventional RAG
# (2): 재검색
# (3): 멀티 LLM
# (4): 쿼리 재작성
# langgraph.graph에서 StateGraph와 END를 가져옵니다.
workflow = StateGraph(GraphState)
# 노드를 추가합니다.
workflow.add_node("retrieve", retrieve)
workflow.add_node("rewrite_query", rewrite_query) # (4)
workflow.add_node("GPT 요청", llm_gpt_execute)
workflow.add_node("Claude 요청", llm_claude_execute) # (3)
workflow.add_node("GPT_relevance_check", relevance_check)
workflow.add_node("Claude_relevance_check", relevance_check) # (3)
workflow.add_node("결과 종합", sum_up)
# 각 노드들을 연결합니다.
workflow.add_edge("retrieve", "GPT 요청")
workflow.add_edge("retrieve", "Claude 요청") # (3)
workflow.add_edge("rewrite_query", "retrieve") # (4)
workflow.add_edge("GPT 요청", "GPT_relevance_check")
workflow.add_edge("GPT_relevance_check", "결과 종합")
workflow.add_edge("Claude 요청", "Claude_relevance_check") # (3)
workflow.add_edge("Claude_relevance_check", "결과 종합") # (3)
# workflow.add_edge("결과 종합", END) # (2) - off
# 조건부 엣지를 추가합니다. (2), (4)
# workflow.add_conditional_edges(
# "결과 종합", # 관련성 체크 노드에서 나온 결과를 is_relevant 함수에 전달합니다.
# decision,
# {
# "재검색": "retrieve", # 관련성이 있으면 종료합니다.
# "종료": END, # 관련성 체크 결과가 모호하다면 다시 답변을 생성합니다.
# },
# )
# 조건부 엣지를 추가합니다. (4)
workflow.add_conditional_edges(
"결과 종합", # 관련성 체크 노드에서 나온 결과를 is_relevant 함수에 전달합니다.
decision,
{
"재검색": "rewrite_query", # 관련성이 있으면 종료합니다.
"종료": END, # 관련성 체크 결과가 모호하다면 다시 답변을 생성합니다.
},
)
# 시작점을 설정합니다.
workflow.set_entry_point("retrieve")
# 기록을 위한 메모리 저장소를 설정합니다.
memory = MemorySaver()
# 그래프를 컴파일합니다.
app = workflow.compile(checkpointer=memory)
# 그래프 시각화
visualize_graph(app)