什么是函数调用?
无删除MCP服务器暴露网络和浏览器的能力,代理主机可以通过函数调用接口向模型呈现这些能力。
重点总结
- 函数调用是结构化模型输出。 模型请求带参数的命名工具;应用代码验证并执行它。
- 模型不运行该函数。 凭据、网络访问、副作用和结果处理保持在主机应用程序中。
- 架构塑造可靠性。 清晰的名称、描述、必填字段、枚举和有界值减少模糊调用。
- 仍然需要验证。 架构有效的参数可能是未经授权的、不安全的、过时的或对当前状态错误的。
- 工具结果继续对话。 应用程序返回函数结果,以便模型可以回答或选择另一个允许的步骤。
为什么这个主题重要
函数调用是一种模式,允许应用程序向语言模型描述工具,并收到一个结构化的请求以使用其中之一。 OpenAI函数调用文档 解释工具定义使用架构,应用程序执行所选功能。模型生成一个提案;它无法直接访问服务器、数据库、浏览器或凭证。
这种分离使语言模型在软件内部变得有用。自然语言意图可以映射到类型操作,而现有的应用程序代码保留了授权和业务规则。函数调用可以支持只读搜索、计算、记录查找、浏览器操作或交易。所需的风险和验证取决于副作用,而不是JSON的外观有多干净。
函数调用生命周期
主机向模型发送用户请求和一组可用的工具定义。每个定义都有名称、描述和输入架构。模型可以直接回答或返回带结构化参数的工具调用。主机解析该调用,检查它,执行相应的代码,并以正确的调用身份发送结果。
模型然后可以使用结果生成最终答案或请求另一个工具。多步骤的工具使用创建了一个代理循环,但函数调用本身只是模型和主机之间的接口。规划、内存、授权、调度和错误策略是单独的应用程序问题。
一个设计良好的工具代表一种有意义的能力。模糊的工具如`do_anything`隐藏权限,并给模型太多的参数组合。狭窄的搜索功能、客户查找或浏览器导航操作更容易描述、验证、观察和独立授予。
什么是良好工具定义的标准
- 清晰的名称。 使用动词和对象区分该能力与附近工具的不同。
- 以决策为中心的描述。 解释该工具何时该使用,它返回什么,以及重要的排除。
- 约束性架构。 要求必要字段,并故意使用枚举、格式、范围和嵌套对象。
- 类型化的结果。 返回稳定字段、源证据、操作状态和机器可读的错误。
- 明确的副作用。 让读取、写入、发送、删除、提交和购买的行为对主机和模型显而易见。
函数调用、API和MCP
这些概念在不同层次上运作,通常共同运作而非竞争。
| 概念 | 角色 | 关键边界 |
|---|---|---|
| 函数调用 | 模型请求一个类型操作 | 主机选择是否以及如何执行 |
| API | 软件服务暴露一个操作 | 认证和业务规则存在于服务中 |
| MCP | 服务器向兼容主机宣传工具和数据 | 主机决定哪些发现的能力可以到达模型 |
| 代理 | 协调目标、状态、工具和评估 | 自治受到政策和停止规则的限制 |
| 计算机使用 | 操作图形界面 | 操作需要当前的视觉或语义状态 |
实现安全的函数调用循环
将每个工具调用视为模型提出的不受信输入。应用与任何其他客户端期望的相同授权和验证。
- 库存能力。 按资源、副作用和权限拆分操作,这样每个工具都有一个易于理解的合同。
- 从实际函数设计模式。 匹配实际所需的输入和输出字段,而不是发明模型友好的参数,以至于代码无法支持。
- 验证上下文和权限。 检查身份、资源所有权、当前状态、允许的值、预算和批准,然后再执行。
- 返回精确结果。 包括稳定的标识符、证据和结构化错误类别,而不暴露秘密或内部堆栈跟踪。
- 记录完整的交换。 记录工具定义版本、请求参数、验证结果、执行结果和模型可见的响应。
评估工具使用
工具调用评估应区分选择、参数形成、执行和最终答案使用。
- 选择准确性。 模型是否选择了正确的工具或正确地避免了工具使用?
- 参数有效性。 调用是否满足模式和特定任务的语义限制?
- 授权行为。 主机是否在正确的边界阻止了不允许的资源并要求了批准?
- 结果使用。 模型是否在没有添加不支持的声明的情况下解释返回的字段和证据?
- 循环控制。 多步骤使用是否在完成、未进展或预算耗尽时停止?
函数调用风险
结构化输出改善了解析,但本身并不能使模型决策值得信赖。 NIST人工智能风险管理框架 提供了治理框架,而 HTTP语义规范 提醒实现者网络响应具有主机必须解释的精确语义。安全仍然是应用程序的责任。
- 过于宽泛的工具。 巨大的能力使得最小权限授权和有意义的评估变得困难。
- 语义无效性。 参数可以通过JSON Schema,但可能指向错误账户、过时记录或禁止目标。
- 通过工具结果的注入。 外部内容可以包含指令。将其作为数据返回,并保留系统政策优先级。
- 秘密泄漏。 工具定义和结果不应暴露凭证、私人路由或不必要的个人数据。
- 重复副作用。 主机应使用操作身份和当前状态检查,以便重复的模型调用不会产生意外的写入。
函数调用使用案例
当前信息
让模型请求搜索或检索,并接收带有来源的结果。
业务查找
将用户问题转换为针对批准服务的验证查询。
网络操作
将浏览器操作作为带有会话和域策略的狭窄能力进行暴露。
工作流助手
准备结构化的写入操作,并在提交之前要求应用程序或人工审批。
从试点到生产
一个有用的函数调用试点应足够小,以便逐条检查记录。从 库存能力开始:按资源、副作用和权限拆分操作,以便每个工具都有一个可理解的合同。然后应用 真实函数的设计模式:匹配实际所需的输入和输出字段,而不是发明模型友好的参数,代码无法予以遵守。保持第一个评估集故意混合,包括普通情况、模糊情况、缺失证据和系统必须拒绝或转交的操作。这表明工作流在高级别隐藏设计错误之前是否了解其边界。
生产就绪需要为每个度量和工件指定一个所有者。跟踪 选择准确性 以回答模型是否选择了正确的工具或正确避免了工具的使用?跟踪 参数有效性 以确定调用是否满足模式和任务特定的语义约束?添加 授权行为 以便团队可以查看主机是否阻止了不允许的资源,并在正确的边界处要求审批?这些措施应链接到基础记录,而不是仅仅作为仪表板总数存在。审核者需要从变更的度量移动到产生它的确切查询、来源、观察或操作。
操作控制应针对最有可能改变商业决策的失败模式。第一个审查规则应涵盖 过于宽泛的工具:大型能力使得最小权限授权和有意义的评估变得困难。退出审查应涵盖 重复副作用:主机应使用操作身份和当前状态检查,以便重复的模型调用不会产生意外的写入。分配响应所有者,定义解决问题的证据,并记录结果是否更改数据、提示、工具、权限或来源政策。该记录防止同一缺陷被重新发现为未解释的质量波动。
仅在试点行为可预测后扩展。团队可以从当前信息开始,任务是让模型请求搜索或检索,并接收带有来源的结果。第二阶段可以添加业务查找,其中工作流必须将用户问题转换为针对批准服务的验证查询。随着范围的扩大,保持原始测试集的运行。新的来源、市场、工具和权限应逐一引入边界,以便可归因于特定变更,而不是同时平台重写。
结论
函数调用为语言模型提供了一种类型化请求软件能力的方式。其可靠性来自于周围的主机:准确的模式、语义验证、最小权限、确定性授权、稳定的结果和完整的痕迹。模型选择;应用程序保持负责。
从只读工具和短能力集开始。在添加副作用之前,对真实任务评估选择和参数。该序列将自然语言的灵活性转化为受控软件行为。
准备向代理主机暴露网络工具?
使用无抓取的MCP服务器和代理浏览器,通过结构化工具接口提供有限的网络能力。
今天注册并获得 5美元的免费信用 — 无需信用卡.
领取您的5美元信用→常见问题
函数调用是否在LLM内部执行代码?
不。模型发出结构化的工具请求。主机应用验证它,执行自己的代码或服务调用,并将结果返回给模型。
函数调用是否与API相同?
不。API暴露软件操作。函数调用是请求操作时面向模型的模式。应用程序代码通常将函数调用映射到一个或多个API。
MCP是否与函数调用相同?
不。MCP标准化主机如何连接到能力服务器并发现工具或资源。主机可以通过其函数调用接口向模型呈现选定的MCP工具。
JSON模式是否使工具调用安全?
不。模式验证检查结构和某些值约束。主机仍然必须验证身份、所有权、授权、业务规则、当前状态和副作用审批。
模型应该接收多少个函数?
使用与任务相关的最小集合。过多重叠的工具增加选择模糊性,并使权限更难以推理。工具路由可以在模型选择之前缩小更大的目录。