一、基本模型
安全的 Function Calling 循环包含四步:声明工具、读取工具调用、校验参数并执行、回传结构化结果。模型只提出调用建议,真正权限由应用控制。
二、定义窄接口
from typing import Any
def add_numbers(a: int, b: int) -> dict[str, Any]:
if not isinstance(a, int) or not isinstance(b, int):
raise TypeError("a and b must be integers")
return {"result": a + b}
TOOLS = {"add_numbers": add_numbers}生产代码还应限制参数范围、设置超时、记录调用 ID,并对异常返回稳定结构。
三、不要执行任意代码
不要把 eval、任意 shell 或任意 URL 请求直接暴露为工具。应拆成窄接口,并在服务端再次校验路径、参数和权限。
四、限制调用循环
MAX_TOOL_CALLS = 5
for _ in range(MAX_TOOL_CALLS):
response = call_model(messages, tools=tool_schemas)
if not response.tool_calls:
break
# 校验工具名、参数、权限和超时后再执行五、上线检查
- 工具和参数有明确 schema。
- 每次调用都有超时和最大次数。
- 敏感操作需要人工确认。
- 错误信息不泄露密钥、路径或堆栈。
- 测试成功、参数错误、未知工具和超时。
六、验收标准
四类测试都得到可预测结果后,才适合继续接入 RAG、MCP 或多 Agent 编排。