← 工具调用

工具描述怎么写?为什么说工具说明就是 Prompt 的一部分?

高频 中等 工具怎么设计 · 第 2 / 3 问 更新于 2026/09/29
工具调用Function Calling工具描述PromptAgent
本题落地项目AI Agent旅游行程智能规划平台

简化版

模型决定调不调一个工具、传什么参数,依据只有三样东西:工具名、工具描述、参数 Schema。它们随每次请求发给模型,本质上就是 Prompt 的一部分,写得含糊,模型就会漏调、错调、传错参数。一段好的描述要回答四个问题:这个工具做什么、什么时候该调、什么时候不该调、返回结果怎么读;参数说明要写清取值范围和格式,而且描述和 Schema 必须说同一件事(描述里写「不传表示不限」,Schema 里就要标成非必填)。描述改完要能立即看到模型实际收到的内容,并用调用日志验证效果。

详细版

一个工具发给模型的样子:

{
  "type": "function",
  "function": {
    "name": "query_distance",
    "description": "查询两个点位之间的直线距离、路程和预计车程。写入行程前用它确认同一天的点位不会太远。不要用它穷举搜索最优顺序,应先按城区把点位分组,再验证组内顺序。",
    "parameters": {
      "type": "object",
      "properties": {
        "fromPoiId": {"type": "integer", "description": "起点点位ID,取自点位查询工具的返回"},
        "toPoiId": {"type": "integer", "description": "终点点位ID,取自点位查询工具的返回"}
      },
      "required": ["fromPoiId", "toPoiId"]
    }
  }
}

描述要覆盖的内容:

要素回答的问题缺了会怎样
用途这个工具做什么模型不知道它能解决什么问题
调用时机什么时候该调、调用顺序该调的时候不调,或调用顺序乱
禁止用法什么时候不该调被拿去穷举、刷调用次数
返回解读返回字段是什么意思、下一步怎么做读错结果,或看到子集以为是全部
参数说明每个参数的含义、取值、来源编造参数值、格式对不上

完整版教学

一、模型看到的只有名称、描述和 Schema

模型并不知道工具背后是哪张表、哪个方法。每次请求里,应用把工具清单作为 tools 数组发给模型,模型能读到的只有:

name         工具名:query_distance
description  一段自然语言:做什么、什么时候用、什么时候别用
parameters   JSON Schema:有哪些参数、类型、是否必填、每个参数的说明

所以工具描述和系统提示词是同一类东西:都是模型推理时读到的文字,都会影响它的决策,改描述就是在调 Prompt。区别只在于描述是「按工具拆开」的,每个工具只管自己那一段。

记忆钩子:模型看不到你的代码,只看得到你的说明书。说明书写成什么样,它就按什么理解。

二、描述要回答的四个问题

以一个点位查询工具为例,对比一下:

差:查询点位。

好:在本次候选池里按城市、兴趣标签、城区和最长游玩时长筛点位。
    只返回候选池内的点位,池外的资源查不到。
    hasMore 为 true 时说明还有没返回的候选,可以换标签或城区条件再查一次;
    不要用本工具穷举翻页,选不到合适的就按现有候选安排。

「好」的版本回答了四件事:

问题对应的句子
做什么在候选池里按城市、标签、城区、时长筛点位
边界在哪只返回候选池内的点位,池外查不到
返回怎么读hasMore 为 true 说明还有没返回的
下一步和禁止用法换条件再查;不要穷举翻页

其中「什么时候不该调」最容易被忽略。模型有一个倾向:手里有工具就想用,尤其是能返回确定答案的检测类、计算类工具,它会拿来反复试。明确写出禁止用法,比事后用调用次数上限拦截更省成本。

三、参数说明:写清取值和来源

参数是模型生成的,Schema 只能约束类型,约束不了取值。常见问题和写法:

问题差的写法好的写法
枚举值交通方式取值:飞机/高铁/动车/大巴
格式日期日期,格式 yyyy-MM-dd
来源城市ID目的地城市ID,取自上下文查询工具返回的 cityRoute
可选语义城区城区或商圈名;不传表示不限
多值标签多个用逗号分隔,例如 历史,摄影;命中任意一个即算匹配

「来源」这一项很关键:ID 类参数写明从哪个工具的返回里取,模型就不会凭空编一个数字。

四、描述和 Schema 必须说同一件事

一个常见的不一致:

描述:area 城区名,不传表示不限
Schema:required: ["destinationId", "area"]

描述说可以不传,Schema 却把它列为必填,模型每次都得硬塞一个值,于是出现「area = 全部」「area = 不限」这类参数,工具按字面去匹配,一条都查不到。用注解生成 Schema 的框架里,参数默认往往是必填的,写了「不传表示不限」就要同时显式声明非必填。

五、描述的长度也是成本

描述每一轮都会随请求发给模型。粗算一下:

8 个工具 × 每个描述和参数约 150 token ≈ 1200 token
一次编排 40 轮往返 × 1200 token ≈ 48000 token 只花在工具清单上

所以描述要写准,但不要写成说明文档:业务背景、实现细节、表结构都不需要。一句用途、一两句调用时机和禁止用法、每个参数一句说明,通常就够了。工具数量多时,还可以只把当前任务用得到的工具交给模型。

