第1週では、ローカルLLMを使ってチャットを実行し、JSON形式で出力を制御する方法を学びました。
これにより、AIの返答を「読む」だけでなく、「プログラムで扱う」ための準備が整いました。
しかし、この段階ではまだAIは「答えるだけ」の存在です。
AIエージェントとして機能させるためには、判断した内容をもとに実際の処理を実行する仕組みが必要になります。
本記事では、ローカルLLMにツール(関数)を呼び出させることで、
AIが「考えるだけでなく、実際に動く」仕組みを実装していきます。
AIエージェントとは
AIエージェントとは、ユーザーの指示をもとに自ら判断し、必要な処理を実行して目的を達成する仕組みです。
第2週では、その判断結果をもとに「ツール(関数)を呼び出して処理を実行する」ステップを学びます。
| 週 | 内容 |
|---|---|
| 第1週 | チャット + JSON出力 |
| 第2週 | ツール(関数)呼び出し |
| 第3週 | ループ型エージェント |
| 第4週 | マルチエージェント |
作業環境について
本記事は、第1週の内容を前提として進めています。
そのため、以下の環境がすでに整っている状態を想定しています。
- ローカルLLM実行環境:Ollama
- 使用モデル:qwen3
- Python仮想環境(venv)
- ollama Pythonライブラリのインストール済み
作業環境の準備ができていない場合
第1週の記事で、環境構築からJSON出力までを解説しています。
未実施の場合は、先に第1週から進めることをおすすめします。
AIエージェント入門|ローカルLLMで学ぶチャットとJSON出力【第1週】
第2週のゴール
この週では、AIエージェントの「行動する仕組み」を理解します。
具体的には、次の3つができる状態を目指します。
- AIが必要な処理を判断できる
- 判断結果に応じて関数を呼び出せる
- 処理結果をもとに次の応答を生成できる
なぜツール呼び出しが重要なのか?
本当にやりたいことは「実行」
第1週では、AIがタスクを整理し、JSON形式で返すところまでできるようになりました。
しかし、その結果は次のように「データとして返ってくるだけ」です。
{
"task": "牛乳を買う",
"priority": "high"
}このままでは、画面に表示されるだけで、実際には何も起きません。
このデータをどう使うか?
ここで重要なのは、このデータをもとに次の処理を行うことです。
例えば、次のような処理につなげることができます。
タスクを追加する
↓
データとして保存する
↓
一覧に反映するつまり何が必要か
ただ情報を整理するだけでなく、その内容をもとにプログラムとして実際に動かす必要があるということです。
つまり、AIの出力は「次の処理を決めるための情報」にすぎません。
解決策:ツール(関数)を呼ぶ
ここで必要になるのが、「ツール(関数)を呼び出す」という仕組みです。
まずAIは、ユーザーの指示をもとに 「どの処理を行うべきか」を判断します。
例えば、
牛乳を買うタスクを追加してという入力に対して、AIは次のように考えます。
「この場合はタスクを追加する処理が必要」
実際の処理はPythonが行う
そして、その判断をもとに、実際の処理を実行します。
add_todo("牛乳を買う")関数の実行これにより、
- タスクが追加される
- データが更新される
といった「行動」が発生します。
AIが「指示を出し」、プログラムが「実行する」ことで、初めてエージェントとして動くようになります。
ユーザー入力
↓
AIが判断
↓
呼び出す関数を決定
↓
Pythonが実行
↓
結果をAIに戻す
↓
AIが最終回答
実装してみる
ここでは、AIが判断した内容をもとに、実際に関数を呼び出す仕組みを実装します。
流れはシンプルで、次の5ステップです。
関数を用意 → AIに教える → AIが選ぶ → 受け取る → 実行する
ステップ1:ツール関数を作る
まずは、実際に動かす処理(関数)を用意します。
ここでは、タスク管理を行うToDo処理を想定しています。
def add_todo(task: str) -> str:
return f"タスクを追加しました: {task}"この関数は、タスクを受け取って「追加しました」と返すだけのシンプルなもので、ファイル保存はまだ行っていません。
ステップ2:ツール定義を書く
次に、この関数をAIに教えます。
TOOLS = [
{
"type": "function",
"function": {
"name": "add_todo",
"description": "新しいToDoを追加する",
"parameters": {
"type": "object",
"properties": {
"task": {"type": "string"}
},
"required": ["task"]
}
}
}
]これは、 「こういう関数が使えますよ」とAIに説明している部分になります。
ステップ3:chatにtoolsを渡す
次に、AIにこのツール情報を渡します。
response = chat(
model="qwen3",
messages=messages,
tools=TOOLS,
)chat関数は、AI(Ollama サーバー:http://localhost:11434)とAPI通信を行い回答を受け取ります。
messages=messages:AIに渡す質問を設定tools=TOOLS:AIが利用できる関数(ツール)のリストを設定response:AIの判断により下記の内容が出力される。
・AIがツールを使う必要がないと判断した場合:普通の回答テキスト
・AIがツールを使う必要があると判断した場合:「どのツールを、どんなパラメータで呼び出したいか」という指示書
これによってAIは、関数の存在を知り必要なら使うことができるようになります。
注意点: AIが勝手にツールを「実行」するわけではありません。
AIは「この質問に答えるには、このツールをこの引数で使う必要がある」と判断するだけです。
ステップ4:ツール呼び出しを受け取る
AIから返ってきたレスポンスを解析し、「AIが関数(ツール)の実行が必要かどうか」をチェックする。
message = response["message"]
tool_calls = message.get("tool_calls", [])message = response["message"]:responseの中から、辞書データを取り出す。tool_calls = message.get("tool_calls", []):AIが「関数(ツール)実行が必要」と指示してきた内容をリスト形式で取得。
ステップ5:関数を実行する
AIの判断に従って、実際に関数を実行します。
for tool_call in tool_calls:
name = tool_call["function"]["name"]
args = tool_call["function"]["arguments"]
if name == "add_todo":
result = add_todo(args["task"])AIが選んだ関数名を取得し引数を取り出したあとに、関数を実行します。
完成コード
以上の5ステップを1つにまとめた完成コード(tool_agent.py)は以下の様になります。
tool_agent.py
from ollama import chat
def add_todo(task: str) -> str:
"""ToDoを追加した体で結果を返すサンプル関数"""
return f"タスクを追加しました: {task}"
TOOLS = [
{
"type": "function",
"function": {
"name": "add_todo",
"description": "新しいToDoを追加する",
"parameters": {
"type": "object",
"properties": {
"task": {
"type": "string",
"description": "追加するタスクの内容"
}
},
"required": ["task"]
}
}
}
]
messages = [
{
"role": "system",
"content": (
"あなたはToDo管理アシスタントです。"
"ユーザーの依頼に応じて、必要なら関数を使ってください。"
),
},
{
"role": "user",
"content": "牛乳を買うタスクを追加して",
},
]
response = chat(
model="qwen3",
messages=messages,
tools=TOOLS,
)
message = response["message"]
tool_calls = message.get("tool_calls", [])
if not tool_calls:
print("AIは関数を呼び出しませんでした。")
print("AIの返答:")
print(message.get("content", ""))
else:
for tool_call in tool_calls:
name = tool_call["function"]["name"]
args = tool_call["function"]["arguments"]
if name == "add_todo":
result = add_todo(args["task"])
print("関数の実行結果:")
print(result)関数の実行
Git Bashで、保存したフォルダに移動してから実行します。
./.venv/Scripts/python.exe tool_agent.py上記コマンドは、第1週で構築したPython仮想環境での実行例です。
Python仮想環境の構築に関しては、第1週ステップ5およびステップ6を参考にしてください。
正常に動けば、AIからの返答がターミナルに表示されます。
実行例
うまくいくと、例えば次のように表示されます。
関数の実行結果:
タスクを追加しました: 牛乳を買う第2週のまとめ
この週では、AIエージェントの「行動する仕組み」を学びました。
重要なのは次の3つです。
1. AIはツールを選べる
AIは状況に応じて「どの関数(ツール)を使うか」を判断できます。
2. 実際の処理はPythonが行う
AIは実行しません。
あくまで「指示」を出すだけです。
3. AIとプログラムが連携する
ここで初めて、AIが「実際に動く存在」になります。
ひとことでまとめると、 AIが「考え」、プログラムが「動く」仕組みが完成した段階です。
ここまでで、AIは「判断して行動する」ことができるようになりました。
しかし、現時点ではまだ1回の処理で終了する単発の動きです。
次のステップでは、AIが状況に応じて何度も考え直しながら処理を続ける仕組みを作ります。
第3週では「ループ型エージェント」を実装します。
AIエージェント入門|ループ型エージェントの作り方【第3週】
