ENGINEERS' COLUMN

vol.12

公開日:2026/10/14

AIエージェントはどうやって動いているのか? “ローカルPCのみで動作を検証してみた”

  • AI

1. はじめに

「AIエージェントって、チャットAIと何が違うんですか?」この1年ほどで、何度も受けた質問です。仕事でもプライベートでもAIを触っている時間が長いので、こういう質問が回ってきます。

言葉で答えること自体はできます。「チャットAIは自分の持っている知識を元に会話を行い、AIエージェントは与えられた道具を自分で選んで行動する」という説明です。ただ、この説明で伝わったと感じたことは、あまりありません。「与えられた道具を自分で選んで行動する」と言われても、実際に何がどう動いているのかは想像しにくいのだと思います。

それなら、動いているところをそのまま見せたほうが早い。そう考えて、手元のノートPCにAIエージェントを1つ組みました。

この記事はAIエージェントの作成と動作確認の記録です。この記事を読めばAIエージェントに詳しくない方でも「こういうことか」と理解できることを目指して書いています。作成したAIエージェントのコードも記事の中で公開していますので、興味がありましたらぜひ動かしてみてください。なお作成したのは音声データから議事録を作成するAIエージェントです。

想定読者

  • AIエージェントに興味はあるが、まだ試したことがない方。
  • ローカルLLMを業務で使えないか検討している方。
  • AIエージェントの動作を実際に見てみたい方。

この記事で扱うこと

  • AIエージェント作りで使うNVIDIA NeMo Agent Toolkit(※1)の紹介と導入手順。
  • GPUなしのノートPCとローカルLLMだけで動くAIエージェントの構成
  • AIエージェントが「本当に自分で道具を選ぶのか」を確認した結果。
  • 実際に動かしてみて分かったこと3つ。

この記事で扱わないこと

  • AIエージェントの理論的な解説。
  • 各AIエージェントフレームワークの比較。
  • 商用利用を前提とした性能検証。

各種AIエージェントフレームワークの検証や比較評価などは行っていません。確かめたのは、AIエージェントが自律的に処理手順を選ぶのかという1点です。

※1NVIDIA NeMo Agent Toolkit:NVIDIA が OSS として公開しているエージェント開発フレームワーク。
公式ドキュメント https://docs.nvidia.com/nemo/agent-toolkit/latest/ / ソースコード https://github.com/NVIDIA/NeMo-Agent-Toolkit

2. エージェントの作成で使ったライブラリと前提環境

AIエージェントの作成にはNVIDIA NeMo Agent Toolkitを活用しました。実行環境はWindows 11上で作成しました。

NVIDIA NeMo Agent Toolkit とは

NVIDIA が OSS として公開しているライブラリで、AIエージェントフレームワークと連携して活用するものです。

AIに道具を持たせて動かすには、AIにどのような道具が用意されているかを説明したうえで、「AIが使う道具を考える -> 道具を使う -> 結果を元にAIが次の動作を考える」という流れを繰り返す必要があります。

このような部分を引き受けてくれるのがAIエージェントフレームワークです。ReAct(※2)の形式を守らせる、道具の呼び出しが失敗したときに戻す、道具の実行を上限回数で打ち切るなどの処理も行ってくれます。

※2ReAct:Reasoning(推論)と Acting(行動)を交互に繰り返す方式。AIが次に何をすべきか(Thought)を考え、どの道具を使うか(Action)を決め、その結果(Observation)を受けて次を考える。2022年に発表された論文:https://arxiv.org/abs/2210.03629

AIエージェントフレームワークに加えてNVIDIA NeMo Agent Toolkitを使った理由はAIの思考過程をログに出すためです。設定にverbose: true と書くだけで、AIが何を考えてどの道具を選んだのかを1手ずつ見ることができます。今回の目的は、AIが本当に自分で選んでいるのかを確かめることなので、ここが見えないと検証そのものが成り立ちません。この機能があることを条件に利用を決めました。

検証した環境

先に、どういうPCで動かしたのかを書いておきます。会社から支給されている普通のノートPCです。特別な機材は用意していません。

