독서
랭체인 에이전트 및 도구, Pydantic 스키마로 구조화된 입력받기, ReAct
AI강선생
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