LLMが抱える「静的な知識」という限界
現在のLLM(大規模言語モデル)は、膨大なテキストデータを学習しており、高度な文章生成や要約が可能です。しかし、実務でAIを活用する際には大きな課題に直面します。それは、LLMが「リアルタイムの情報にアクセスできない」こと、そして「外部のシステムを直接操作できない」という点です。
例えば、最新の株価、社内データベースの情報、あるいは特定のシステムでのタスク実行などは、LLM単体では処理できません。この「静的な知識の限界」を解消し、AIを単なるテキストジェネレーターから、実務をこなす自律的な「AIエージェント」へと進化させる技術が、**「Function Calling(関数呼び出し)」**です。
外部世界とAIを繋ぐ「Function Calling」の全体像
「Function Calling」は、LLMがユーザーの入力(プロンプト)を分析し、必要に応じてあらかじめ定義された「関数(APIやプログラム)」を呼び出すためのパラメータを自動生成する仕組みです。
AIを単一のツールとしてではなく、周囲のアプリケーションと協調する**「エコシステム」**として捉える視点が、現代のAIシフトにおいて重要視されています。
一般的な処理フローは以下の通りです。
- ユーザーからのリクエスト: ユーザーが「東京の現在の天気を教えて」と入力します。
-
スキルの判定とパラメータ抽出: LLMは、自身に提供されている関数のリスト(メタデータ)を参照し、天気を取得する関数(例:
get_weather)を実行すべきだと判断します。そして、引数として「東京」を抽出します。 - 関数の実行: アプリケーション(プログラム側)がLLMの指示を受けて実際のAPIを実行し、結果(例:晴れ、25度)を取得します。
- 最終回答の生成: 実行結果をLLMにフィードバックし、LLMが自然な日本語で回答を生成します。
この仕組みにより、開発者はLLMに対して安全かつ制御可能な形で外部の「スキル」を拡張できます。
3つのステップで学ぶFunction Callingの実装
それでは、PythonとOpenAIのAPIを使用した、シンプルかつ具体的な実装方法を解説します。
ステップ1:関数の定義とメタデータの記述
まず、LLMに実行させたい具体的な処理(関数)を定義します。同時に、LLMがその関数を「いつ、どのように使うべきか」を理解できるように、メタデータをJSONスキーマ形式で記述します。
# 実行したい実際の関数
def get_current_weather(location):
# 本来は外部APIを叩く処理。ここでは簡略化して固定値を返します
if "東京" in location:
return "晴れ、気温は25度です"
else:
return "曇り、気温は20度です"
# LLMに伝えるための関数の定義(メタデータ)
tools = [
{
"type": "function",
"function": {
"name": "get_current_weather",
"description": "指定された場所の現在の天気を取得する",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "都市名(例:東京、大阪)"
}
},
"required": ["location"]
}
}
}
]
ステップ2:LLMによる関数の選択とパラメータ生成
次に、ユーザーの入力を受け取り、定義した tools を含めてLLMにリクエストを送信します。
import openai
client = openai.OpenAI()
messages = [{"role": "user", "content": "東京の天気を教えてください"}]
response = client.chat.completions.create(
model="gpt-4o",
messages=messages,
tools=tools,
tool_choice="auto"
)
response_message = response.choices[0].message
tool_calls = response_message.tool_calls
LLMは直接関数を実行するわけではなく、「どの関数を、どの引数で呼び出すべきか」という情報を tool_calls として返します。
ステップ3:プログラムによる関数の実行と結果の返却
LLMから返された指示に基づき、プログラム側で実際の関数を実行し、その結果をLLMに送り返して最終的な返答を得ます。
if tool_calls:
# 呼び出すべき関数の情報を取得
tool_call = tool_calls[0]
function_name = tool_call.function.name
import json
function_args = json.loads(tool_call.function.arguments)
# 該当する関数を実行
if function_name == "get_current_weather":
function_response = get_current_weather(
location=function_args.get("location")
)
# 履歴に応答と実行結果を追加
messages.append(response_message)
messages.append({
"tool_call_id": tool_call.id,
"role": "tool",
"name": function_name,
"content": function_response,
})
# LLMに結果を渡して、最終的な自然言語の回答を生成させる
second_response = client.chat.completions.create(
model="gpt-4o",
messages=messages,
)
print(second_response.choices[0].message.content)
この一連の流れにより、LLMは自身の知識の範囲外である「リアルタイムの天気情報」を取り込み、正確な回答を出力できます。
ビジネス価値の最大化:Function Callingがもたらす変革
Function Callingは、単なる技術的な機能に留まりません。企業の基幹システムやデータベース、SaaSツールとLLMをシームレスに結合させることで、ビジネスプロセス全体を自律化する鍵となります。
例えば、カスタマーサポートにおいて「注文状況の確認」というスキルを定義すれば、AIが顧客の本人確認を行い、データベースを検索し、配送状況を自動で回答できるようになります。これは従来の静的なチャットボットとは一線を画す、真の「自律型AIエージェント」の誕生を意味します。
安全なAPI設計と適切なメタデータ管理を行うことで、AIのポテンシャルを最大限に引き出す堅牢なシステム構築が可能になります。