六、相似工具要能区分

两个工具描述接近时,模型会随机选一个:

工具 A:查询订单信息
工具 B:查询订单详情

应该写出它们的差异:「查询订单的状态、金额和物流节点,用于回答订单进度问题」与「查询订单里每件商品的规格和价格,用于回答买了什么的问题」。列表工具和详情工具也一样,写明「列表用来选,详情用来确认;只在准备写入某一项之前调用详情,一次查一个」。

七、怎么验证描述写得好

描述的好坏最终体现在调用行为上,可以从三个地方看:

1. 预览:直接查看真正发给模型的工具 JSON,确认改动已生效、停用的工具不在里面
2. 调用日志:按工具统计调用次数、失败率、参数校验失败次数;
             某个工具从不被调用,或参数总是填错,多半是描述的问题
3. 回归样本:准备一批「应该调 A」「应该调 B」「不该调任何工具」的问题,
             改描述后跑一遍,对比选择正确率

例如 50 条样本里,改描述前某检测工具被错误调用 12 次,补上「不要用它穷举」之后降到 3 次,这种对比才能说明描述改得有效。

八、常见误区与追问

  • 误区:工具描述写一句名字就够了。 模型只能靠描述判断用途和时机,一句名字无法区分相似工具,也说明不了禁止用法。
  • 误区:参数类型对了,模型就会传对值。 Schema 只约束类型,枚举值、格式、来源都要在参数说明里写清。
  • 误区:描述写得越详细越好。 描述每一轮都要发给模型,写成说明文档既费 token 又稀释重点。
  • 误区:描述写了可选,Schema 里是否必填无所谓。 两者不一致时模型会按 Schema 硬塞值,工具按字面匹配就查不到。
  • 误区:只要加调用次数上限,就不用写禁止用法。 上限是兜底,描述里先说清不该怎么用,才能少浪费调用。
  • 追问:怎么知道描述改动生效了? 预览真正发给模型的工具定义,再看调用日志和回归样本的选择正确率。
  • 追问:工具返回的内容也需要「写给模型看」吗? 需要,返回里带上下一步提示(如还有更多结果、换条件再查),模型才知道自己看到的是子集。

九、加强记忆

模型只看得到工具名、描述和参数 Schema,它们就是 Prompt 的一部分。描述回答四件事:做什么、什么时候调、什么时候别调、返回怎么读;禁止用法最容易漏,却最能省调用。参数说明写清枚举、格式和来源,ID 写明取自哪个工具的返回。描述和 Schema 必须一致,写了不传表示不限就要声明非必填。描述每轮都发,要准不要长。相似工具写出差异。改完用预览、调用日志和回归样本验证。

项目实战落地

项目里怎么做的

《AI Agent旅游行程智能规划平台》的 8 个工具,描述写在 @Tool 注解里,参数说明写在 @P 注解里,发给模型的就是这两处文字。项目里能看到三种写法:

  • 写清什么时候该调:行程上下文查询工具「编排开始时必须先调用一次」;点位详情工具「只在准备把某个点位写进行程之前调用,一次查一个」;
  • 写清什么时候不该调:行程上下文查询工具「不要重复调用本工具」;距离工具「不要用它穷举搜索最优顺序」;
  • 写清参数取值:班次工具的交通方式「取值:飞机/高铁/动车/大巴」;写入工具的明细类型「取 交通/景点/餐饮/住宿/自由活动」;

《AI Agentic RAG高级企业知识库平台》把描述存在 function_tool.description,原样发给模型:新增工具时描述不许为空(「模型靠它判断什么时候调用这个工具」);管理端能一键查看真正发给模型的工具定义 JSON,改完描述立刻验证;入参说明写错时退化成无参工具,不让整次执行崩掉。

为什么这样取舍

  • 可选参数必须同步声明:写了「不传表示不限」却没写 required = false,参数会进 Schema 的必填列表,模型每次都得硬塞一个值;描述和 Schema 必须说同一件事。
  • 知识库项目把描述放在表里:调描述和调 Prompt 是同一类工作,需要改完马上看效果,不用重新发布。

面试官还会追问

  • 旅游项目在工具中心里改了工具说明,模型下一次看到的描述会跟着变吗?为什么?
  • 距离工具的描述要求「不要用它穷举搜索最优顺序」,那模型应该怎么安排同一天点位的先后顺序?

学完《AI Agent旅游行程智能规划平台》,上面这些追问你都会迎刃而解。

本题落地项目地狱锤炼AI Agent旅游行程智能规划平台基于 SpringBoot + LangChain4j、攻略知识库 RAG、MySQL 向量检索、Function Calling 与数据库驱动工具中心,实现候选池预热与工具收窄、多城联游行程编排、14 条代码硬校验驱动的反思重排、教训记忆与多版本对比、三道闸防空转、编排前探活、预算测算和 Agent 执行时间线,覆盖从需求识别到行程交付的完整闭环。SpringbootLangChain4JAgentRAGFunction Calling源码+SQL喂饭学习教程配套面试文档环境安装文档项目运行文档 学习这个项目 也可以学AI Agentic RAG高级企业知识库平台地狱锤炼 查看项目