Function撰写最佳实践
本文将说明如何撰写号Function Call来提升Function Call命中和参数提取的准确率
一、Function Call的作用
Function Call,就是让 AI「学会调用外部工具」。大模型不直接干活,只输出一段固定格式的 JSON 消息,告诉业务要干什么。
例:
用户:帮我烤30分钟鸡翅
模型:[F]:{"session_id":"1778240977638","content":"{"function_name":"control_device","parameter_list":[{"type":"鸡翅"},{"time":30}]}","query":"帮我烤30分钟鸡翅"}
二、撰写指南
| 模块 | 影响层面 | 什么时候需要调整 | 填写建议 |
|---|---|---|---|
| Function 名称 | 是否命中 Function | 没命中 function,走到人设 | 1. 采用动宾结构 ✅ exist_conversation❌ conversation_exist2. 名字和 Function 的功能强相关 |
| Function 描述 | 是否命中 Function | 1. 没命中 function,走到人设 2. 没命中此 function,命中了其他 function |
1. 概括 Function 功能,语义清晰 2. 若命中了 function 没命中对,要在描述中写清楚 Function 的概括边界 例如:xxxx 相关意图命中 xx function,xxxx 相关意图不得命中 xx function |
| Function 例句 | 是否命中 Function | 没命中 function,走到人设 | 1. 泛化但不重复 2. 相似的宾语可用 xx 代替,如:烤鸡翅、烤蛋挞 → 烤 xx |
| Function 参数描述 | 参数提取是否准确 | 1. 该提取出的参数没提取出来 2. 提取出了参数,但是参数值不对 |
1. 和提示词要求一样:简洁、语义清晰、逻辑清晰、指代清晰、无歧义 2. 推荐格式: 参数功能 + 取值范围 + 参数要求 3. 函数参数不是必填,按需填写即可 4. 必要时可加 `强调:xxxxx` 5. Function 参数处理时,会将同一 Function 的所有参数描述一起发送给模型,因此参数之间可能存在相互影响 |
| Function 参数样例 | 参数提取是否准确 | 1. 该提取出的参数没提取出来 2. 提取出了参数,但是参数值不对 |
1. 非必填,不是越多越好(写多了可能适得其反),仅在必须纠正时填写,正常可不填 2. 建议最多不超过 4 个 |
通用规则
- Function名称、描述非简单记录管理Function,正确规范的名称和Function描述可提升Function准确率
- 句式通顺
- 语言简洁凝练,清晰易懂
- Function数量建议不超过20个,若Function较多,需适当合并;Function数量较小的情况下,可把每一类意图单独写为一个function,提升准确率
1、Function名称
作用:Function名称需要规范和语意清晰,这会影响function命中的准确率
注意事项:需使用动宾结构
例:control_device、adjust_volume
2、Function描述
作用:Function描述会影响Function命中的准确性,因此需要对Function的适用场景和能力进行清晰、准确且简洁的概括,避免描述模糊或歧义
注意事项:需清晰概括Function作用
例:Function用作控制空气炸锅,其中设置了温度、时间、菜谱、预约时间4个参数,描述为
控制空气炸锅,包括设置温度、时间、菜谱和预约时间
3、Function例句
作用:影响Function命中的准确率
注意事项:
- 做高度泛化、句式不重复
- 若实际测试中发现意图识别不到,则适当添加例句,提高泛化程度,例句数量控制在10句以内
- 例句应尽量覆盖不同表达习惯、口语化说法及典型场景
例句不冗杂重复:例:把音量调大、把音量调大一点、请把音量调大、把音量调高---->归纳为:音量调大
例句泛化:音量调大、声音开大些、帮我把声音调、大点声
*实际应用场景中,建议输入query为意图清晰完整的句子。使用简短词汇,易出现短语音ASR识别偏差,意图不清晰的问题,导致调用Function出错
❌:”咖啡“,”切换成儿童”
✅:”煮咖啡“,“切换成儿童模式”
*当 Function 存在固定模式、预置菜单或特定功能配置时(如固定菜单:煮柠檬茶、咖啡、白开水),建议在例句中尽可能完整覆盖这些固定模式名称,以帮助模型建立模式与 Function 的稳定映射关系,提升识别与命中效果。
4、Function参数
参数撰写标准
- 不懂业务的人也能一眼判断该参数应该提取什么值。
- 大模型能够准确理解参数的提取规则、边界及约束。
- 人和模型阅读后均不存在歧义。
- 在保证信息完整的前提下,描述尽可能凝练,不冗长。
建议结构:
参数含义/功能: 一句话说明参数作用
参数取值(枚举值,取值范围等)
例1:菜谱类型,取值为[红薯、蛋糕、鸡翅]的一种
例2:设备控制类型,取值为[打开、关闭、向上开、向下开、向左开、向右开]的一种
例3: 工作时间,取值范围为[10-60]间的整数
是否存在默认值、映射关系等
例:
用户姓名。提取输入固定前缀“新增用户,用户关于名字的回答为:xx”中的姓名内容,
- 当内容无法识别为有效姓名,或回答为无关文本等非姓名信息时,默认返回 -1。
- name为必填参数
其他特殊处理规则(如边界处理规则、校正的不命中条件,自动补全条件等)
例1:取值超出范围处理规则
若用户输入值超出取值范围,则去取值范围边界值作为xx参数值
例2:校正的命中/不命中条件
仅当用户明确表达“预约”“延迟启动”“多久后开始”等延迟启动意图时命中该参数,例如“预约60分钟”“半小时后开始”“90分钟后再烤”。
例3:自动补全条件
根据用户要煮制的饮料选择合理的温度作为temperature参数的取值。
注意事项:function参数为非必填项,参数按需配置。一些function无需配置参数,仅配例句就可以,如取消预约,关机。
- 参数名
- 参数类型:按需选择
- 是否必填:建议设置为「非必填」。如为必填参数,未补齐时会持续提醒补齐
- 参数描述:简洁凝练,清晰表达
5、其他辅助配置项
- 执行前确认:开启执行确认后,命中 Function 时,会向用户确认命中的函数及参数提取结果是否正确

