工具调用设计:schema、幂等、超时、错误处理和人工审批
工具调用(function calling)让模型输出结构化参数,由应用执行真实操作。模型只负责“选工具、填参数”,不负责鉴权、事务和副作用控制;这些必须在应用层完成。工具设计的好坏,直接影响 Agent 的可靠性、成本和安全性。
一个可用的工具要有:清晰的名称和描述、严格的参数 schema、明确的返回值、错误语义、超时/重试策略、幂等键和高风险操作审批。工具越少越聚焦,模型越不容易选错;工具太多会撑爆上下文并增加误调用。
{
"type": "function",
"function": {
"name": "get_order_status",
"description": "按订单号查询物流状态;只读,不会修改订单。",
"parameters": {
"type": "object",
"properties": {
"order_id": {"type": "string", "pattern": "^[A-Z0-9-]{6,32}$"}
},
"required": ["order_id"],
"additionalProperties": false
}
}
}
# 处理模型返回的 tool_calls
resp = client.chat.completions.create(
model="gpt-4o-mini",
messages=messages,
tools=tools,
tool_choice="auto",
)
for call in resp.choices[0].message.tool_calls or []:
name = call.function.name
args = json.loads(call.function.arguments)
validate_schema(name, args) # 参数校验
result = execute_tool(name, args) # 超时、重试、幂等
messages.append({
"role": "tool", "tool_call_id": call.id,
"content": json.dumps(result, ensure_ascii=False),
})
# 高风险工具:人工审批 + 幂等键
if tool_name in {"send_email", "delete_record", "run_shell"}:
approval = request_approval(user, tool_name, args)
if not approval.approved:
return {"error": "approval_denied"}
result = execute_idempotent(tool_name, args, idempotency_key=call.id)
additionalProperties 未关闭、参数无类型/范围;模型会传错或注入额外字段。合上页面,先回答,再展开对照。
小程序版
微信扫码,随时查命令