あなたが超知能のロボット執事 (エージェント) を組み立てていると想像してください。このロボットは、まるでドラえもんの 4D ポケットのように、タスクを完了するのに役立つさまざまなツールを必要とします。この記事では、AI バトラーをより有能かつ効率的にするための強力なツールを作成する方法を説明します。
セルフサービスのコーヒーマシンの使用を検討してください:
これは典型的な同期ツールのパターンです。エージェントはツールを呼び出し、迅速かつ簡単な即時結果を待ちます。
class WeatherTool(BaseTool): """Weather Query Tool - Synchronous Mode""" async def execute(self, city: str) -> dict: # Simple and direct like pressing a coffee machine button weather_data = await self.weather_api.get_current(city) return { "status": "success", "data": { "temperature": weather_data.temp, "humidity": weather_data.humidity, "description": weather_data.desc } }
使用例:
配達アプリを通じて食べ物を注文するところを想像してみてください:
これは非同期ツールの仕組みであり、処理に時間がかかるタスクに最適です。
class DocumentAnalysisTool(BaseTool): """Document Analysis Tool - Asynchronous Mode""" async def start_task(self, file_path: str) -> str: # Like placing a food delivery order, returns a task ID task_id = str(uuid.uuid4()) await self.task_queue.put({ "task_id": task_id, "file_path": file_path, "status": "processing" }) return task_id async def get_status(self, task_id: str) -> dict: # Like checking food delivery status task = await self.task_store.get(task_id) return { "task_id": task_id, "status": task["status"], "progress": task.get("progress", 0), "result": task.get("result", None) }
使用例:
すべての電化製品が統一ソケット規格に従っているのと同じように、ツールのインターフェースも標準化が必要です。これにより、すべてのツールがエージェントと完全に連携して動作するようになります。
製品マニュアルを書くことを想像してみてください。ユーザーに次のことを明確に伝える必要があります。
from pydantic import BaseModel, Field class ToolSchema(BaseModel): """Tool Manual Template""" name: str = Field(..., description="Tool name") description: str = Field(..., description="Tool purpose description") parameters: dict = Field(..., description="Required parameters") required: List[str] = Field(default_factory=list, description="Required parameters") class Config: schema_extra = { "example": { "name": "Weather Query", "description": "Query weather information for specified city", "parameters": { "type": "object", "properties": { "city": { "type": "string", "description": "City name" } } }, "required": ["city"] } }
すべての電化製品に電源スイッチと電源インターフェースが必要なように、すべてのツールは基本仕様に従う必要があります。
class BaseTool(ABC): """Base template for all tools""" @abstractmethod def get_schema(self) -> ToolSchema: """Tool manual""" pass def validate_input(self, params: Dict) -> Dict: """Parameter check, like a fuse in electrical appliances""" return ToolSchema(**params).dict() @abstractmethod async def execute(self, **kwargs) -> Dict: """Actual functionality execution""" pass
家庭用電化製品には水、衝撃、過負荷に対する保護が必要であるのと同様に、工具にも包括的な保護メカニズムが必要です。
速達便の処理を想像してください:
class WeatherTool(BaseTool): """Weather Query Tool - Synchronous Mode""" async def execute(self, city: str) -> dict: # Simple and direct like pressing a coffee machine button weather_data = await self.weather_api.get_current(city) return { "status": "success", "data": { "temperature": weather_data.temp, "humidity": weather_data.humidity, "description": weather_data.desc } }
最初の試行が失敗した場合に 2 回目の配送を自動的に手配する場合と同様:
class DocumentAnalysisTool(BaseTool): """Document Analysis Tool - Asynchronous Mode""" async def start_task(self, file_path: str) -> str: # Like placing a food delivery order, returns a task ID task_id = str(uuid.uuid4()) await self.task_queue.put({ "task_id": task_id, "file_path": file_path, "status": "processing" }) return task_id async def get_status(self, task_id: str) -> dict: # Like checking food delivery status task = await self.task_store.get(task_id) return { "task_id": task_id, "status": task["status"], "progress": task.get("progress", 0), "result": task.get("result", None) }
人気商品を目立つ位置に置くコンビニのようなもの:
from pydantic import BaseModel, Field class ToolSchema(BaseModel): """Tool Manual Template""" name: str = Field(..., description="Tool name") description: str = Field(..., description="Tool purpose description") parameters: dict = Field(..., description="Required parameters") required: List[str] = Field(default_factory=list, description="Required parameters") class Config: schema_extra = { "example": { "name": "Weather Query", "description": "Query weather information for specified city", "parameters": { "type": "object", "properties": { "city": { "type": "string", "description": "City name" } } }, "required": ["city"] } }
病院の予約システムと同様に、同時サービスの数を制御します:
class BaseTool(ABC): """Base template for all tools""" @abstractmethod def get_schema(self) -> ToolSchema: """Tool manual""" pass def validate_input(self, params: Dict) -> Dict: """Parameter check, like a fuse in electrical appliances""" return ToolSchema(**params).dict() @abstractmethod async def execute(self, **kwargs) -> Dict: """Actual functionality execution""" pass
新製品発売前の品質検査と同様:
class ToolError(Exception): """Tool error base class""" def __init__(self, message: str, error_code: str, retry_after: Optional[int] = None): self.message = message self.error_code = error_code self.retry_after = retry_after @error_handler async def execute(self, **kwargs): try: # Execute specific operation result = await self._do_work(**kwargs) return {"status": "success", "data": result} except ValidationError: # Parameter error, like wrong address return {"status": "error", "code": "INVALID_PARAMS"} except RateLimitError as e: # Need rate limiting, like courier too busy return { "status": "error", "code": "RATE_LIMIT", "retry_after": e.retry_after }
詳細で明確な製品マニュアルを書くのと同様:
class RetryableTool(BaseTool): @retry( stop=stop_after_attempt(3), # Maximum 3 retries wait=wait_exponential(multiplier=1, min=4, max=10) # Increasing wait time ) async def execute_with_retry(self, **kwargs): return await self.execute(**kwargs)
優れたエージェント ツールを開発することは、完璧なツールボックスを作成することに似ています:
覚えておいてください: 優れたツールはエージェントの効果を 2 倍にすることができますが、貧弱なツールはあらゆる場面でエージェントを制限します。
以上がエージェント ツール開発ガイド: 設計から最適化までの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。