はじめに
LangChainを用いて、天気情報を取得する外部apiの情報を元に回答を行うエージェントを作成しました。
環境準備
外部のAPIは下記のサイトのものを使用させていただきました。
https://weather.tsukumijima.net/
パッケージは以下のものを利用します。
langchain==0.3.15
langchain-community==0.3.15
langchain-openai==0.3.1
キーは.envに記述します。
.env
OPENAI_API_KEY="OPENAI_API_KEY"
以下がコードの全体像です。
from dotenv import load_dotenv
from api import call_weather_api # 外部API呼び出し関数をインポート
from langchain_openai import ChatOpenAI # ChatOpenAIを使用
from langchain.agents import initialize_agent, Tool
from langchain.agents import AgentType
# .envファイルを読み込む
load_dotenv()
# 外部APIツールを定義
tools = [
Tool(
name = "WeatherAPI",
func = call_weather_api,
description = "このツールは日本語表記の都市名を引数として、外部APIから今日、明日、明後日の3日分の天気のデータを取得します"
)
]
# ChatOpenAIの設定(APIキーを環境変数から取得)
openai_model_version = "gpt-4o-mini"
llm = ChatOpenAI(model=openai_model_version)
# エージェントの初期化
agent_executor = initialize_agent(
tools, llm, agent_type=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True
)
# クエリを辞書形式で渡す
query = {"messages": [{"role": "user", "content": "明日の小田原の天気は"}]}
# エージェントにクエリを送信
result = agent_executor.invoke(query["messages"][0]["content"])
# 結果を表示
print(result)
また、apiの内容は以下になります。
import requests
# 定数として都市コード(id)の対応情報を保持
CITY_CODES = {
"稚内": "011000",
"旭川": "012010",
"留萌": "012020",
"網走": "013010",
"北見": "013020",
"紋別": "013030",
"根室": "014010",
"釧路": "014020",
"帯広": "014030",
...
}
def call_weather_api(city_name: str):
# 都市名に対応する地域コードを取得
city_code = CITY_CODES.get(city_name)
if not city_code:
return f"次の都市名のデータは見つかりませんでした {city_name}"
# 地域コードを使ってAPIを呼び出す
url = f"https://weather.tsukumijima.net/api/forecast/city/{city_code}"
response = requests.get(url)
if response.status_code == 200:
# APIから得られたデータをJSON形式で取得
weather_data = response.json()
return weather_data
else:
return "データが取得できませんでした"
以下のような回答が得られます。
{'input': '明日の小田原の天気は', 'output': '明日の小田原の天気は晴時々曇で、最低気温は2℃、最高気温は13℃です。'}
試しに、apiが対応していない県名を入力とした場合の挙動を確認すると、
query = {"messages": [{"role": "user", "content": "明日の神奈川の天気は"}]}
{'input': '明日の神奈川の天気は', 'output': '明日の神奈川(横浜)の天気は「晴れ時々曇」で、気温は最低5度、最高13度です。'}
と回答してくれました。初めの施行ではapiに対応していない県名を入れていましたが、二回目には代表的な都市として横浜の情報を検索してくれました。
Tool内のdescriptionの"このツールは日本語表記の都市名を引数として、"という記述をもとに都市名を入力してくれました。
最後に
天気情報を取得するAPIの情報をもとに回答するエージェントの開発を行いました。apiの引数が明確な質問だと使いやすいのではないかと思いました。
参考