Skip to content

最佳实践

设计模式

1. 单一职责

每个工具只做一件事:

json
// ✅ 好:职责清晰
{ "name": "get_weather", "description": "获取天气" }
{ "name": "get_stock_price", "description": "获取股价" }

// ❌ 差:职责混乱
{ "name": "get_info", "description": "获取天气或股价" }

2. 清晰的描述

工具描述是模型理解的关键:

json
// ✅ 好:描述具体
{ "description": "搜索互联网上的公开信息,返回相关网页链接和摘要" }

// ❌ 差:描述模糊
{ "description": "搜索" }

3. 合理的参数设计

json
{
  "parameters": {
    "type": "object",
    "properties": {
      "query": {
        "type": "string",
        "description": "搜索关键词,多个词用空格分隔"
      },
      "date_range": {
        "type": "string",
        "enum": ["today", "week", "month", "year", "all"],
        "description": "时间范围"
      }
    },
    "required": ["query"]
  }
}

错误处理

工具执行失败

python
# 返回错误信息让模型处理
tool_result = {
    "error": "API 调用失败:网络超时",
    "suggestion": "请稍后重试或检查网络连接"
}

参数校验

python
# 在工具内部校验参数
def get_weather(city: str):
    if not city or len(city) < 2:
        return {"error": "城市名无效,请提供有效的城市名"}
    # ... 正常逻辑

安全考虑

1. 权限控制

  • 敏感操作需要用户确认
  • 限制工具可访问的资源范围
  • 记录所有工具调用日志

2. 输入验证

python
def execute_code(code: str):
    # 危险操作需要沙箱
    if "import os" in code or "subprocess" in code:
        return {"error": "不允许执行系统命令"}
    # 在沙箱中执行
    return sandbox_run(code)

3. 速率限制

  • 防止工具被滥用
  • 设置调用频率上限
  • 监控异常调用模式

性能优化

1. 并行执行

python
import asyncio

# 多个独立工具并行执行
results = await asyncio.gather(
    get_weather("Beijing"),
    get_weather("Shanghai"),
    get_weather("Guangzhou")
)

2. 缓存结果

python
from functools import lru_cache

@lru_cache(maxsize=100)
def get_weather(city: str):
    # 缓存相同查询
    ...

3. 减少工具数量

  • 合并相似工具
  • 移除不常用工具
  • 工具越多,模型越容易困惑

常见陷阱

陷阱解决方案
工具描述太抽象提供具体示例
参数类型不匹配明确 schema 类型
循环调用设置最大调用次数
忘记返回结果使用框架自动处理

Released under the MIT License.