はじめに: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データを返すだけです。実際の実行は、開発者のアプリケーション側で行います。
動作フロー
- 開発者: 「天気を調べる関数」や「データベースを検索する関数」などをPythonで定義し、その関数の説明(何をする関数か、どんな引数が必要か)をLLMに伝える。
- ユーザー: 「今日の東京の天気は?」と質問する。
- LLM: 質問の意図を理解し、「天気を調べる関数」を
{"location": "東京"}
という引数で呼び出すべきだと判断する。 - LLM:
{"function_name": "get_weather", "arguments": {"location": "東京"}}
のようなJSONを出力する。 - 開発者: このJSONを受け取り、実際に自分のコード内で
get_weather("東京")
を実行する。 - 開発者: 実行結果(例:「晴れ、最高気温30度」)を再びLLMに渡す。
- LLM: その結果を元に、「本日の東京の天気は晴れ、最高気温は30度です」と自然な文章でユーザーに最終回答する。
実践:LangChainで自律型AIエージェントを構築する
このFunction Callingの仕組みを、より簡単に、そして強力に扱えるようにしたのがLangChainやLlamaIndexといったフレームワークです。ここでは、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エージェントに任せ、人間はより創造的な作業に集中する。
- パーソナルアシスタント: 個人のスケジュール管理、情報収集、タスク実行を代行する、真に賢いアシスタントを開発する。
- 複雑なデータ分析: データベースからのデータ抽出、分析、可視化までを自然言語の指示一つで実行する。
この技術をマスターすることは、エンジニアとして市場価値を高めるだけでなく、未来のソフトウェアのあり方を自らの手で創造する、エキサイティングな挑戦となるでしょう。
コメント