表1:検証環境
項目 内容
OS Windows 11 Enterprise 22631
CPU 12th Gen Intel Core i7-1265U(12スレッド)
メモリ 32 GB(※3)
ストレージ空き容量 10GB以上の空き容量
GPU なし(Intel Iris Xe 内蔵グラフィックスのみ)
Python 3.12.6(※4)
エージェント本体 nvidia-nat 1.8.0 / nvidia-nat-langchain 1.8.0(※5)
ローカルLLM実行環境 Ollama(※6) 0.32.6
使用モデル Qwen3.5:9b(※7)(6.6GB)
文字起こし faster-whisper(※8) small / CPU / int8
テスト音声 66.1秒(3節で後述)

※3メモリ16GBのPCでも動作可能

※4Pythonはバージョン3.11〜3.13を使う。Python 3.14以降と3.10以下ではpip installが失敗する。https://www.python.org/

※5NeMo Agent Toolkit の導入手順:https://github.com/NVIDIA/NeMo-Agent-Toolkit/blob/develop/docs/source/get-started/installation.md

※6Ollama:ローカル環境でLLMを実行するためのソフトウェア。https://ollama.com/

※7Qwen:アリババが開発したモデル。https://huggingface.co/Qwen/Qwen3.5-9B

※8faster-whisper:https://github.com/SYSTRAN/faster-whisper

導入の手順

AIエージェントを動作させる環境づくりは簡単です。まず最初にPython を公式サイトからダウンロードしてインストールし、続いて以下のコマンドをWindows の PowerShell で実行してOllamaをインストールします。


winget install --id Ollama.Ollama --source winget --scope user
							

Ollamaのインストールが完了したら一度PowerShellのウインドウを閉じ、再度PowerShell開いて以下を実行します。なおAIエージェントが使う道具も含めて環境を作る場合は、4. AIエージェントの設定の章で配布するファイルに含まれるSETUP.mdにある手順になります。


# 1. 作業フォルダで仮想環境を作って有効にする。
python -m venv .venv
.\.venv\Scripts\Activate.ps1

# 2. NeMo Agent Toolkit と文字起こしのライブラリを入れる。
pip install "nvidia-nat[langchain]" faster-whisper

# 3. Ollama で使うモデルを取ってくる(6.6GB あります)。
ollama pull qwen3.5:9b
							

AIエージェントで使うモデルの取得には15分~35分ほどかかりました。 文字起こしに使う faster-whisper は、OpenAI の音声認識モデル Whisper を高速に動かす実装です。こちらは個別の導入作業が要らず、初回の実行時にモデルが自動でダウンロードされます。

3. AIエージェントの構成

環境が整ったので、次は何を動かすかです。「はじめに」で少し触れましたが、今回は題材として音声データから議事録を作成するエージェントを作りました。

議事録作成エージェントを題材とした理由

議事録づくりには、文字起こしする、要約する、決定事項を抜き出す、という手順があります。さらに文字起こしをする前に要約はできないので、順番の入れ替えができません。

これはAIエージェントの検証にうってつけです。手順が複数あるので、AIが自分で順番を決める余地があります。そして正解の順番は一つに決まっていて、AIが自力でそこに辿り着けるかを判定することができます。1手で終わる仕事では、この両方が見られません。

エージェントの構成

AIエージェントに指示を行うと、音声ファイルの文字起こし、要約、決定事項とToDoの抽出まで行い、議事録を返します。

図1 議事録作成エージェントの構成

議事録作成エージェントの構成

AIエージェントが道具として使う文字起こし、要約、ToDo抽出の部分はPythonにて作成しました。

図の①から③は、このエージェントに期待する道具の実行順序です。AIがどの道具をいつ使うかを自分で決めたことを確認するため、設定ファイルで順序は指定しません。

表2:各部品の役割と使用したソフトウェア
役割 担当する部品 使用したもの 実行場所
司令塔(手順を決める) エージェント本体 NeMo Agent Toolkit(ReAct) PC内
耳(音声を文字にする) 文字起こし faster-whisper small / CPU / int8 PC内
頭脳(要約・抽出) 要約、ToDo抽出 Ollama + Qwen3.5:9b PC内

司令塔も、道具と同じローカルモデルを使います。次に何をするかという判断そのものを、手元のCPUで行っています。

完全ローカル構成にした理由

今回の検証にあたって、AIエージェントの実行はすべてローカルPC内で完結させました。そのような構成とした理由は2つあります。

