直接回答
函数调用是一种协议,让模型提出某个具名操作和参数;它并不授权模型执行该操作。Google 的 Gemma 函数调用指南明确说明,宿主应用必须解析调用、验证函数名和参数,并通过受控映射执行。把宿主应用构造成策略边界:只接受白名单工具,按模式解析参数,结合当前应用状态检查参数,在使用时检查 Android 权限,并对有实际后果的操作征求用户确认。只有宿主操作完成后,才把有限结果返回给模型。 模型可能给出格式错误、模糊、过时或受提示注入影响的参数。即使输出语法正确或是 JSON,也应视为不可信输入。拒绝未知工具、缺失必填字段、不符合允许范围的值,以及与授权或用户意图冲突的请求。不要使用反射、动态方法查找或全局符号表按模型提供的函数名任意调用。将精确工具标识映射到一段已知实现。 工具定义要足够窄。优先提供“草拟一条笔记”或“展示一段译文”,不要暴露“管理文件”或“发送任何内容”一类宽泛操作。将可撤销的展示与持久写入、对外通信、购买、删除、权限变更和账户操作区分开。端侧推理可以避免把提示发送到远程推理服务器,但工具执行仍可能访问网络 API、修改本地数据、打开另一应用或暴露剪贴板。应用必须独立说明并执行这些边界。 执行前要把提案绑定到当前请求,确认用户没有取消或切换任务,并在产品策略要求时再次确认。可重试操作应使用幂等键或状态检查,避免超时或进程重建后重复执行。不能把模型重复输出视为新的用户授权。执行后只返回模型真正需要的最小结果,不含凭据、私人记录或大段工具输出。默认记录工具名、校验决定、用户确认、结果和错误类别,但不记录敏感参数。 安全流程包含明确阶段:生成提案、解析、验证结构、授权、必要时确认、执行已知处理器、验证结果并总结。“不执行”或拒绝必须是合法结果。如果解析无法确定调用边界、必填参数缺失或应用状态检查失败,操作就不能运行。执行发生错误时,不要要求模型自行编造一个更强大的工具调用;应报告错误或提供受限重试。 测试边界时用良性与对抗样例:未知函数、类型错误、缺字段、多余字段、超范围参数、过期请求、重复调用、用户取消、权限拒绝、进程重建以及处理器部分执行后失败。还要测试字符串字段里夹带指令时,宿主是否仍把它当数据。每种影响大的工具都应单独验证策略。模型能按格式输出调用,不证明它选对动作;一个演示成功也不是安全认证。 移动操作仍需宿主处理 Android 运行时权限。当相机、麦克风、联系人或位置确实是用户操作所需时,应说明原因,在访问前检查权限,并在拒绝后优雅降级。删除、发送和购买都应按应用明确策略确认,不能让模型自行推断用户同意。模型不能给自己授予权限。 最低实现步骤:先定义封闭工具注册表与类型化参数;再严格解析模型输出;检查应用策略和 Android 权限;对持久或重要操作先取得用户确认,再调用固定实现;验证本地状态并只返回最小安全结果;最后用对抗和回归样例测试,并以隐私安全方式保留验证记录。核心原则是:本地模型可以建议,权限、校验、授权、执行和说明责任仍属于应用。
语音助手提出创建日历或导出操作
Android 应用接收本地模型的结构化输出,计划用它创建提醒、复制识别文本或导出文件。输出可能格式错误、重试时重复,或者基于已经过期的屏幕状态。
决策
把提案视为不可信数据,通过固定工具注册表、当前状态验证、Android 权限检查以及必要的用户确认后再处理。
预期结果
只有显式允许的处理器可以执行;重复调用受到控制,用户可取消或拒绝提议的操作。
需要收集的证据
只有将以下证据与同一模型文件和测试运行关联起来,结论才可复核:
- 固定工具注册表与参数结构
- 权限和用户确认记录
- 执行结果和安全日志
任务质量需要有版本记录的语料和验收规则;流畅的单条样例不等于准确度结果。
实施流程
- 定义狭窄工具和参数结构. 建立包含精确标识、必填字段、类型、范围以及无操作结果的工具白名单。不要暴露通用执行器、任意反射或可将模型函数名映射到不受限应用代码的接口。
- 依据当前状态解析与校验. 拒绝未知工具、格式错误、类型不符、缺少必填值、超范围参数、过期请求标识以及与当前界面任务不符的提案。把参数字符串当数据,而不是给宿主下的指令。
- 执行权限和确认策略. 在访问受保护资源前检查 Android 权限。结合具体上下文说明用途,权限被拒后优雅降级;持久、破坏性、财务或对外分享操作按产品策略先确认。
- 执行一个已知处理器并验证. 调用预先定义的实现;用请求身份或当前状态保护重试,验证本地状态,只返回最少且不敏感的结果。取消、重复提案和部分失败都应可见,不能静默改执行其他动作。
让每个阶段的状态都可观察。失败信息应指出阶段、模型、运行时和恢复动作,同时避免记录用户私密内容。
验收标准
- 模型提供的名称不能调用封闭白名单以外的函数。
- 结构错误、权限拒绝、状态过期、取消、重复提案和处理器失败都会停止或限制执行。
- 重要或分享操作遵循应用明确确认政策;结果和日志默认不包含敏感参数。
决策对照表
| 维度 | 选择或证据 | 解读方式 |
|---|---|---|
| 模型生成结构化提案 | 不可信输入 | 任何处理器运行前都必须解析、校验结构并授权。 |
| 固定白名单处理器 | 应用控制的能力集合 | 限制可用动作,但仍需权限、状态和用户策略检查。 |
| 根据返回函数名动态执行 | 不受限调度 | 不安全,因为模型输出可选择用户和应用未授权的代码。 |
需要避免的失败模式
- 用反射执行模型返回的函数名
- 把合法 JSON 当作用户同意
- 认为本地推理等于工具无网络
还要避免静默回退、版本未固定、缺少取消处理,以及把不同配置的结果混在一起下结论。失败运行也应与成功记录一并保存。
最小复现记录
| 层级 | 记录内容 |
|---|---|
| 设备 | 厂商、型号、芯片、内存档位、操作系统版本 |
| 软件 | 应用版本和 Git 提交号 |
| 模型 | 系列、变体、版本、格式、文件长度、摘要、量化方式 |
| 运行时 | 名称、版本、请求后端及实际后端证据 |
| 工作负载 | 样例版本、输入摘要、提示词摘要、输出策略 |
| 结果 | 完成、失败、取消、回退及保护隐私的诊断信息 |
发布检查表
- ☐ 主要搜索问题已回答,且没有未经支持的数字。
- ☐ 所有模型文件和运行时版本均已固定。
- ☐ 代表性任务和失败处理策略均有说明。
- ☐ 生命周期、取消、清理和回退均已测试。
- ☐ 用户内容与网络边界均有说明。
- ☐ 结论只适用于被记录的配置。
- ☐ 新增测试结果时链接到原始方法或证据。
来源与相关证据
- FunctionGemma mobile actions
- Google AI for Developers — Gemma 函数调用
- Google AI for Developers — FunctionGemma 模型卡
- Android Developers — 请求运行时权限
- Android Developers — 不安全反序列化风险
中文部署与排错专题见。奇连 AI 端侧专题。
常见问题
函数调用模型会自己执行函数吗?
不会。模型只生成提案;宿主应用仍负责解析、验证工具名和参数、检查权限与授权策略、调用预先定义的处理器,并把受限结果返回给模型。
模型在本地运行,工具调用就一定隐私吗?
不一定。处理器仍可能发起网络请求、写文件、访问受保护数据或通过其他应用分享。要独立审计每项工具的数据流,不能只看推理位置。
参数结构合法后能自动执行所有动作吗?
不能。结构合法不等于用户同意。当前应用状态、权限、用户取消和动作影响仍然重要;持久写入、删除或分享操作应遵循明确的确认策略。