Rumah > Artikel > pembangunan bahagian belakang > Panduan Pembangunan Alat Agen: Daripada Reka Bentuk kepada Pengoptimuman
Bayangkan anda sedang memasang butler robot yang sangat pintar (Ejen). Robot ini memerlukan pelbagai alatan untuk membantu anda menyelesaikan tugasan - sama seperti poket 4D Doraemon. Artikel ini akan mengajar anda cara mencipta alatan berkuasa ini untuk menjadikan butler AI anda lebih berkebolehan dan cekap.
Fikirkan untuk menggunakan mesin kopi layan diri:
Ini ialah corak alat segerak biasa. Ejen memanggil alat dan menunggu keputusan segera - cepat dan mudah.
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 } }
Kes penggunaan:
Bayangkan memesan makanan melalui APP penghantaran:
Beginilah cara alat tak segerak berfungsi, sesuai untuk tugasan yang mengambil masa lebih lama untuk diproses.
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) }
Kes penggunaan:
Sama seperti semua peralatan elektrik mengikut piawaian soket bersatu, antara muka alat kami memerlukan penyeragaman. Ini memastikan semua alatan berfungsi dengan sempurna dengan Ejen.
Bayangkan menulis manual produk, anda perlu memberitahu pengguna dengan jelas:
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"] } }
Sama seperti semua peralatan elektrik memerlukan suis kuasa dan antara muka kuasa, semua alatan perlu mengikut spesifikasi asas:
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
Sama seperti perkakas rumah memerlukan perlindungan terhadap air, kejutan dan beban berlebihan, alatan memerlukan mekanisme perlindungan yang komprehensif.
Bayangkan mengendalikan penghantaran ekspres:
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 } }
Seperti mengatur penghantaran kedua secara automatik apabila percubaan pertama gagal:
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) }
Seperti kedai serbaneka yang meletakkan barangan popular pada kedudukan yang menonjol:
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"] } }
Seperti sistem temu janji hospital, mengawal bilangan perkhidmatan serentak:
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
Seperti pemeriksaan kualiti sebelum pelancaran produk baharu:
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 }
Seperti menulis manual produk yang terperinci dan jelas:
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)
Membangunkan alat Ejen yang baik adalah seperti mencipta kotak alat yang sempurna:
Ingat: Alat yang baik boleh menjadikan Ejen dua kali lebih berkesan, manakala alatan yang lemah akan mengehadkan Ejen pada setiap masa.
Atas ialah kandungan terperinci Panduan Pembangunan Alat Agen: Daripada Reka Bentuk kepada Pengoptimuman. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!