1つは、会議の音声とその内容を外部へ送信せずに済むことです。機微な情報が含まれる可能性があるため、安全であることを説明できる構成にしたいと考えました。

もう1つは費用です。試行回数を気にせず検証できます。実際、モデルを替えながら何十回と実行しましたが、請求は発生していません。

なお NeMo Agent Toolkit は、初回起動時に匿名の利用統計を送信してよいかを確認してきます(※9)。外部に出さないという前提と揃えるため、無効にしました。

※9匿名の利用統計(テレメトリ):コマンド名や所要時間などが送信されるが、入力内容やファイルパスは含まれない。設定状態は nat configure telemetry --status で確認可能。

テストに使った音声

今回の検証においては本物の会議の録音は使っていません。代わりに架空の文化祭の打ち合わせの台本を作り、Windowsの音声合成に読み上げさせた66.1秒の音声を用意しました。田中さんと佐藤さんが文化祭の出し物を決める、という内容です。

4. AIエージェントの設定

構成が決まったので、これをNVIDIA NeMo Agent Toolkitの設定ファイルに落とします。ここからは実際の設定ファイルの内容を抜粋して紹介します。実際の設定ファイルやその他のコード、ドキュメントをここからダウンロード(ZIP、SHA256)できるので、併せてみるとわかりやすいと思います。以下はファイルの構成と簡単な説明です。

C:.
└─transcribe-agent
    │  DISCLAIMER.md
    │  LICENSE
    │  pyproject.toml
    │  requirements-lock.txt
    │  SETUP.md <- 実行環境の作り方とAIエージェントの実行方法
    │
    ├─configs <- NVIDIA NeMo Agent Toolkitの設定ファイル
    │      config.yml
    │      config_minutes_local.yml
    │
    ├─samples <- 音声データのサンプル
    │      meeting_01.wav
    │
    └─src <- AIエージェントが使う道具 of Pythonプログラム群
        └─transcribe_agent
            │  register.py
            │  __init__.py
            │
            └─tools
                summarize_text.py
                transcribe_whisper.py
                 __init__.py

使う道具の指定

まずAIエージェントが使う3つの道具を以下のように書きます。

functions:
# 耳:音声を文字にする
transcribe_whisper:
 _type: transcribe_whisper
 model_size: small
 device: cpu
 compute_type: int8
 language: ja
						 
# 頭脳①:要約する
summarize_transcript:
 _type: summarize_text
 llm_name: local_llm       # 使うモデルは、この1行で決まる
 mode: summary
						 
# 頭脳②:決定事項とToDoを抜き出す
extract_action_items:
 _type: summarize_text
 llm_name: local_llm       # 同上。コードは共通
 mode: actions

要約とToDo抽出は、同一のPythonコードを modeで切り替えて使っています。

使うモデルの指定

次に使うモデルを別のブロックに以下のように書きます。

llms:
 local_llm:
 _type: openai
 base_url: http://localhost:11434/v1
 api_key: ollama
 model_name: qwen3.5:9b
 temperature: 0.0 
 max_tokens: 1024
 reasoning_effort: none

Ollama は OpenAI 互換のエンドポイントを持つため、openai プロバイダの接続先をローカルへ向けるだけで使えます。

末尾の reasoning_effort は、Qwen3以降で既定になっている「答える前に考える」モードを止める指定です。これを書かないと、CPUで動かした場合は考えるだけで出力の上限に達し、本文が空のまま返ってきました。

エージェントの設定

そして、使うことができる道具の情報をエージェントに渡します。

workflow:
 _type: react_agent
 llm_name: local_llm
 tool_names:
  - transcribe_whisper
  - summarize_transcript
  - extract_action_items
 verbose: true
 max_tool_calls: 8

tool_names に3つ並べているだけで、実行順序はどこにも書いていません。ここが今回の検証の中心です。

5. 実行してみる

設定ができたので、AIエージェントを動かします。仮想環境を有効にしてから、nat runコマンドに設定ファイルと指示文を渡します。

(.venv) PS C:\work\transcribe-agent> nat run --config_file
configs\config_minutes_local.yml --input "meeting_01.wav の議事録を作ってください"

指示は --input に渡した1行だけです。道具の名前も、実行する順番も書いていません。

AIが手順を決めていく様子を見る

