iT邦幫忙

2025 iThome 鐵人賽

DAY 7
0

會呼叫天氣的 Agent?

在開始前,請先到 OpenWeatherMap 官方網站 註冊並取得你的 API Key
這個 Key 將用來讓我們的 Agent 查詢即時天氣資料。

經過前幾天的學習,我們已經讓 Agent 能處理條件分支,也能管理每日任務。
今天,我們要進一步升級,示範如何讓 Agent 呼叫外部功能——像是查天氣、計算倒數日或格式化數字。

雖然這還是規則型 Agent,但透過呼叫外部功能,它就能 不只回文字,而是真正幫助你完成日常任務,也為後續整合 Gemini 或 OpenAI 模型打下基礎。


🔹 為什麼要呼叫外部功能?

規則型 Agent 本質上依靠 if/else 判斷決策,但靠內建規則,功能相對有限。

呼叫外部功能可以讓 Agent:

  • 查詢天氣、股價或新聞
  • 計算倒數日、統計數值
  • 將數字或文字格式化,方便閱讀

這樣,即便是規則型 Agent,也能完成更實用、更貼近生活的任務。


🔹 核心概念

  1. 封裝函數
    • 將外部功能封裝成函數,方便 Agent 呼叫。例如:查天氣、計算日期差、格式化金額。
  2. 條件判斷 + 函數呼叫
    • 使用 if/else 判斷使用者輸入,再呼叫對應函數取得結果。
  3. 實用回饋
    • 將函數結果整理成清楚、易讀的文字回覆給使用者,增強互動體驗。

🔹 範例程式

下面範例展示一個簡單的規則型 Agent,能根據使用者輸入呼叫不同功能:
需要先下載

pip install requests

import requests
from datetime import datetime
from fastapi import FastAPI
from pydantic import BaseModel

# ⚠️ 請填入你在 OpenWeatherMap 申請的 API Key
API_KEY = "填入你在 OpenWeatherMap 申請的 API Key"
UNITS = "metric"
LANG = "zh_tw"

app = FastAPI()

# API 輸入格式
class UserInput(BaseModel):
    command: str        # 指令: 天氣 / 倒數日 / 格式化 / 離開
    city: str | None = None      # 天氣指令用
    date: str | None = None      # 倒數日指令用
    amount: int | None = None    # 格式化指令用

# 功能函數
def get_weather(city):
    url = "https://api.openweathermap.org/data/2.5/weather"
    params = {
        "q": city,
        "appid": API_KEY,
        "units": UNITS,
        "lang": LANG
    }
    try:
        response = requests.get(url, params=params)
        data = response.json()

        if data.get("cod") != 200:
            return f"取得天氣資料失敗: {data.get('message', '未知錯誤')}"

        city_name = data["name"]
        weather_desc = data["weather"][0]["description"]
        temp = data["main"]["temp"]
        temp_min = data["main"]["temp_min"]
        temp_max = data["main"]["temp_max"]

        return f"{city_name} 天氣:{weather_desc}, 現在 {temp}°C (範圍 {temp_min}°C ~ {temp_max}°C)"
    except Exception as e:
        return f"取得天氣資料失敗: {e}"

def days_until(date_str):
    target = datetime.strptime(date_str, "%Y-%m-%d")
    return (target - datetime.now()).days

def format_currency(amount):
    return f"NT${amount:,}"

# 決策函數
def decide_action(user_input: UserInput):
    if user_input.command == "天氣" and user_input.city:
        return get_weather(user_input.city)
    elif user_input.command == "倒數日" and user_input.date:
        days = days_until(user_input.date)
        return f"距離 {user_input.date} 還有 {days} 天"
    elif user_input.command == "格式化" and user_input.amount is not None:
        return format_currency(user_input.amount)
    elif user_input.command == "離開":
        return "掰掰~"
    else:
        return "指令或參數不完整,請檢查輸入"

# API endpoint
@app.post("/agent")
def agent_api(user_input: UserInput):
    result = decide_action(user_input)
    return {"response": result}

https://ithelp.ithome.com.tw/upload/images/20250919/20168458dWBTDqxWmK.png

https://ithelp.ithome.com.tw/upload/images/20250919/20168458g9TvHdLB6w.png

升級重點

  1. 規則型 Agent + 外部功能 → 功能更實用
  2. 條件判斷 + 函數呼叫 → 程式結構清楚、易擴展
  3. 生活小助手 → 可以查天氣、計算日期、格式化數據,貼近日常需求

透過這一步,我們的規則型 Agent 不再只是單純回覆文字,而能真正 協助日常決策與任務處理。

這也是邁向智慧型 Agent 的重要基礎:
下一步,我們就可以將 Gemini 或 OpenAI 模型接入,讓 Agent 開始 理解自然語言,成為更智慧的生活小幫手 🚀


上一篇
替 Agent 安裝「大腦」——註冊 Gemini API Key
下一篇
智慧升級!用 Gemini LLM 取代 if/else,打造更加聰明的 Agent
系列文
30 天打造你的 AI Agent:LangChain × n8n 實戰10
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言