실제 앱 개발에서 외부 시스템과 연결되거나, 상태를 바꾸거나, 사용자에게 실질적인 가치를 주는 Tool의 역할은 중요합니다. 아래는 실제 앱에서 바로 쓸 수 있는 수준의 예제들입니다.
from langchain.tools import tool
import requests
@tool
def get_weather(city: str) -> str:
"""도시 이름을 입력받아 현재 날씨 정보를 반환합니다."""
api_key = "YOUR_API_KEY"
url = f"http://api.openweathermap.org/data/2.5/weather?q={city}&appid={api_key}&units=metric"
response = requests.get(url).json()
if response.get("weather"):
description = response["weather"][0]["description"]
temp = response["main"]["temp"]
return f"{city}의 현재 날씨는 {description}, 온도는 {temp}°C 입니다."
else:
return "날씨 정보를 가져오지 못했습니다."
👉 활용:
from langchain.tools import tool
import smtplib
from email.mime.text import MIMEText
@tool
def send_email(to: str, subject: str, body: str) -> str:
"""이메일을 전송합니다."""
sender = "your_email@gmail.com"
password = "your_app_password"
msg = MIMEText(body)
msg["Subject"] = subject
msg["From"] = sender
msg["To"] = to
try:
with smtplib.SMTP_SSL("smtp.gmail.com", 465) as server:
server.login(sender, password)
server.send_message(msg)
return "이메일 전송 완료"
except Exception as e:
return f"전송 실패: {str(e)}"
👉 활용:
from langchain.tools import tool
import sqlite3
@tool
def get_user_orders(user_id: int) -> str:
"""사용자의 주문 내역을 조회합니다."""
conn = sqlite3.connect("shop.db")
cursor = conn.cursor()
cursor.execute("SELECT item, price FROM orders WHERE user_id=?", (user_id,))
rows = cursor.fetchall()
conn.close()
if not rows:
return "주문 내역이 없습니다."
result = "\n".join([f"{item} - {price}원" for item, price in rows])
return result
👉 활용:
from langchain.tools import tool
@tool
def save_note(filename: str, content: str) -> str:
"""텍스트 파일로 내용을 저장합니다."""
with open(filename, "w", encoding="utf-8") as f:
f.write(content)
return f"{filename} 파일로 저장되었습니다."
👉 활용:
from langchain.tools import tool
import requests
@tool
def simple_search(query: str) -> str:
"""검색어를 입력받아 간단한 결과를 반환합니다."""
url = f"https://api.duckduckgo.com/?q={query}&format=json"
data = requests.get(url).json()
return data.get("AbstractText", "검색 결과 없음")
👉 활용:
from langchain.tools import tool
@tool
def run_python(code: str) -> str:
"""Python 코드를 실행하고 결과를 반환합니다."""
try:
local_vars = {}
exec(code, {}, local_vars)
return str(local_vars)
except Exception as e:
return str(e)
👉 활용:
⚠️ 주의: 실제 서비스에서는 sandbox 필수
from langchain.tools import tool
schedule = []
@tool
def add_schedule(date: str, event: str) -> str:
"""일정을 추가합니다."""
schedule.append({"date": date, "event": event})
return f"{date}에 '{event}' 일정이 추가되었습니다."
👉 활용:
실전에서 좋은 Tool의 조건은 명확합니다:
*추가,
👉 “에이전트가 Tool을 언제 선택하는지”
👉 “Tool + RAG + Memory를 결합한 아키텍처”