Agent 工具调用的工程化设计
工具调用的基本流程
- 把可用工具的名称、描述、参数 Schema 发给模型
- 模型返回要调用的工具和参数
- 程序执行工具,把结果作为
tool消息追加到对话 - 重复以上步骤,直到模型给出最终回答
工具设计原则
- 职责单一:一个工具只做一件事,名称用动词开头,如
search_orders - 描述写给模型看:说明什么时候该用、什么时候不该用
- 参数尽量用枚举和必填约束,减少模型自由发挥的空间
- 返回值要精简:只返回模型需要的字段,过长的结果先截断或摘要
执行循环要有边界
for step := 0; step < maxSteps; step++ {
resp := callModel(messages)
if len(resp.ToolCalls) == 0 {
return resp.Content
}
for _, tc := range resp.ToolCalls {
out := runTool(ctx, tc) // 带超时与权限校验
messages = append(messages, toolMessage(tc.ID, out))
}
}
return "已达到最大步数,请缩小问题范围"
一定要设置最大步数和总超时,防止模型陷入循环。
权限与安全
- 只读工具和写操作工具分开,写操作默认需要人工确认
- 工具执行使用最小权限的凭证,不复用管理员账号
- 每次调用记录:谁发起、调用了什么、参数、结果、耗时
小结
把 Agent 当作一个“会犯错的新同事”来设计系统:给清晰的工具、有限的权限和完整的审计记录。