PR

Function CallingとLLMエージェント開発:外部APIと連携する自律型AIアプリケーション構築の実践

はじめに:LLMに「手足」を与える技術、それがエージェント開発

2025年、LLM(大規模言語モデル)は、もはや単なる「おしゃべりAI」ではありません。外部のAPIを叩いて最新情報を取得したり、データベースを検索したり、他のサービスを操作したりと、まるで人間のように外部のツールを使いこなす能力を獲得し始めています。これを実現する核心技術が、Function Calling(Tool Calling)であり、それを用いて構築されるのがAIエージェントです。

AIエージェント開発は、LLMを「思考する脳」として、外部ツールという「手足」を与え、自律的にタスクを解決させる、AIアプリケーション開発の最前線です。

この記事では、AIエージェントの基本概念から、その核心技術であるFunction Callingの仕組み、そしてLangChainのようなフレームワークを使った具体的なエージェント開発までを、ハンズオン形式で徹底解説します。

核心技術:Function Calling(Tool Calling)の仕組み

AIエージェントの動作の根幹をなすのが、OpenAIが提唱したFunction Calling(最近ではTool Callingとも呼ばれる)の仕組みです。これは、LLMがユーザーの指示を解釈し、開発者があらかじめ定義した関数(ツール)の中から、どれを、どのような引数で呼び出すべきかを判断する機能です。

重要なポイント: LLMは実際に関数を実行しません。あくまで「この関数を、この引数で呼び出すべきだ」という構造化されたJSONデータを返すだけです。実際の実行は、開発者のアプリケーション側で行います。

動作フロー

  1. 開発者: 「天気を調べる関数」や「データベースを検索する関数」などをPythonで定義し、その関数の説明(何をする関数か、どんな引数が必要か)をLLMに伝える。
  2. ユーザー: 「今日の東京の天気は?」と質問する。
  3. LLM: 質問の意図を理解し、「天気を調べる関数」を {"location": "東京"} という引数で呼び出すべきだと判断する。
  4. LLM: {"function_name": "get_weather", "arguments": {"location": "東京"}} のようなJSONを出力する。
  5. 開発者: このJSONを受け取り、実際に自分のコード内で get_weather("東京") を実行する。
  6. 開発者: 実行結果(例:「晴れ、最高気温30度」)を再びLLMに渡す。
  7. LLM: その結果を元に、「本日の東京の天気は晴れ、最高気温は30度です」と自然な文章でユーザーに最終回答する。

実践:LangChainで自律型AIエージェントを構築する

このFunction Callingの仕組みを、より簡単に、そして強力に扱えるようにしたのがLangChainLlamaIndexといったフレームワークです。ここでは、LangChainを使って、複数のツールを使い分けるエージェントを構築してみましょう。

ステップ0:環境準備

!pip install langchain langchain-openai google-search-results wikipedia

OpenAIとSerpAPI(Google検索用)のAPIキーを設定しておきます。

ステップ1:LLMとツールの定義

エージェントの「脳」となるLLMと、「手足」となるツールを準備します。LangChainには便利なツールが多数組み込まれています。

from langchain_openai import ChatOpenAI
from langchain.agents import load_tools, initialize_agent, AgentType
# LLMを初期化 (思考の首尾一貫性が高いモデルが推奨される)
llm = ChatOpenAI(model="gpt-4o", temperature=0)
# ツールをロード
# duckduckgo-search: Web検索ツール
# llm-math: 計算ツール
tools = load_tools(["ddg-search", "llm-math"], llm=llm)

ステップ2:エージェントの初期化と実行

LLMとツールを組み合わせてエージェントを初期化します。ReAct (Reasoning and Acting) という思考アルゴリズムを用いるエージェントが一般的です。

# ReActアルゴリズムを使用するエージェントを初期化
agent = initialize_agent(
tools,
llm,
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
verbose=True # Trueにするとエージェントの思考プロセスが見える
)
# エージェントに複雑なタスクを依頼
question = "現在の日本の総理大臣の年齢を2乗するといくつになりますか?"
response = agent.run(question)
print(f"最終回答: {response}")

エージェントの思考プロセス (verbose=True の出力例)

> Entering new AgentExecutor chain...
Thought: まず現在の日本の総理大臣の名前を調べる必要がある次にその人の年齢を調べ最後にその年齢を2乗する
Action: Search
Action Input: "現在の日本の総理大臣"
Observation: 岸田文雄
Thought: 次に岸田文雄の年齢を調べる必要がある
Action: Search
Action Input: "岸田文雄 年齢"
Observation: 67歳
Thought: 最後に67を2乗する必要がある
Action: Calculator
Action Input: 67 * 67
Observation: 4489
Thought: これで最終的な答えがわかった
Final Answer: 現在の日本の総理大臣岸田文雄の年齢は67歳でその2乗は4489です
> Finished chain.

このように、エージェントは与えられたタスクを達成するために、自律的に思考し、適切なツールを選択・実行していることがわかります。

まとめ:AIエージェント開発で、未来のアプリケーションを創造する

Function CallingとAIエージェント開発は、LLMの能力を飛躍的に拡張し、これまでにないインテリジェントなアプリケーションを可能にする技術です。

  • 業務自動化: 定型的な業務プロセスをAIエージェントに任せ、人間はより創造的な作業に集中する。
  • パーソナルアシスタント: 個人のスケジュール管理、情報収集、タスク実行を代行する、真に賢いアシスタントを開発する。
  • 複雑なデータ分析: データベースからのデータ抽出、分析、可視化までを自然言語の指示一つで実行する。

この技術をマスターすることは、エンジニアとして市場価値を高めるだけでなく、未来のソフトウェアのあり方を自らの手で創造する、エキサイティングな挑戦となるでしょう。

コメント

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