Heim >Backend-Entwicklung >Python-Tutorial >Leitfaden zur Agenten-Tool-Entwicklung: Vom Design zur Optimierung
Stellen Sie sich vor, Sie bauen einen superintelligenten Roboter-Butler (Agent) zusammen. Dieser Roboter benötigt verschiedene Werkzeuge, um Ihnen bei der Erledigung von Aufgaben zu helfen – genau wie Doraemons 4D-Tasche. In diesem Artikel erfahren Sie, wie Sie diese leistungsstarken Tools erstellen, um Ihren KI-Butler leistungsfähiger und effizienter zu machen.
Denken Sie an die Verwendung einer Selbstbedienungskaffeemaschine:
Dies ist ein typisches Synchronwerkzeugmuster. Der Agent ruft das Tool auf und wartet auf sofortige Ergebnisse – schnell und einfach.
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 } }
Anwendungsfälle:
Stellen Sie sich vor, Sie bestellen Essen über eine Liefer-APP:
So funktionieren asynchrone Tools, perfekt für Aufgaben, deren Verarbeitung länger dauert.
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) }
Anwendungsfälle:
So wie alle Elektrogeräte einheitlichen Steckdosenstandards folgen, müssen auch unsere Werkzeugschnittstellen standardisiert werden. Dadurch wird sichergestellt, dass alle Tools perfekt mit dem Agent funktionieren.
Stellen Sie sich vor, Sie schreiben ein Produkthandbuch, Sie müssen den Benutzern klar sagen:
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"] } }
So wie alle Elektrogeräte Netzschalter und Stromschnittstellen benötigen, müssen auch alle Werkzeuge grundlegenden Spezifikationen entsprechen:
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
So wie Haushaltsgeräte Schutz vor Wasser, Stößen und Überlastung benötigen, benötigen auch Werkzeuge umfassende Schutzmechanismen.
Stellen Sie sich die Abwicklung einer Expresszustellung vor:
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 } }
Zum Beispiel automatisch eine zweite Lieferung zu veranlassen, wenn der erste Versuch fehlschlägt:
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) }
Wie ein Supermarkt, der beliebte Artikel an prominenter Stelle platziert:
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"] } }
Wie das Terminsystem eines Krankenhauses, das die Anzahl der gleichzeitigen Dienste kontrolliert:
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
Wie eine Qualitätsprüfung vor der Einführung eines neuen Produkts:
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 }
Als würde man ein detailliertes und klares Produkthandbuch schreiben:
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)
Die Entwicklung guter Agent-Tools ist wie die Erstellung einer perfekten Toolbox:
Denken Sie daran: Gute Tools können Agenten doppelt so effektiv machen, während schlechte Tools Agenten auf Schritt und Tritt einschränken.
Das obige ist der detaillierte Inhalt vonLeitfaden zur Agenten-Tool-Entwicklung: Vom Design zur Optimierung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!