랭체인 에이전트 및 도구, Pydantic 스키마로 구조화된 입력받기, ReAct

2026. 4. 3. 16:53·독서

한빛미디어의 'AI에이전트 마스터 클래스' 챕터 7 내용의 일부를 정리했습니다.

1. 에이전트 도구 사용 과정

1) 사용자 질문 입력 -> 모델

2) 모델 -> 도구들(action)

사용자의 질문을 확인한 모델이 '지금은 도구를 써야겠다'고 판단합니다. 어떤 도구를 어떤 인자로 호출하지 action을 생성합니다. 

주어진 도구들이 각자 어떤 역할을 수행하는지 확인하고, 현재 질문 내용을 토대로 도구를 사용할 것인지, 아니면 직접 답변을 생성할 것인지 결정합니다.

3) 도구들 -> 모델(observation)

도구가 실행된 뒤, 그 결과값을 반환합니다.(observation) 도구가 모델을 '관측'하는 것이 아니라, '모델이 도구의 실행 결과를 관찰한다'고 이해하면 됩니다. 

4) 모델 -> 출력(fishsh)

ahepfdms '입력 + 하나 혹은 여러번의 observation'을 토대로 이제 도구를 더 쓰지 않겠다고 결정하면 최종 답변을 생성합니다.

 

도구 선언 예시

from langchain_core.tools import tool

@tool("math_calculator", description="표현식(문자열)을 계산하여 반환")
def calculator(expression):
    """
    간단한 수학 표현식을 계산합니다.
    Args:
        expression (str): 계산할 수학 표현식(예: "2 + 3 * 4")
    Returns:
        str: 계산 결과
    """
    return str(eval(expression))

print(calculator.description) # 표현식(문자열)을 계산하여 반환.
print(calculator.invoke({"expression": "2 + 3 * 4"})) # 14

 

2. Pydantic 스키마로 구조화된 입력받기

from pydantic import BaseModel, Field

class WeatherArgs(BaseModel):
    city: str = Field(description="도시 이름")
    units: str = Field(description="섭씨 또는 화씨", default="섭씨")

@tool(args_schema=WeatherArgs)
def get_weather_units(city, units="섭씨"):
    """해당 도시에서 주로 사용하는 온도 단위를 반환합니다."""
    return f"{city} (은/는) 주로 {units} 단위를 사용합니다."

print(get_weather_units.invoke({"city": "서울"})) # 서울의 현재 기온 (단위: 섭씨)

from langchain.agents import create_agent
from langchain_anthropic import ChatAnthropic

# LLM 준비
model = ChatAnthropic(model="claude-haiku-4-5")

agent = create_agent(
    model=model,
    tools=[calculator, get_weather_units],
    system_prompt="""
        당신은 도움이 되는 AI 어시스턴트입니다. 사용자의 질문에 정확하게 답하세요.
        상황에 맞는 도구를 반드시 사용하여 답변합니다.
    """
)

result = agent.invoke({
    "messages": [{"role": "user", "content": "5 * 12는?"}]
})

print(result["messages"][-1].content)

 

3. 도구 호출과정에서 ReAct(Reasoning +Acting)

왜 그 도구를 선택했는지 추론 과정을 명시적으로 표현하고, 도구의 결과를 해석해 최종 답변으 재구성함

사용자: "미국은 어떤 온도 단위를 주로 사용하나요?" 
↓
[Reasoning] LLM: "get_weather_units 도구를 사용해야겠다" 
↓
[Acting] 도구 실행: get weather units(city="미국", units="화씨") 
↓
[observation] 결과: "미국 (은/는) 주로 화씨 단위를 사용합니다." 
↓
[Reasoning] LLM: "미국은 주로 화씨(Fahrenheit, °F) 단위를 사용합니다. 참고로 ..."
↓
[finish] LLM: "이제 답변 할 수 있다."
↓
최종 답변: " 미국은 주로 화씨(Fahrenheit, oF) 단위를 사용합니다. 참고로 ..."

 

에이전트는 도구를 통해 얻어낸 답변을 그대로 사용자에게 반환하지 않습니다. 한 번더추론 과정을 거처, 도구의 결과를 정리하고 맥락을 더해 유려한 최종 답변으로 제공합니다 

 

 

!pip install yapf

from yapf.yapflib.yapf_api import FormatCode
style = { 'COLUMN_LIMIT': 50}

query = "미국은 어떤 온도 단위를 주로 사용하나요?"
messages = [{
        "role": "user",
        "content": query
    }]

for chunk in agent.stream(
    {"messages": messages},
    stream_mode="updates",  # 에이전트 진행 상황 단위 스트림
):
    text, flag = FormatCode(str(chunk), style_config=style)
    print(text)

랭체인 도구 관련 페이

https://docs.langchain.com/oss/python/integrations/providers/overview

 

'독서' 카테고리의 다른 글

『듀얼 브레인』을 읽고  (0) 2025.05.07
'독서' 카테고리의 다른 글
  • 『듀얼 브레인』을 읽고
AI강선생
AI강선생
AI강선생의 블로그 입니다.
  • AI강선생
    나의 배움과 성장의 궤적
    AI강선생
  • 전체
    오늘
    어제
    • 분류 전체보기 (62) N
      • 온라인강의 (45)
      • 오프라인강의 (3)
      • 독서 (2) N
      • 생각과다짐 (6)
      • 도메인 (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    PostgreSQL
    Redis
    오레일리
    프롬프트
    rustfs
    Python
    혼공바이브코딩
    spring
    에이전트
    국회
    길벗
    클로드코드
    java
    AI agent
    랭체인
    AI시대
    cursor
    docker
    Claude
    인프런
    스프링부트
    게임기획
    한빛미디어
    claude code
    이지스퍼블리싱
    챌린지
    llmagent
    유리링
    FastAPI
    LangChain
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
AI강선생
랭체인 에이전트 및 도구, Pydantic 스키마로 구조화된 입력받기, ReAct
상단으로

티스토리툴바