开启后的例子:
用户:“给我订一张明天下午六点半上海去北京的机票”
模型:“为您订一下2026年5月9日16:00,出发地为上海,目的地为北京的机票“
用户:”确认“
模型:[F]:{"session_id":"1778240977638","content":"{"function_name":"book_flight","parameter_list":[{"date":"2026-05-09"},{"time":"16:00"},{"departure":"上海"},{"destination":"北京"}]}","query":"给我订一张明天下午六点半上海去北京的机票"}
6、动态变量
什么是动态变量?
动态变量用于在 Function 的描述、例句或提示词中,引用运行时的真实数据,而无需手动维护所有可能的取值。
系统会在模型推理前,自动将动态变量替换为实际内容,从而提升意图识别和参数提取的准确率。
为什么需要动态变量?
在实际业务中,很多数据都是动态变化的,例如:
- 用户名称
- 设备名称
- 家庭成员
- 房间名称
- 自定义别名
如果直接将这些内容写成固定例句,很难覆盖所有情况。
例如,一个设备支持切换多个用户:
1我是李明
2我是小王
3我是妈妈
4我是老板
5我是漂亮
其中,用户名称可能是任意内容,甚至可能是"漂亮""宝宝"等普通词汇。
如果例句仅写:
1我是李明
2我是王刚
模型可能无法理解:
1我是漂亮
是在切换用户,而误判为普通聊天,导致未命中对应 Function。
如何使用?
以上场景可以在例句中使用动态变量:
1我是{{username_list}}
2我叫{{username_list}}
其中:
{{username_list}}表示当前设备已存在的所有用户名列表。- 模型推理前,系统会自动将其替换为真实用户名。
例如:
当前设备存在以下用户:
1李明
2王刚
3漂亮
4宝宝
系统实际发送给模型时,例句会自动展开为:
1我是李明
2我是王刚
3我是漂亮
4我是宝宝
模型即可正确识别这些表达均属于"切换用户"场景。
使用建议
建议将动态变量用于:
- 用户名称
- 设备名称
- 房间名称
- 自定义别名
- 其他业务中的动态数据
避免手动维护大量固定例句,提高覆盖率,并减少因用户自定义名称导致的意图识别错误。
错误使用情况
情况1: 变量不存在:未在创建实例时上传动态变量。如何创建动态变量动态变量管理最佳实践
情况2: 使用场景错误:当参数取值固定、枚举值明确时,无需使用动态变量,应直接填写固定值。例如咖啡机饮品类型(咖啡、美式、拿铁等)属于固定枚举值,应直接写明具体值,而非引用动态变量。
示例
1.function名称:switch_user
2.function描述:切换用户
3.例句:
- 切换为李明用户
- 用户切换成王刚
- 用户切换为王刚
-
切换用户为{{username_list}}
4.参数:
| 参数名 | 类型 | 必填 | 描述 |
|---|---|---|---|
name |
string | 否 | 用户名字。当用户使用“我是XX”“我叫XX”“我的名字叫XX”“名字是XX”“大家都叫我XX”“你可以叫我XX”等表达时,必须提取对应名称。仅返回名称本身。name为必填参数。 |
7、常见问题
1、总会用程序语言提醒我去补全参数,不补全一直提醒,当function是否必填参数为”是“,用户输入又没提取出这个参数时,会有这个问题
解决方法1:并非必填参数,没有此参数,业务侧也能进行兜底
- 是否必填改为否
- 参数描述加一句:”xx为必填参数“
- 端侧设置默认值兜底
解决方法2: 适用于确实为必填参数,无此参数业务侧没办法做出相应
- 联系我们开启function的系统prompt
- 参考原有默认参数补齐提示词来填写参数补全的输出
2. 为什么我说某一句话总不命中 Function?
原因
当前 Function 无法识别该表达,通常是因为例句覆盖不足,或未在 Function 描述中体现该类意图。
解决方法
方法一:补充 Function 例句
如果仅是某一句表达无法命中,可直接将该表达添加到对应 Function 的例句中。
方法二:强化意图描述
如果该表达代表的是一类用户意图,应在 Function 描述或参数描述中明确强调该类意图应命中当前 Function。
3. 为什么我说某一句话总会误触 Function?
原因
模型无法正确区分当前意图与其他 Function,导致错误命中。
解决方法
方法一:增加负向描述
在 Function 描述中明确说明:
当用户输入 xxx 等意图时,不命中 xx Function。
方法二:完善意图分类(系统Function提示词)
对于聊天、咨询等非控制类意图,在意图分类中明确配置走到聊天类,避免误命中 Function。
4. 为什么我的 Function 命中率低?
步骤一:检查 Function 是否承担过多意图
如果一个 Function 同时承担多个不同意图,例如:
- 开关灯
- 打开蓝牙
- 开机
全部放到同一个 Function 中,会导致 Function 的主题不清晰,模型难以判断用户真正想执行哪一种操作,从而降低命中率。
解决方法
建议将不同类型的意图拆分为多个 Function,保持每个 Function 职责单一、语义清晰。
步骤二:优化 Function 描述和例句
如果 Function 职责已经足够清晰,但命中率仍然较低,可继续优化:
- Function 描述
- Function 例句
增加更多覆盖真实用户表达的例句,提高模型识别能力。
5. 为什么我的 Function 中,总有几个参数解析不出来?
原因
参数描述不清晰,主要体现在:
- Function 例句中没有体现相关参数。
- 参数描述中没有说明什么情况下提取该参数,以及参数值如何确定。
原理说明
Function 参数解析本质上依赖用户意图。
只有当例句中明确体现了对应意图,模型才能学习到参数与用户表达之间的对应关系,从而正确提取参数。
例如:
1眼睛动一动
对于这类表达,如果参数描述中没有明确说明应命中哪个参数,模型无法判断具体对应关系,因此容易出现参数无法解析的问题。
解决方法
参数描述应做到:
- 清晰说明参数作用。
- 明确说明什么情况下提取该参数。
- 明确说明参数值如何确定。
- 在例句中体现用户表达与参数取值之间的对应关系。
建议按照不了解业务的人阅读后,也能够准确判断应命中哪个参数的标准编写参数描述。
8、示例
示例1:家电控制
背景
用户可能在一句话中同时表达多个控制意图,例如:
- 烤鸡翅
- 30分钟后烤鸡翅
- 30分钟后180度烤10分钟
此类场景需要同时提取多个参数(菜品、温度、工作时间、预约启动时间),因此统一放在同一个 Function 中处理。
Function 名称
1select_recipe
Function描述
选择或切换烹饪菜品,并可同时指定该菜品的温度与时间。
- 当输入同时包含菜品名称和温度、工作时间或预约启动时间时,若整体语义是执行烹饪任务,则命中
select_recipe。 - 此 Function 仅用于明确的控制指令,不处理"如何烤XX""怎样烤红薯"等咨询或教程类问题。 预置菜品及默认温度(℃)/时间(分钟): 红薯:200/35, 薯条:180/20, 蛋挞:180/15, 复热:100/5, 鸡翅:200/15, 排骨:180/20, 大虾:180/10, 蛋糕:160/30, 全鸡:200/40
例句
1半小时后开始做鸡翅
2温度调到200度烤45分钟
3给我做排骨烤45分钟
490分钟后100度烤1个小时
5烤红薯时间15分钟
6温度改为60度时间10分钟
7我想烤蛋挞
8烤薯条
9烤鸡翅
10烤排骨
11烤全鸡
12烤大虾
13复热
14切换到xx模式
15帮我烤xx
16我想烤xx
17我想做xx
1860分钟后烤鸡翅
1960分钟后200度15分钟烤排骨
20烤xx和xx
输入参数
| 参数名 | 类型 | 必填 | 描述 |
|---|---|---|---|
recipe |
String | 否 | 用户要烹饪的菜品名称,系统预置菜品列表为:["红薯"、"薯条"、"蛋挞"、"复热"、"鸡翅"、"排骨"、"大虾"、"蛋糕"、"全鸡"]。当用户要烹饪的菜品在预置菜品列表中时,recipe 取值为对应预置菜品名称;当菜品不在预置菜品列表中时,recipe 取值为用户输入的菜品名称,并根据该菜品自动补全合理的 temperature 和 cooking_time 参数。 |
| 参数名 | 类型 | 必填 | 描述 |
|---|---|---|---|
cooking_time |
Number | 否 | 空气炸锅工作时间,单位为分钟,取值范围为 1~60 的整数;若超出取值范围需将边界值作为cooking_time的参数值。默认时间:红薯35、薯条20、蛋挞15、复热5、鸡翅15、排骨20、大虾10、全鸡40。当 recipe 为预置菜品时,若用户指定时间则使用用户时间,否则使用默认时间;当 recipe 非预置菜品时,必须根据菜品自动补全合理时间。cooking_time 仅作用于自身字段,不得影响 recipe 和 temperature 参数取值。cooking_time 为必填参数,不得为空。 |
| 参数名 | 类型 | 必填 | 描述 |
|---|---|---|---|
temperature |
Number | 否 | 工作(烤)温度,取值范围为 60~200 的整数;若超出取值范围需将边界值作为temperature的参数值。默认温度:红薯200、薯条180、蛋挞180、复热100、鸡翅200、排骨180、大虾180、全鸡200。当 recipe 为预置菜品时,若用户指定温度则使用用户温度,否则使用默认温度;当 recipe 非预置菜品时,必须根据菜品自动补全合理温度。temperature 仅作用于自身字段,不得影响 recipe 和 cooking_time 参数取值。temperature 为必填参数,不得为空。 |
| 参数名 | 类型 | 必填 | 描述 |
|---|---|---|---|
delay_time |
Number | 否 | 空气炸锅预约启动时间,单位为分钟,取值范围为 30~540。若超出取值范围需将边界值作为delay_time的参数值。 规则: (1)仅当用户明确表达"预约"、"延迟启动"、"多久后开始"等延迟启动意图时命中该参数,例如:"预约60分钟"、"半小时后开始"、"90分钟后再烤"。 (2)若用户仅表达工作时长,如:"烤30分钟"、"烤蛋挞30分钟"、"复热10分钟",不得命中 delay_time。(3)最终输出的 delay_time 值必须满足:30 ≤ delay_time ≤ 540。 |
参数示例
示例一
用户输入
1烤罗非鱼
参数结果
1recipe = 罗非鱼
2temperature = 180
3cooking_time = 10
示例二
用户输入
1烤鸡翅180度20分钟
参数结果
1recipe = 鸡翅
2temperature = 180
3cooking_time = 20
示例三
用户输入
160分钟后200度15分钟烤排骨
参数结果
1recipe = 排骨
2temperature = 200
3cooking_time = 15
4delay_time = 60
示例四
用户输入
1帮我烤蛋挞和鸡翅
参数结果
1recipe = 鸡翅
2temperature = 200
3cooking_time = 15
示例五
用户输入
110分钟后烤鸡翅
参数结果
1recipe = 鸡翅
2temperature = 200
3cooking_time = 15
4delay_time = 30
示例2:家电控制-控制相对值
Function名称:adjust_relative_settings
Function描述
在当前空气炸锅温度/时间/预约启动时间的基础上进行相对调整(增加或减少一定幅度),适用于用户表达变化量而非目标值的场景。
例如:
- 温度升高10度
- 时间加5分钟
- 温度调低20度
- 晚10分钟开始
- 温度高一点
注意:
若用户明确指定了一个目标数值(如"调到180度"、"温度设为100度"、"调整温度到100度"),请勿使用此 Function,而应命中 control_list Function。
例句列表
1温度高一点
2温度调低10度
3晚10分钟开始
4时间加10分钟
输入参数
| 参数名 | 类型 | 必填 | 描述 |
|---|---|---|---|
relative_temperature |
Number | 是 | 温度相对调整值(℃)。正数表示升温(如"升高10度"取 +10),负数表示降温(如"降低20度"取 -20)。模糊表达"高一点""热一点"默认取 +5;"低一点""凉一点"默认取 -5。注意:若用户说的是目标温度值,此参数不应被使用。 |
relative_time |
Number | 是 | 时间调整值(分钟)。正数表示延长,负数表示缩短。 |
relative_reservation_time |
Number | 是 | 预约启动时间调整值(分钟)。正数表示延后启动,负数表示提前启动。 |
参数样例
| 输入例句 | relative_temperature | relative_time | relative_reservation_time |
|---|---|---|---|
| 温度增加20 | 20 | — | — |
| 少烤10分钟 | — | -10 | — |
| 温度高一点 | 10 | — | — |
评价此篇文章
