0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

天気予報APIを用いたlangchainの実装

Posted at

はじめに

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の引数が明確な質問だと使いやすいのではないかと思いました。

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?