박정기
박정기
🗡️ AI 레전드
🎖️ 마스터 파트너

[1DAY 1랭그래프] Router 에 대하여 #3일차

배경 및 목적

이번 13기 AI 스터디에 앞서, 1DAY 1랭그래프, 즉 하루에 1개의 랭그래프 개념을 설명하는 부분을 기획하게 됐습니다.

-> 랭그래프 스터디에 관심이 있다면 신청해주세요!

주황색 배경의 한국 광고

스터디 신청링크

이 프로젝트의 목표는 랭그래프를 쉽게 입문하실 수 있게 상세한 개념부터 코드까지 함께 공부해보실 수 있게 정리해서 드릴 예정입니다.

저는 랭그래프를 처음들어봐요!, 1일차 글을 보고 싶다면!?

-> 링크로 접속하기!

참고 자료

코랩 실습 링크

공식 랭그래프 강의 링크

활용 툴

파이썬, 코랩, 랭그래프, 랭체인

핵심 요약: LangGraph를 활용한 라우터 구축

0. 주요 개념

2일차에 진행됐던 Tool (숫자 계산 관련)을 LLM이 판단하여 라우팅을 하여 도구를 호출할지, 그냥 평범한 답을 할지 판단하게 합니다.

작품 과정의 단계를 보여주는 다이어그램

1. 소개 및 검토

- 목표: 이전에 구축한 메시지를 상태로 사용하는 그래프와 도구가 바인딩된 채팅 모델을 기반으로, 사용자 입력에 따라 직접 응답 또는 도구 호출을 라우팅하는 라우터를 구축합니다.

- 기능:

- 도구 호출 반환

- 자연어 응답 반환

2. 환경 설정

- 라이브러리 설치: langchain_openai, langchain_core, langgraph 라이브러리를 설치합니다.

  %%capture --no-stderr

  %pip install --quiet -U langchain_openai langchain_core langgraph

3. API 키 설정

- OpenAI API 키 설정: 환경 변수를 설정하여 OpenAI 모델을 사용할 수 있도록 합니다.

  import os, getpass

  

  def setenv(var: str):

      if not os.environ.get(var):

          os.environ[var] = getpass.getpass(f"{var}: ")

  

  setenv("OPENAI_API_KEY")

4. 도구 정의 및 바인딩

- 도구 예시: 두 정수를 곱하는 multiply 함수를 정의합니다.

  def multiply(a: int, b: int) -> int:

      """Multiply a and b.

  

      Args:

          a: first int

          b: second int

      """

      return a * b

- 도구 바인딩: multiply 함수를 채팅 모델에 도구로 바인딩합니다.

   from langchain_openai import ChatOpenAI

  

  llm = ChatOpenAI(model="gpt-4o")

  llm_with_tools = llm.bind_tools([multiply])

5. 그래프 구축 및 라우터 설정

- 노드 정의: 도구 호출을 수행하는 tool_calling_llm 노드를 정의합니다.

  from langgraph.graph import MessagesState

  

  def tool_calling_llm(state: MessagesState):

      return {"messages": [llm_with_tools.invoke(state["messages"])]}

- 그래프 빌드: StateGraph를 초기화하고, 노드와 에지를 추가합니다.

- ToolNode를 추가하여 도구 목록을 초기화합니다.

- tools_condition을 사용한 조건부 에지를 추가하여 도구 호출 여부에 따라 라우팅합니다.

  from IPython.display import Image, display

  from langgraph.graph import StateGraph, START, END

  from langgraph.prebuilt import ToolNode, tools_condition

  

  # 그래프 빌더를 초기화합니다. 상태는 MessagesState를 사용합니다.

  builder = StateGraph(MessagesState)

  

  # 'tool_calling_llm' 노드를 그래프에 추가합니다.

  builder.add_node("tool_calling_llm", tool_calling_llm)

  

  # 'tools' 노드를 ToolNode로 추가하며, multiply 도구를 전달합니다.

  builder.add_node("tools", ToolNode([multiply]))

  

  # START 노드에서 'tool_calling_llm' 노드로의 에지를 추가합니다.

  builder.add_edge(START, "tool_calling_llm")

  

  # 'tool_calling_llm' 노드에서 조건부 에지를 추가합니다.

  # tools_condition을 사용하여 도구 호출 여부에 따라 'tools' 노드로 라우팅하거나 END 노드로 라우팅합니다.

  builder.add_conditional_edges(

      "tool_calling_llm",

      tools_condition,

  )

  

  # 'tools' 노드에서 END 노드로의 에지를 추가합니다.

  builder.add_edge("tools", END)

  

  # 그래프를 컴파일하여 구조를 검증하고 최종 그래프 객체를 생성합니다.

  graph = builder.compile()

  

  # 그래프를 머메이드 다이어그램으로 시각화하여 표시합니다.

  display(Image(graph.get_graph().draw_mermaid_png()))

6. 그래프 시각화

- 머메이드 다이어그램: 그래프 구조를 시각적으로 확인할 수 있습니다.

도구를 호출하는 프로그램의 다이어그램
  display(Image(graph.get_graph().draw_mermaid_png()))

7. 그래프 호출 및 결과 확인

- 도구 호출 없이 응답: "Hello!" 입력 시 LLM이 도구 호출 없이 직접 응답합니다.

  from langchain_core.messages import HumanMessage

  

  messages = [HumanMessage(content="Hello!")]

  messages = graph.invoke({"messages": messages})

  

  for m in messages['messages']:

      m.pretty_print()

- 결과: LLM이 자연어로 직접 응답을 반환합니다.

- 도구 호출 포함 응답: "Multiply 2 and 3" 입력 시 multiply 도구를 호출하여 결과를 반환합니다.

  messages = [HumanMessage(content="Multiply 2 and 3")]

  messages = graph.invoke({"messages": messages})

  

  for m in messages['messages']:

      m.pretty_print()

- 결과: LLM이 multiply 도구를 호출하여 계산 결과를 반환합니다.

8. 결론

- 라우터 역할: LLM이 사용자 입력에 따라 직접 응답하거나 도구를 호출하여 제어 흐름을 관리하는 간단한 에이전트를 구현합니다.

- LangGraph 활용: 조건부 에지를 통해 그래프 흐름을 유연하게 제어하며, 외부 도구와의 상호작용을 통합할 수 있습니다.


추가 설명

- 도구 호출 로직: tools_condition을 사용하여 LLM의 응답이 도구 호출인지 아닌지를 판단하고, 이에 따라 도구 노드(`tools`)로 라우팅하거나 그래프를 종료합니다.

- StateGraph 사용: MessagesState를 통해 메시지 목록을 상태로 관리하며, 각 노드는 이 상태를 업데이트합니다.

- ToolNode: 사전에 정의된 도구들을 쉽게 추가할 수 있는 내장 노드입니다.

랭그래프, AI 에이전트 구현에 관심이 생겼나요?

->지금바로 랭그래프 스터디에 관심이 있다면 신청해주세요!

주황색 배경의 한국 광고

지피터스 13기 스터디 신청링크

1

👉 이 게시글도 읽어보세요