設定ファイルでverbose: true と指定しているので、AIの思考がログとして表示されます。以下は実際のログから、関連部分を抜き出したものです。

[AGENT]
Agent input: meeting_01.wav の議事録を作ってください
Agent's thoughts:
Thought: まず音声ファイルを文字起こしする必要があります。そのために transcribe_whisper を使用します。
Action: transcribe_whisper
Action Input: {'file_name': 'meeting_01.wav'}
Thought: 文字起こしが完了しました。次に、このテキストを要約し(summarize_transcript)、
決定事項とToDoを抽出する(extract_action_items)必要があります。まず要約を行います。
Action: summarize_transcript
Thought: 要約が完了しました。次に extract_action_items を使用して、
決定事項とToDoを抽出します。
Action: extract_action_items

設定ファイルには3つの道具が並んでいるだけです。それでもAIエージェントは、文字起こしから要約、そして抽出という順番を自分で組み立てました。しかも2手目の時点で、残り2つの道具を両方使うと決めて、そのうち要約を先にやると判断しています。

最終的な出力は次のとおりです。

Workflow Result:
## 要約
文化祭りの出し物について議論しました。田中さんが「もぎ天(焼そばとクレープ)」の案を提案し、
佐藤さんは準備負担が小さいとして展示への意見を述べました。予算は 3 万円以内との決まりが
ありましたが、最終的にもぎ天で進めることになりました。メニューは焼そばに決定しました。
担当割り当てでは、田中さんが材料買い出し(来週金曜日まで)を、佐藤さんは看板とポスターの
作成(再来週まで)を担当します。次回打ち合わせは来週水曜日の放課後です。
							 
## 決定事項とToDo
*   文化祭りの出し物として「もぎ天」を決定し、メニューは「焼そば」とする。
*   予算上限を 3 万円に設定する。
*   材料の買い出し:担当者(田中さん)、期限(来週の金曜日)
*   看板とポスターの作成:担当者(佐藤さん)、期限(再来週まで)

担当者と期限まで拾えています。音声に存在しない内容を作り出すこともありませんでした。

一部文字起こしで誤りがありますが、動作確認として期待する結果になりました。

依頼文を変えても、同じ順番で道具を使うのか

1回成功しただけでは、たまたま上手くいったのかもしれません。そこで依頼文を変えて3回実行しました。

表3:依頼文を変えた3回の実行結果
回 --input に渡した依頼文 所要時間 AIが選んだ順番 議事録として成立
1 meeting_01.wav の議事録を作ってください 346.9秒 文字起こし → 要約 → 抽出 ○
2 meeting_01.wav を文字起こしして、要約して、決定事項とToDoを出してください 429.1秒 同上 ○
3 meeting_01.wav を聞いて、何が決まったのか、誰が何をやるのかをまとめて 420.4秒 同上 ○

3回とも同じ順序を選び、決定事項2件とToDo2件を正しく抽出しました。担当者と期限にも誤りはありません。

一方、出力は毎回わずかに揺れました。ToDo抽出では 【決定事項】 と 【ToDo】 という見出しを付けて返しているのですが、最終回答ではこの見出しが落ちて、1つの箇条書きにまとめられる回があります。LLMのパラメータでtemperature (※10)を 0.0 にしていても、完全に同一の出力にはなりません。後続の処理はこのような揺れがあることを前提に作る必要があります。

※10temperature:AIがどれくらい多様な答えを返すかを決める値。0.0にすると最も決まった答えを返すようになるが、それでも出力が毎回完全に一致とはならなかった。

6. 実際に動かしてみての気づき

今回AIエージェントを実際に動かしてみたことで、マニュアルなどではわからない気付きがいくつかありました。

道具を使う時間よりも考えている時間が長い

66.1秒の音声から議事録が出るまで、346.9秒から429.1秒(およそ6分から7分)かかりました。何にそれだけかかっているのか、1回目の実行ログのタイムスタンプから拾いました。

表4:処理時間の内訳(1回目・全体346.9秒)
工程 内容 所要時間
準備 Whisperモデルの読み込み、ワークフローの構築 9秒
思考① まず文字起こしをする、と判断 47秒
実処理① 文字起こし 21.9秒
思考② 次は要約とToDo抽出だ、まず要約から、と判断 68秒
実処理② 要約 28秒
思考③ 次はToDo抽出だ、と判断 69秒
実処理③ 決定事項とToDoの抽出 20秒
思考④ 3つの結果をまとめて最終回答を作る 84秒
合計 346.9秒

