tool

2026. 2. 24. 22:12·AI/LangGraph
반응형


🏁 학습할 내용

  • 랭체인 tool 활용
  • 랭그래프에서 tool 제공

⛓️ LangChain tool 제공

 

1️⃣ tool 만들기

랭체인에서 tool은 schema를 가진 함수다.

  • @tool 데코레이
  • 설명
  • 파라미터 및 리턴 타입
from langchain_core.tools import tool

@tool
def add(a: int, b: int) -> int:
    """숫자 a와 b를 더합니다."""
    return a + b

@tool
def multiply(a: int, b: int) -> int:
    """숫자 a와 b를 곱합니다."""
    return a * b

 

2️⃣ llm에 바인딩

small_llm = AzureChatOpenAI(
    azure_deployment='gpt-4o-mini-2024-07-18',
    api_version='2024-08-01-preview',
)

llm_with_tools = small_llm.bind_tools([add, multiply])

 

3️⃣ 메시지 리스트(시퀀스) 던져주기

  • 왜 리스트를 던져 줘야하나 ?
  • llm에게 단순 질문을 던져주는 것보다 다음과 같이 던져주는게좋음
    • 질문 -> 휴면 메시지
    • AI메시지
      • 도구가 필요한지 안한지, 결정 후, 도구가 필요하면 AI메시지 안에있는 tool_calls에 bind한 도구 중 필요한게 전달됨
    • Tool메시지
      • 해당 Tool을 쓴 결과
from typing import Sequence

from langchain_core.messages import AnyMessage, HumanMessage

human_message = HumanMessage(query) # 3 곱하기 5는
message_list: Sequence[AnyMessage] = [human_message]

ai_message = llm_with_tools.invoke(message_list) # AI 메시지 
message_list.append(ai_message)

tool_message = multiply.invoke(ai_message.tool_calls[0]) #Tool 메시지
message_list.append(tool_message)


llm_with_tools.invoke(message_list) # Tool이 있는 LLM 호출

⚓ LangGraph에서 tool 제공

 

위 내용에서 크게 바뀌는 부부만 살펴보자.

  • message_list -> MessagesState
    • append를 일일히 하지 않아도 됨
    • MessagesState는 add_messages로 자동으로 추가됨
class MessagesState(TypedDict):
    messages: Annotated[list[AnyMessage], add_messages]

 

 

  • ToolNode 이용
    • tool을 그래프의 노드로 치환 시킴
    • Tool 노드는 아래 제약조건을 반드시 지켜야한다.
      • 메시지의 배열을 포함해야한다.
        • AnyMessage
          • SystemMessage
          • AIMessage
          • HumanMessage
          • ToolMessage
      • 마지막 메시지는 반드시 AIMessage여야한다.
      • AIMessage는 반드시 tool_calls(선택된 tool) 있어야한다.
from langgraph.prebuilt import ToolNode

tool_list = [add, multiply]
llm_with_tools = small_llm.bind_tools(tool_list) # LLM에 tool 바인딩
tool_node = ToolNode(tool_list) # ToolNode 생성

 

 

from langgraph.prebuilt import ToolNode

tool_list = [add, multiply]
llm_with_tools = small_llm.bind_tools(tool_list)
tool_node = ToolNode(tool_list)

from langgraph.graph import MessagesState, StateGraph

graph_builder = StateGraph(MessagesState)

# %%
def agent(state: MessagesState) -> MessagesState:
    """
    에이전트 함수는 주어진 상태에서 메시지를 가져와
    LLM과 도구를 사용하여 응답 메시지를 생성합니다.

    Args:
        state (MessagesState): 메시지 상태를 포함하는 state.

    Returns:
        MessagesState: 응답 메시지를 포함하는 새로운 state.
    """
    # 상태에서 메시지를 추출합니다.
    messages = state['messages']
    
    # LLM과 도구를 사용하여 메시지를 처리하고 응답을 생성합니다.
    response = llm_with_tools.invoke(messages)
    
    # 응답 메시지를 새로운 상태로 반환합니다.
    return {'messages': [response]}

# %%
from typing import Literal
from langgraph.graph import END

def should_continue(state: MessagesState) -> Literal['tools', END]:
    """
    주어진 메시지 상태를 기반으로 에이전트가 계속 진행할지 여부를 결정합니다.

    Args:
        state (MessagesState): `state`를 포함하는 객체.

    Returns:
        Literal['tools', END]: 도구를 사용해야 하면 `tools`를 리턴하고, 
        답변할 준비가 되었다면 END를 반환해서 프로세스를 종료합니다.
    """
    # 상태에서 메시지를 추출합니다.
    messages = state['messages']
    
    # 마지막 AI 메시지를 가져옵니다.
    last_ai_message = messages[-1]
    
    # 마지막 AI 메시지가 도구 호출을 포함하고 있는지 확인합니다.
    if last_ai_message.tool_calls:
        # 도구 호출이 있으면 'tools'를 반환합니다.
        return 'tools'
    
    # 도구 호출이 없으면 END를 반환하여 프로세스를 종료합니다.
    return END

출처

반응형

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

히스토리 관리  (0) 2026.02.26
지금까지 우리가 만든건 Agent가 아니다??  (0) 2026.02.23
RunnablePassthrough  (0) 2026.02.23
SubGraph와 Router  (0) 2026.02.22
Corrective RAG  (0) 2026.02.22
'AI/LangGraph' 카테고리의 다른 글
  • 히스토리 관리
  • 지금까지 우리가 만든건 Agent가 아니다??
  • RunnablePassthrough
  • SubGraph와 Router
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)
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

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

  • 최근 글

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

티스토리툴바