- AI エージェントは通常、ツールと目標を備えたループ内で実行される言語モデルです。
- ループはシンプルです。決定し、行動し、結果を観察し、完了するまで繰り返します。
- モデルはアクションを提案するだけです。コードがそれらを実行し、そこでルールを強制します。
- エージェントはツールをループしたり誤用したりする可能性があるため、歩数制限を設定し、危険なアクションについては承認を必要とします。
注文が遅れたことについてチャットボットに質問すると、いくつかのアドバイスが得られます。 AI エージェントに依頼すると、注文を検索し、遅延を確認し、バウチャーを適用してレポートを返します。違いは、エージェントは 1 つの応答だけを生成するのではなく、アクションを実行し、発生したことに反応できることです。
この用語はマーケティングでは拡張されているため、このガイドではこれらのシステムが実際にどのように機能するかについて説明します。具体的にするために、Python 3.13 で小さなエージェント ループを構築して実行しました。以下の出力はそれらの実行から得られます。 私たちの「モデル」はスクリプト化された関数であり、実際の AI モデルではありません。そのため、誰でもループを実行してテストできます。それは知性ではなく、制御構造を示します。基本的なことは初めてですか?最初に大規模言語モデルとはをお読みください。
AIエージェントとは何ですか?
合意された単一の定義はありません。現在の実践では、AI エージェントは、次に何をするかを繰り返し決定し、ツールを使用して世界に作用し、結果に基づいて調整することで目標を追求するソフトウェアです。通常、意思決定は大規模な言語モデルに基づいて行われます。
道案内をする人と使い走りをする人との違いを考えてみましょう。最初の人は一度答えます。 2人目は店を出て、店が閉まっていることに気づき、別の店を試し、仕事が終わってから戻ってきます。
チャットボット、ワークフロー、それともエージェント?
| 種類 | ステップは誰が決めるのですか? | それは行動できるでしょうか? | 例 |
|---|---|---|---|
| チャットボット | ユーザーは毎ターン運転します | 通常はそうではありません | テキストからの質問に答える |
| 固定ワークフロー | 開発者は事前に | はい、設定されたパス上で | 各チケットを要約してルーティングする |
| AIエージェント | 実行時のモデル | はい、制限内で | チケットを調査して解決します |
これらはスペクトル上に存在し、多くの便利なシステムが混在しています。重要な問題は、パスのどの程度が実行時に決定されるかということです。
エージェントの内部にあるもの
| パート | 役割 |
|---|---|
| モデル | 目標とこれまでに起こったことに基づいて次のステップを決定します |
| 指示 | 従うべき目標、ルール、制限 |
| ツール | APIの検索や呼び出しなど、リクエストできる機能 |
| 記憶 | 以前のステップまたは過去のセッションからわかっていること |
| 制御ループ | ツールを実行して制限を適用する通常のコード |
エージェントループ
- 決定します。 モデルは目標と履歴を見て、アクションを選択するか、それが終了したかを判断します。
- 動作 コードは、要求されたツールを実行します。
- 観察します。 結果は履歴に追加されます。
- 目標が達成されるか、制限に達するまで繰り返します。
それがほとんどのエージェントの中核です。洗練さは主に、モデル、ツール、およびこのループ周りの安全装置にあります。
実行できるループ
当社の小規模代理店は遅れた注文にも対応します。これには 2 つのツールがあり、そのうちの 1 つはコストがかかるため人間の承認が必要です。
ORDERS = {
"A100": {"status": "delayed", "days_late": 6},
"B200": {"status": "shipped", "days_late": 0},
}
def get_order(order_id):
return ORDERS.get(order_id, {"error": "order not found"})
def issue_voucher(order_id, amount):
return {"voucher": f"V-{order_id}", "amount": amount}
TOOLS = {"get_order": get_order, "issue_voucher": issue_voucher}
NEEDS_APPROVAL = {"issue_voucher"}
そして、これがループ自体です。これは通常のコードであり、すべての安全ルールはモデル内ではなくここに存在します。
def run_agent(goal, model, approve, max_steps=5):
history = []
for step in range(1, max_steps + 1):
decision = model(goal, history)
if "finish" in decision:
return decision["finish"]
name, args = decision["tool"], decision["args"]
if name in NEEDS_APPROVAL and not approve(name, args):
result = {"denied": True}
else:
result = TOOLS[name](**args)
history.append({"tool": name, "result": result})
return None # stopped: step limit reached
実際のモデルを使用するには、model 関数を LLM API の呼び出しに置き換え、ツールの目標、履歴、説明を渡します。ループはほぼ同じままです。
私たちのランニングで何が起こったのか
スクリプト化された決定機能を使用して 5 つの状況を試し、各ステップを記録しました。
伝票が承認されたにもかかわらず注文が遅れた
step 1: get_order({'order_id': 'A100'}) -> {'status': 'delayed', 'days_late': 6}
step 2: issue_voucher({'order_id': 'A100', 'amount': 200}) -> {'voucher': 'V-A100', 'amount': 200}
step 3: finish -> Sorry for the delay. Voucher V-A100 issued.
各ステップでは、その前のステップの結果が使用されました。バウチャーは遅延が確認されてからのみ考慮されます。
同じ注文で承認が拒否されました
step 2: issue_voucher({'order_id': 'A100', 'amount': 200}) -> {'denied': True}
step 3: finish -> Your order is late. A person will review compensation.
人間は「いいえ」と答え、ツールは決して実行されず、エージェントはその応答を調整しました。
不明な注文
step 1: get_order({'order_id': 'Z999'}) -> {'error': 'order not found'}
step 2: finish -> I could not find that order.
ツールに明確なエラー メッセージを表示すると効果的です。実際のモデルは、推測ではなく、それらを読み取り、賢明に応答できます。
行き詰まったモデル
また、同じアクションを永遠に繰り返す欠陥のある決定関数も置き換えました。
step 1: get_order({'order_id': 'B200'}) -> {'status': 'shipped', 'days_late': 0}
step 2: get_order({'order_id': 'B200'}) -> {'status': 'shipped', 'days_late': 0}
step 3: get_order({'order_id': 'B200'}) -> {'status': 'shipped', 'days_late': 0}
stopped: step limit reached
エージェントは実際にこのようなループに陥る可能性があり、実際のモデルを使用する各ステップにはコストがかかります。 max_steps がなければ、この作品は決して終わることはなかったでしょう。
ツールの仕組み
これが最も誤解されている部分です。言語モデルはそれ自体では何も実行できません。どのツールがどのような引数とともに必要かを示す構造化テキストを生成します。 コードによって、それを実行するかどうかが決まります。このため、ループは権限、検証、ログ記録に適した場所となります。
モデルプロバイダーは、このためのツールまたは関数呼び出しを提供します。モデル コンテキスト プロトコル (MCP) は、モデルをツールやデータに接続するためのオープン スタンダードであり、Playwright MCP に関する記事で 1 つの使用方法が示されています。モデルはツール名と説明に依存して正しく選択されるため、明確なツール名と説明を記述します。
ヒント: 読み取り専用ツールから始めます。情報を調べることしかできないエージェントは、送信、削除、支払いができるエージェントよりも危険性がはるかに低いです。動作を確認したら、一度に 1 ツールずつ書き込みアクセスを追加します。
記憶
| 種類 | ホールド | 例 |
|---|---|---|
| 短期 | 現在のタスクの履歴 | ループ内の history リスト |
| 長期 | セッション間で事実が保持される | データベース内のユーザー設定 |
| 知識 | 必要なときに取り出せる書類 | 埋め込みを使用したRAG |
長いタスクはモデルのコンテキスト ウィンドウを超える可能性があるため、システムは古いステップを要約することがよくあります。概要では詳細が失われる可能性があり、これが、長期にわたって実行されるエージェントがコースから外れてしまう原因の 1 つです。
マルチエージェントシステム
一部のシステムでは、プランナー、研究者、レビュー担当者など、複数の専門エージェント間で作業を分割します。これは、きれいに分割された大規模なタスクに役立ちます。また、コストがかかり、失敗する可能性が増え、デバッグが難しくなります。最初は優れたツールを備えた 1 つのエージェントを試し、明確な理由がある場合にのみ分割します。
リスクと限界
- 間違ったアクション。 チャットボットの間違いは悪い文章です。エージェントの間違いは、電子メールの送信やレコードの削除である可能性があります。
- プロンプト挿入。 エージェントが読む Web ページまたは電子メールには、隠された指示が含まれている可能性があります。すべてのツール出力をコマンドとしてではなく、信頼できないデータとして扱います。
- 複合的なエラー。 初期段階で小さなエラーが発生すると、その後のすべてのステップが間違った方向に進む可能性があります。
- コストとレイテンシ。 各ステップは別のモデル呼び出しになる可能性があるため、タスクは単一のプロンプトよりもはるかに遅くなり、コストが高くなる可能性があります。
- 矛盾。 同じ目標でも実行ごとに異なるパスをたどる可能性があり、テストが困難になります。
- 説明責任。 ユーザーはシステムの動作に対して引き続き責任を負うため、記録を保管してください。
重要なガードレール
- 最小限の権限。 各エージェントに必要なツールとアクセスのみを与えます。
- 私たちのデモのように、コストがかかるもの、取り消しできないもの、外部のものに対する人間の承認。
- 歩数、時間、支出に対する厳しい制限。
- コード内でツール入力を検証し、モデルへの指示に依存しません。
- すべてのステップを記録し、何かが起こった理由を確認できるようにします。 モニタリングと可観測性を参照してください。
- 失敗を含む実際のシナリオでテストします。最終結果と個別の返信を確認します。 AI エージェントのベスト プラクティス に関するガイドでは、展開についてさらに詳しく説明します。
エージェントを使用する場合
| こんなときにエージェントを利用する | 次の場合には、より単純なものを使用してください |
|---|---|
| 手順を事前に知ることはできません | 手順はいつも同じです |
| このタスクにはいくつかのツールが必要です | 1 つのプロンプトで作業を完了できます |
| 結果が次に起こることを変える | 固定されたワークフローが機能する |
| 間違いは安い、または見直すことができる | エラーはコストが高く、元に戻すのが困難です |
コーディング アシスタントは、ファイルを読み取り、テストを実行し、失敗を確認して再試行し、人間が結果をレビューすることができるため、現在最も成熟した例の 1 つです。テストスイートは、成功の明確なシグナルを与えます。 迅速なエンジニアリングに関するガイドは、エージェントに適切な指示を作成する場合にも当てはまります。適切にプロンプトされた 1 回の電話は、複雑なエージェントよりも優れていることが多いため、効果的な最も単純なことから始めてください。
まとめ
AI エージェントは、思っているほど神秘的ではありません。モデル、いくつかのツール、および制限のあるループです。難しいのはコードではなく信頼です。それらがどのように動作するかを知るには、小さなループを取得し、読み取り専用ツールを使用して実際のモデルに接続し、動作するログを観察します。それがどこで輝いているのか、どこに人間が必要なのかがすぐにわかるでしょう。
よくある質問
AI エージェントとは簡単に言うと何ですか?
単一の応答だけを与えるのではなく、アクションを選択し、ツールを使用し、結果をループで確認することで、目標に向かって作業するソフトウェアです。
チャットボットと AI エージェントの違いは何ですか?
チャットボットは主に各メッセージに応答します。エージェントはいくつかのステップを計画し、ツールを呼び出し、途中で何が起こったかに基づいてコースを変更できます。
AI エージェントには大規模な言語モデルが必要ですか?
最新のエージェントのほとんどは意思決定に LLM を使用しますが、ソフトウェア エージェントのより広い概念は古く、ルールや他の AI メソッドを使用できます。
AIエージェントは安全ですか?
これらには、間違った行動や迅速な注射など、実際のリスクが伴います。権限を制限し、危険な手順には承認を求め、ハードリミットを設定し、すべてを記録します。
AI エージェントは開発者やテスターに取って代わることができますか?
今日は一般的にはそうではありません。彼らは明確に定義された多くのタスクを処理できますが、それでも目標を設定し、出力を確認し、結果に責任を負う必要があります。
学び続ける
テスト、WordPress、または SEO についてサポートが必要ですか?
私たちは、チームがより優れたソフトウェアを出荷し、サイトを成長させるのを支援します。あなたが取り組んでいることを教えてください。明確な次のステップを提案します。
詳しいガイドはこちら テスト、AI、最新の開発
この記事は気に入りましたか?トピックを選択して、最新のチュートリアルに直接アクセスしてください。
AI 幻覚の説明: 言語モデルが物事をでっち上げる理由とそれを軽減する方法
AI 幻覚について説明しました。幻覚とは何か、言語モデルが幻覚を生成する理由、一般的な種類、グラウンディングとプロンプトで幻覚を軽減する方法、そして私たちが実行した簡単なチェックです。
記事を読む →DevOps環境変数の説明: .env ファイル、シークレット、および設定が正しく行われている
実行した Python の例を使用して環境変数について説明します。環境変数の読み取りと設定、すべての値が文字列である理由、.env ファイル、プロセスの継承、シークレット、検証について説明します。
記事を読む →ソフトウェア開発API レート制限の説明: アルゴリズム、ヘッダー、および 429 エラーの処理
API レート制限については、実行したシミュレーションで説明します。トークン バケット、固定ウィンドウ、スライディング ウィンドウ、429 応答、レート制限ヘッダー、バックオフによる再試行、およびテスト制限です。
記事を読む →テスト自動化Python でのモッキング:unittest.mock、patch、およびテストを嘘にする間違い
Python でのunittest.mockによるモック、テスト済み: モックとreturn_value、side_effect、名前が使用されている場所のパッチ、仕様と自動仕様、日付のモック、およびよくある間違い。
記事を読む →ソフトウェアテストコードカバレッジの説明: 回線カバレッジとブランチカバレッジ、および 100% の実際の意味
実際のcoverage.pyの実行でコードカバレッジを説明: 行、分岐、条件のカバレッジ、レポートの読み取り、100%のカバレッジでもバグを見逃す可能性がある理由、および賢明なターゲット。
記事を読む →データベースとSQLSQL における DELETE、TRUNCATE、DROP: 違い、ロールバック、およびそれぞれをいつ使用するか
DELETE、TRUNCATE、DROP について、テスト済み SQL を使用して説明します。それぞれの削除内容、ロールバック、トリガー、ID リセット、速度、PostgreSQL、MySQL、SQL Server、SQLite の違いについて説明します。
記事を読む →データベースとSQLSQL ビューの説明: 作成、使用、落とし穴の回避、例を示します
SQL ビューについて、実行したクエリとともに説明しました。ビューの作成、ライブ結果、列の非表示、パフォーマンス、更新可能なビューと具体化されたビュー、壊れた依存関係、ベスト プラクティスについて説明します。
記事を読む →ソフトウェア開発TypeScript インターフェイスと型: 実際の違い、コンパイラでテスト
TypeScript インターフェイスと型、実際のコンパイラでチェック: 両方でできること、片方だけでできること、宣言のマージ、拡張と交差、および従うべき簡単なルール。
記事を読む →ソフトウェア開発Python *args と **kwargs の説明: 柔軟な関数と明確な例
Python の *args と **kwargs について、実行したコードで説明しました。パッキングとアンパッキング、パラメーターの順序、キーワードのみの引数と位置のみの引数、デコレーター、一般的なエラーです。
記事を読む →ソフトウェア開発Python Lambda 関数: 構文、実際の用途、および使用すべきでない場合
Python のラムダ関数について、実行したコードとともに説明します。構文、キーによるソート、マップとフィルター、クロージャー、遅延バインディング トラップ、通常の def がより適切な選択である場合。
記事を読む →人工知能AIエージェントとは何ですか?シンプルなエージェント ループを実行できる仕組み
AIエージェントとは何ですか?エージェント ループ、ツール、メモリ、ガードレール、実行した小さな Python ループ、実際のリスク、およびシンプルなチャットボットがより良い選択である場合についてのわかりやすいガイドです。
記事を読む →DevOpsモニタリングと可観測性: ログ、メトリクス、トレースによる本当の違い
モニタリングと可観測性について説明: 既知および未知の障害、ログ、メトリクスとトレース、チェックアウト インシデントのウォークスルー、ゴールデン シグナル、OpenTelemetry、および便利なアラート。
記事を読む →DevOpsDocker ボリュームとバインド マウント: コンテナ データを正しい方法で保持する
Docker ボリュームとバインド マウントについて説明します。コンテナ データが消える理由、名前付きボリューム、バインド マウント、tmpfs、Compose の例、バックアップ、アクセス許可、およびそれぞれをいつ使用するかについて説明します。
記事を読む →テスト自動化TDD と BDD: 主な違い、1 つの機能が両方の方法で構築され、それぞれをいつ使用するか
TDD と BDD は、両方の方法で構築された 1 つの割引機能で説明されています。実行したコードによるレッド-グリーン-リファクタリング、Given-When-Then シナリオ、ツール、トレードオフ、およびそれぞれをいつ使用するかです。
記事を読む →ソフトウェア開発Git mergeとrebaseの違い:例と使い分け
Git mergeとrebaseの違いを、実際のログ出力、比較表、rebaseの黄金律、安全なチームワークフローで解説します。
記事を読む →ソフトウェア開発Pythonのリスト内包表記:構文・例・使うべきでない場面
Pythonのリスト内包表記を解説:構文、フィルタ、if-else、ネストしたループ、実測した処理時間、そして通常のforループの方が良い場面。
記事を読む →データベースとSQLSQL JOINを例で解説(Inner・Left・Right・Full)
サンプルのテーブルとクエリでSQL JOINを順に解説。INNER、LEFT、RIGHT、FULL、CROSS、SELFに加え、よくある間違いとパフォーマンスのコツも紹介します。
記事を読む →