Function Calling 工具定义怎么写:工具名称、描述、参数与返回值设计提示词(让模型选对工具、填对参数)

给大模型接工具(Function Calling / Tool Use)时,模型老是该调用不调用、选错工具或参数乱填时用:把你现有的接口或工具草稿贴进来,AI 逐个评审并重写——名称是否自解释、描述有没有说清何时用何时不用、参数类型与枚举是否收紧、出错时返回什么能让模型自己纠正。

NNathaniel bigo··原创首发·AI 辅助撰写
通用大模型 对话模型通用
我在给一个大模型应用设计工具(Function Calling)。请评审并改写下面的工具定义,目标是让模型能选对工具、填对参数、在出错时自行纠正。

应用场景:[应用场景]
现有工具定义或接口说明:
[现有工具定义]
观察到的问题(没有可写「尚未上线」):[观察到的问题]
使用的模型与平台:[模型与平台]

请按以下清单逐个工具检查,并给出改写后的完整定义(JSON Schema 形式):

一、工具集合层面
1. 工具之间职责是否重叠?名字相近、功能交叉的工具,模型很容易选错;能合并的合并,不能合并的在描述里写明分界。
2. 粒度是否合适:是照搬后端的每个接口,还是按「用户想完成的事」来组织?一个常见任务如果要连续调用四五个工具才能完成,考虑提供一个更高层的工具。
3. 数量是否过多;哪些工具可以只在特定场景才提供。

二、单个工具的名称与描述
1. 名称:动词加对象,一眼能看出做什么;同一套工具命名风格一致。
2. 描述要写出:这个工具做什么;什么情况下应该用;什么情况下不要用(改用哪个);有没有副作用(会不会修改数据、发送消息、产生费用);返回什么。
3. 描述是写给模型看的说明文字,按「给一个新同事解释这个工具」的详细程度来写,不要只有一个短语。

三、参数
1. 每个参数的类型、是否必填、含义、格式(如日期格式、时区、单位)和一个示例值。
2. 取值有限的用枚举;数值给出范围;不要用一个自由文本参数承载多个含义。
3. 参数名自解释,避免 id、type、data 这类需要猜的名字;涉及标识符的,说明从哪里获得(例如「先调用搜索工具得到」)。
4. 模型无法知道的值(当前用户、当前时间、权限)不要让它填,由程序注入。

四、返回值与报错
1. 只返回模型下一步需要的字段,去掉冗长的内部字段;列表结果要有数量上限和分页方式。
2. 报错信息要能指导下一步:写明哪里不对、应该怎么改(例如「日期格式应为 YYYY-MM-DD,你提供的是 3/5」),而不是只返回错误码。
3. 有副作用的工具:是否需要「预览 / 确认」两步,或提供只读的试运行参数。

五、输出
1. 问题清单:工具 | 问题 | 可能导致的现象 | 改法。
2. 改写后的全部工具定义。
3. 配套的系统提示词片段:用两三句话说明这些工具的使用原则(何时该先查再改、何时该先问用户)。
4. 10 条测试用的用户请求:包含应调用单个工具的、需要连续调用的、不应调用任何工具的、参数信息不全应先反问的,并写出每条的预期行为。

各平台对工具定义的字段名和限制不完全相同,凡涉及平台特性的地方请标注「以该平台最新文档为准」。

高亮处换成你自己的内容:[应用场景]、[现有工具定义]、[观察到的问题]、[模型与平台]

ChatGPT Plus 充值

已被复制 0 次

使用说明

核心观念:工具定义就是提示词。模型决定「要不要调用、调用哪个、参数填什么」时,唯一的依据是工具的名称、描述和参数说明。很多团队花大力气打磨系统提示词,工具描述却只有一行,结果模型该调用时不调用,或者把两个相近的工具用混。把工具当成要交给新同事的接口文档来写,效果往往比调系统提示词更直接。

怎么填变量:[现有工具定义] 直接贴 JSON;还没写的话贴后端接口说明也行。[观察到的问题] 写现象:「问天气时不调用工具直接编」「订单号经常填成手机号」「一次对话调用了八次搜索」。[模型与平台] 用来提醒平台差异,具体的字段格式、是否支持严格模式、并行调用等,以对应平台的官方文档为准。

常见问题与调整:

  • 该调用时不调用 → 多半是描述没写「什么时候应该用」。让它重点改写这一句,并在系统提示词里说明哪类问题必须先查工具再回答。
  • 调用过于频繁 → 检查描述或系统提示词里是否有「拿不准就调用」「务必使用」这类话;改成有条件的说明。
  • 参数总是填错 → 追问:「针对 order_id 参数,补充格式说明、示例值和『从哪里获得』,并设计一条能引导纠正的报错信息。」
  • 工具太多 → 追问:「按使用场景把工具分组,哪些可以按需加载?」

安全提醒:会修改数据、对外发送或产生费用的工具,不能只靠提示词来约束,程序层面要做权限校验和必要的人工确认;来自网页、文档等外部内容里的指令不应触发这类工具。

示例输出

示例,仅供参考(原定义只有 name: "query" 和一句描述「查询」;改写后节选)
json
{
  "name": "search_orders",
  "description": "按条件搜索当前登录用户的订单,返回最多 10 条摘要。用户询问订单状态、物流或想找某一笔订单时使用。只读,不会修改任何数据。需要订单的完整明细时,用返回结果中的 order_id 再调用 get_order_detail。不要用它查询其他用户的订单。",
  "parameters": {
    "type": "object",
    "properties": {
      "status": {
        "type": "string",
        "enum": ["pending_payment", "paid", "shipped", "completed", "refunded"],
        "description": "订单状态;不限定时省略此参数"
      },
      "created_after": {
        "type": "string",
        "description": "只返回此日期之后创建的订单,格式 YYYY-MM-DD,例如 2026-09-01"
      }
    },
    "required": []
  }
}

问题清单(节选):原名称 query 无法看出查的是什么;没有说明只能查当前用户的订单;没有状态枚举,模型曾填入「已发货」「shipped」「发货中」三种写法。

同款作品

用这条提示词做出来的作品;原作者会因此获得积分

做同款

还没有同款,来做第一个。

Nathaniel 的更多内容

同主题

同模型

0 条评论

登录 后参与评论

还没有评论,来抢沙发~