道具が実際に働いていた時間は合計で約70秒です。全体の2割にすぎません。残りの時間は準備が9秒、AIが次に何をするかを考えている時間が268秒でした。

今回AIエージェントが与えられた道具を自分で選んで行動することを検証するために議事録を作成するエージェントを作りましたが、作業の順番が決まっているものについてはAIエージェントではなく順番に処理を呼び出すプログラムで行うほうが短時間で完結できそうです。

私は、順序が事前に決まらない仕事にこそエージェントは適していると考えています。

指示していないことはできないこともある

道具を1つだけ渡した動作確認の段階で、ReActの形式は正しく守られているのに、Thought も Final Answer もすべて中国語で返ってきました。

文字起こしの結果は日本語だったので、音声認識ではなくモデル側に理由があると切り分けられます。使っていた Qwen 系は中国で開発されたモデルなので、それが要因かもしれません。

エージェントへの指示に「Thought、Final Answer など、あなたが書く文章はすべて日本語で書いてください。」という1文を加えたところ、回答が日本語で行われるようになりました。道具の選択はAIエージェントが自動的に判断してくれましたが、指示していなければできないこともありました。日本語で答えてほしいならそう書く必要がありました。

文字起こしの誤変換が、次のAIにそのまま引き継がれた

文字起こしの精度はおおむね良好でしたが、いくつか誤変換がありました。「文化祭」が「文化祭り」になり、「模擬店」が「もぎ天」になりました。どちらも音としては合っています。

問題はこの先です。要約を担当したモデルが、この「もぎ天」を天ぷらの一種と解釈し、そのまま要約に反映しました。実際の出力では「もぎ天(焼そばとクレープ)」となっていて、おかしい結果になっていることが見て取れます。

要約するモデルは音声を聞いていません。渡されたテキストを信じるほかなく、前の工程の誤りに気づく手段がないためです。複数のAIを直列につなぐと、前の工程の誤りが後の工程にそのまま流れていきます。エージェントを組むこと自体は設定ファイルだけでできましたが、出てきた議事録が正しいかを確かめるのは、私たちの側の仕事として残ります。

7. まとめ

今回の検証で確認できたことを整理します。

  • 順序を指定しなくても、エージェントは3つの道具を正しい順番で使った。依頼文を変えた3回とも同じ結果だった。
  • 一方で、処理時間の8割近くは、次に何をするかを考える時間だった。
  • 出力の書式は毎回わずかに揺れる。また、前の工程の誤変換は後の工程にそのまま引き継がれる。

AIエージェントは、魔法のように仕事をしてくれる存在ではありません。人が用意した道具を組み合わせて業務を進める仕組みです。道具がなければ何もできません。今後AI活用が広がるなかで、モデルそのものを新しくするより、業務をどのように分解し、どの道具を用意するかを考えるほうが効いてくるのではないか、と今は考えています。この部分は、これまでのシステム開発と地続きです。

実際に動かしてみて気づいたことがいくつもありました。待ち時間の内訳も、中国語で返ってきた件も、事前に資料を読むだけでは出てきません。表1のとおり特別な機材は要らないので、気になった方は手元のPCで試してみてください。AIエージェントを知るきっかけになれば幸いです。

AIについては、まだ書けることが多く残っています。また別の切り口から取り上げてみたいと思います。

本記事で紹介したOSSは、各ライセンスに基づいて利用しています。詳細は各公式ドキュメントをご参照ください。本記事の内容は検証を目的としたものです。商用利用や再配布の際は、各OSSのライセンス条項をご確認ください。

※本ページに記載されている社名、製品名などは、一般に各社の表示、商標または登録商標です。

笠川 武史

著者情報

笠川 武史

クラウドソリューション部 クラウドソリューションサービス第1課

2023年入社
2023・2024・2025 Japan All AWS Certifications Engineers受賞

このコラム記事に関する
お問い合わせはこちら

このコラムを面白いと思ったあなたへ。
技術に真摯に向き合う仲間を募集しています。
私たちと一緒に、次の挑戦をしませんか?

ENGINEERS' COLUMN 記事一覧