PR

【第4回】Function Calling実践編:外部APIと連携する自律型AIエージェント

【第4回】Function Calling実践編:外部APIと連携する自律型AIエージェント

はじめに:あなたのAIに「手足」を授ける

第3回までで、私たちは独自の知識を持つ(RAG)チャットアプリケーションを構築しました。しかし、それはまだ「質問に答える」ことしかできない、いわば「知識だけの脳」のような存在です。

シリーズ第4回となる今回は、この脳に「手足」を与え、現実世界に影響を与える「行動」を可能にする、自律型AIエージェントへと進化させます。

その鍵となる技術が、OpenAIが提供するFunction Calling(Tool Callingとも呼ばれます)です。これを使えば、LLMはユーザーの指示に応じて、あなたが用意した独自の関数(ツール)を呼び出すことができます。例えば、「今日の東京の天気を教えて」と聞けば、天気予報APIを叩いて最新の情報を回答する、といった芸当が可能になるのです。

この記事では、LangChainを使い、このFunction Callingの能力を最大限に引き出して、外部ツールを使いこなすAIエージェントを構築する方法をハンズオンで解説します。

1. Function Callingの仕組み:LLMとの「作戦会議」

Function Callingは、LLMとあなたのコードが連携して動作する仕組みです。

  1. あなた: LLMに対し、ユーザーの質問と共に「あなたが使って良いツールのリスト(関数名、引数、説明)」を渡す。
  2. LLM: ユーザーの質問を解釈し、「どのツールを、どの引数で」呼び出すべきかを判断。その判断結果をJSON形式であなたに返す。
  3. あなた: LLMから返されたJSONを元に、実際に自前のPython関数を実行する。
  4. あなた: 関数の実行結果を、再度LLMに渡す。
  5. LLM: 関数の実行結果を踏まえて、ユーザーへの最終的な回答を生成する。

この一連のキャッチボールにより、LLMはあなたのコードを「武器」として使いこなし、単なるテキスト生成を超えたタスクを実行できるようになります。

2. LangChainで「カスタムツール」を定義する

LangChainを使えば、この強力な仕組みを驚くほど簡単に実装できます。まずは、エージェントに与える「武器」となるカスタムツールを定義しましょう。

# tools.py
from langchain_core.tools import tool
import requests # 天気APIを叩くためにrequestsをインストール pip install requests
import os
@tool
def get_current_weather(location: str) -> str:
    """指定された場所の現在の天気を取得します。"""
api_key = os.environ.get("WEATHER_API_KEY")
if not api_key:
return "エラー: 天気APIキーが設定されていません。"
base_url = "http://api.openweathermap.org/data/2.5/weather"
params = {
"q": location,
"appid": api_key,
"units": "metric",
"lang": "ja"
}
try:
response = requests.get(base_url, params=params)
response.raise_for_status() # エラーがあれば例外を発生
data = response.json()
description = data["weather"][0]["description"]
temp = data["main"]["temp"]
return f"{location}の天気は{description}、気温は{temp}度です。"
except requests.exceptions.RequestException as e:
return f"エラー: 天気情報の取得に失敗しました。 {e}"
# 他にも必要なツールがあれば、@toolデコレータをつけてどんどん追加できる
@tool
def multiply(a: int, b: int) -> int:
    """2つの数値を掛け算します。"""
return a * b
# 作成したツールをリストにまとめる
tools = [get_current_weather, multiply]

ポイント:
@toolデコレータを付けるだけで、どんなPython関数もツールになります。
– 関数のdocstring("""..."""の部分)が非常に重要です。LLMは、この説明文を読んでツールの機能や使い方を理解します。

3. AIエージェントの構築と実行

次に、定義したツールとLLMを組み合わせて、エージェントを構築します。

# agent_executor.py
from langchain_openai import ChatOpenAI
from langchain import hub
from langchain.agents import AgentExecutor, create_openai_tools_agent
from tools import tools # 先ほど作成したツールをインポート
# 1. LLMを準備
llm = ChatOpenAI(model="gpt-4o", temperature=0)
# 2. 実績のあるプロンプトテンプレートをLangChain Hubから取得
prompt = hub.pull("hwchase17/openai-tools-agent")
# 3. エージェントを作成
agent = create_openai_tools_agent(llm, tools, prompt)
# 4. エージェントを実行するためのAgentExecutorを作成
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
# 5. 実行!
if __name__ == "__main__":
question = "東京の天気を教えて。あと、8に12を掛けたらいくつ?"
result = agent_executor.invoke({"input": question})
print(result["output"])

agent_executor.py を実行すると、verbose=Trueオプションによって、エージェントの思考プロセス(Chain of Thought)がターミナルに表示されます。LLMがどのツールをどの順番で呼び出し、最終的な結論に至ったかをつぶさに観察できるはずです。

4. FastAPIバックエンドへの統合

最後に、このエージェントを第2回で作成したFastAPIサーバーに組み込み、新しいエンドポイントを追加します。

# main.py (追記)
from agent_executor import agent_executor
@app.post("/agent/")
async def run_agent(request: dict):
    """AIエージェントを実行するエンドポイント"""
question = request.get("question")
if not question:
raise HTTPException(status_code=400, detail="Question not provided.")
try:
result = agent_executor.invoke({"input": question})
return JSONResponse(status_code=200, content={"answer": result.get("output")})
except Exception as e:
raise HTTPException(status_code=500, detail=f"Agent error: {str(e)}")

まとめ:自律的に「行動」するAIを手に入れた

おめでとうございます!あなたのAIは、もはや単なる物知りなチャットボットではありません。外部の世界と連携し、自律的に「行動」できるエージェントへと進化しました。

  • Function Callingの仕組みを理解し、LLMに「手足」を与えた。
  • @toolデコレータを使い、独自のPython関数をAIの武器として簡単に定義した。
  • LangChainのAgentExecutorを使い、思考と行動を司るエージェントを構築した。

この「ツールを使いこなす能力」こそが、あなたのLLMアプリケーションに無限の可能性をもたらします。

次回予告:【最終回】デプロイと収益化編:AWS/VercelへのデプロイとStripe連携

いよいよ最終回。開発したAIエージェントを世界に公開し、収益化するための最終ステップです。お楽しみに!


関連記事
【第3回】フロントエンド編:Next.jsとVercel AI SDKで作るモダンなチャットUI
CLIとLLMの融合:コマンドラインでAIを駆使する実践的ノウハウ

コメント

タイトルとURLをコピーしました