学習目標
- AIエージェントとは何か、どのように動作するかを理解する
- 新しい
create_agentAPI(LangChain v1.0)を使用する - エージェント用のカスタムツールを定義する
- 組み込みツール(検索、計算機など)を使用する
- エージェントの実行を処理し、ツール呼び出しを監視する
3.1 AIエージェントとは?
AIエージェントは、目標を達成するためにどのアクションを取るべきかを自律的に決定できるLLMです。固定パスに従う単純なチェーンとは異なり、エージェントは以下のことができます:
- 必要なステップについて推論する
- 使用するツールを選択する
- アクションを実行し、結果を観察する
- タスクが完了するまで繰り返す
graph TB
A[ユーザークエリ] --> B[エージェント]
B --> C{アクションを決定}
C -->|ツール使用| D[ツール実行]
D --> E[結果を観察]
E --> C
C -->|完了| F[最終レスポンス]
style B fill:#667eea,color:#fff
style D fill:#11998e,color:#fff
style F fill:#28a745,color:#fff
エージェントループ
以下のサイクル:(1)LLMが呼び出すツールを決定、(2)ツールが実行し結果を返す、(3)LLMが結果を観察し次のアクションを決定。これはLLMがタスクが完了したと判断するまで続きます。
3.2 create_agent API
LangChain v1.0では、create_agentがエージェントを構築する標準的な方法として導入されました:
コード例1:create_agentで基本エージェント
from langchain.agents import create_agent
from langchain_openai import ChatOpenAI
# シンプルなツールを定義
def get_weather(city: str) -> str:
"""都市の現在の天気を取得する。"""
# 本番環境では実際の天気APIを呼び出す
return f"{city}の天気は晴れ、22°Cです"
def calculate(expression: str) -> str:
"""数式を評価する。
警告: この例では簡略化のためeval()を使用しています。
本番環境では`numexpr`や`asteval`などの安全な数式パーサを使用してください。
"""
try:
# 警告: eval()は信頼できない入力に対して危険です!
# 本番環境では: import numexpr; numexpr.evaluate(expression) を使用
return str(eval(expression))
except Exception as e:
return f"エラー: {e}"
# エージェントを作成
agent = create_agent(
model=ChatOpenAI(model="gpt-4"),
tools=[get_weather, calculate],
system_prompt="あなたは天気を確認し計算ができる親切なアシスタントです。"
)
# エージェントを実行
result = agent.invoke({
"messages": [
{"role": "user", "content": "東京の天気と、25 * 4は?"}
]
})
print(result["messages"][-1].content)
3.3 カスタムツールの定義
ツールはいくつかの方法で定義できます。最も簡単なのは@toolデコレータを使用することです:
コード例2:@toolデコレータでカスタムツール
from langchain_core.tools import tool
@tool
def search_database(query: str) -> str:
"""クエリに一致するアイテムを製品データベースで検索する。
Args:
query: データベースで検索する検索語。
"""
# シミュレートされたデータベース検索
products = {
"laptop": "MacBook Pro - ¥299,800",
"phone": "iPhone 15 - ¥149,800",
"tablet": "iPad Pro - ¥119,800"
}
query_lower = query.lower()
for key, value in products.items():
if key in query_lower:
return value
return "製品が見つかりません"
@tool
def send_email(to: str, subject: str, body: str) -> str:
"""指定された受信者にメールを送信する。
Args:
to: 受信者のメールアドレス。
subject: メールの件名。
body: メールの本文。
"""
# 本番環境では実際にメールを送信する
return f"'{subject}'という件名で{to}にメールを送信しました"
# ツールを使用
print(search_database.name) # "search_database"
print(search_database.description) # docstringから
print(search_database.invoke("laptop")) # "MacBook Pro - ¥299,800"
ツール定義のベストプラクティス
- 明確で説明的な関数名を使用する
- 詳細なdocstringを書く—LLMはこれらを使用してツールをいつ使用するかを決定する
- すべてのパラメータに型ヒントを追加する
- ツールは単一のタスクに集中させる
3.4 組み込みツール
LangChainはlangchain-communityを通じて多くの事前構築されたツールを提供しています:
コード例3:組み込みツールの使用
from langchain_community.tools import DuckDuckGoSearchRun
from langchain_community.tools import WikipediaQueryRun
from langchain_community.utilities import WikipediaAPIWrapper
# Web検索ツール
search = DuckDuckGoSearchRun()
result = search.invoke("AIに関する最新ニュース")
print(result)
# Wikipediaツール
wikipedia = WikipediaQueryRun(api_wrapper=WikipediaAPIWrapper())
result = wikipedia.invoke("機械学習")
print(result)
一般的な組み込みツール
| ツール | パッケージ | 目的 |
|---|---|---|
| DuckDuckGoSearchRun | langchain-community | Web検索 |
| WikipediaQueryRun | langchain-community | Wikipedia検索 |
| ArxivQueryRun | langchain-community | 学術論文検索 |
| PythonREPLTool | langchain-community | Pythonコード実行 |
| ShellTool | langchain-community | シェルコマンド実行 |
セキュリティ警告:高リスクツール
PythonREPLToolとShellToolは完全なシステムアクセス権限で任意のコードを実行します。これらのツールはサンドボックス環境でのみ使用するか、厳格な入力検証を行ってください。本番環境では、許可リスト、コンテナ化(Docker)、または制限された実行環境の使用を検討してください。
演習
演習1:リサーチエージェントを構築
以下のツールを持つエージェントを作成してください:
- Webを検索する(DuckDuckGoSearchRunを使用)
- Wikipedia記事を調べる
- テキストを要約する(LLMを使用するカスタムツール)
次のように質問してテストしてください:「ニューラルネットワークの歴史を調べて、主要なマイルストーンを要約してください。」
演習2:タスク自動化エージェント
以下のツールを持つ架空のタスク管理システム用エージェントを構築してください:
create_task(title, description, due_date)list_tasks()complete_task(task_id)
タスクをシンプルな辞書に保存し、エージェントがタスクを管理する能力をテストしてください。
まとめ
- エージェントはツールを自律的に使用してタスクを達成できるLLM
- ツール付きエージェントを構築するには
create_agent(v1.0)を使用 @toolデコレータまたはStructuredToolでツールを定義- 明確なdocstringがLLMが各ツールをいつ使用するかを理解するのに役立つ
- 検索、Wikipedia、コード実行などの組み込みツールが利用可能
- エージェント実行をストリーミングして推論プロセスを確認