Yuta NakataのBlog

Python / AWS / ITについて役立つ情報を発信します

LangChain/Open AIを使って、APIからデータを取得するAIエージェントを作る

この記事でわかること

  • LangChainやOpen AI APIを使ったエージェントの開発
  • APIリクエストを可能とするエージェントのサンプルコード
  • 上記開発過程で必要での各種コードの解説

この記事で触れないこと

  • Pythonの基礎や文法など
  • OpenAI APIにおけるAPI KEYの発行方法

エージェント設計

天気APIを使って、Agentを作成しようと思います。

APIとしては、Open MeteoのForecast APIを使用します。

会員登録やAPIKEYの発行等も必要なく、誰でも使いやすいAPIです。

今回のAgentでは、天気について聞いて答えるAgentを作ってみようと思います。

LLMとしては、Open AIのAPIを使います。

結果

成功しました。APIからデータを取得して返してくれるAIができました。

AIが返してきた風速と気温はAPIと同じ値を返しています。

ソースコード

今回のAI Agentを作るにあたって、使用したソースコードならびに各種ライブラリは下記にあげておきます。

github.com

ソースコードの全体は下記のようになっています

import os
import requests

from langchain_core.tools import tool
from langchain.agents import AgentExecutor, create_openai_tools_agent
from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_openai import ChatOpenAI


OPENAI_API_KEY = os.environ.get("OPENAI_API_KEY")


@tool
def get_weather(latitude: float, longitude: float) -> str:
    """指定された緯度・経度から天気を取得します。"""
    url = f"https://api.open-meteo.com/v1/forecast?latitude={latitude}&longitude={longitude}&current=temperature_2m,wind_speed_10m"
    response = requests.get(url)
    data = response.json()

    temp = data["current"]["temperature_2m"]
    wind_speed = data["current"]["wind_speed_10m"]
    return f"Temperature: {temp}°C, Wind Speed: {wind_speed} m/s"


def main():
    # 使用するツール
    tools = [get_weather]

    # プロンプトテンプレート
    prompt = ChatPromptTemplate.from_messages(
        [
            ("system", "You are a helpful assistant"),
            MessagesPlaceholder("chat_history", optional=True),
            ("human", "{input}"),
            MessagesPlaceholder("agent_scratchpad"),
        ]
    )

    # モデル定義
    model = ChatOpenAI(openai_api_key=OPENAI_API_KEY, model="gpt-3.5-turbo-1106", temperature=0)
    # エージェント定義
    agent = create_openai_tools_agent(model, tools, prompt)
    # エージェントに、ツールを渡して実行
    agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
    # プロンプトを渡して、エージェントが実行
    response = agent_executor.invoke({"input": "東京の天気を教えてください。"})
    return response


if __name__ == "__main__":
    response = main()

    print(response["input"])
    print(response["output"])

構成は非常にシンプルで、

  1. APIを叩いて返す関数を用意
  2. 用意した関数をToolとして登録
  3. PromptTemplateを作成し、Modelを定義
  4. 1から3までで用意したTool, ModelからAgentを作成

という流れです。

API部分を個々人の環境に合わせて作成すれば、APIを使ったAgentを作ることができます。

ぜひ、上記コードをベースに開発してみてください :)

参考資料