一个在生产环境中运行的智能体曾经收到指令"清理测试数据",然后对生产数据库执行了 DROP TABLE 命令。工具调用成功执行了。审计日志显示了一个结构完美的 JSON 载荷。智能体做的恰恰就是被要求做的——只是不是任何人所期望的那样。这不是一个提示注入的故事,而是一个架构选择的故事:团队赋予了智能体生成和执行任意代码的能力,却低估了这在运行时真正意味着什么。
将函数调用与代码生成作为 AI 智能体动作层之间的选择,是智能体架构中最关键的决策之一,却几乎没有人对其进行直接基准测试。论文衡量任务完成的准确性;它们很少衡量在生产中真正重要的失败模式——静默语义错误、不可逆副作用、安全暴露面,以及出错时的调试成本。
两种方法的真正含义
函数调用(也称为工具调用或结构化工具使用)通过给 LLM 一个由 JSON 模式描述的预定义操作菜单来工作。模型选择调用哪个工具并生成与模式匹配的结构化参数。执行环境随后验证并运行匹配的函数。LLM 的输出始终是一个结构化数据对象——它从不直接指定执行逻辑。
代码生成作为动作层则本质上不同。模型输出可执行代码——Python、JavaScript 或其他语言——运行时执行它。模型不是从菜单中选择,而是在编写程序。CodeAct 等库将这一模式形式化,OpenAI 的代码解释器和类似的沙盒环境将其投入生产。
关键区别不在于"结构化 vs. 非结构化输出",而在于模型控制什么。使用函数调用时,模型控制做什么;执行系统控制如何做。使用代码生成时,模型两者都控制。这一差异在可靠性、安全性、灵活性和成本方面都会产生下游影响。
每种方法真正胜出的场景
Berkeley 函数调用排行榜等基准测试揭示了一个反直觉的结论:前沿模型在简单情况下能可靠地选择正确的函数。函数选择本身的失败率很低。模型失败的地方在于它们对结果所做的事情——对工具输出应用逻辑、正确链接操作,以及从意外返回值中恢复。在衡量超出简单参数生成的逻辑错误的研究中,这些下游推理步骤的准确率可能下降高达 75%。
代码生成显示出不同的失败特征。将 CodeAct 与结构化工具调用替代方案进行比较的研究发现,代码生成在复杂多步骤任务上成功率高出 20%,并将交互轮次减少了 30%。原因在于组合能力:代码生成智能体可以编写循环、使用中间变量、内联表达分支逻辑,而不是进行五次顺序工具调用并在每次调用之间等待结果。单次生成可以处理原本需要多次模型调用的工作。
这种权衡形态提示了清晰的任务类别:
函数调用胜出的场景:
- 任务清晰映射到预定义操作(数据库查询、API 读取、日程安排)
- 可审计性和合规性至关重要——每个动作都记录为一个离散的、类型化的调用
- 延迟和 token 成本是约束——结构化调用避免了代码生成和执行的开销
- 动作空间应该有界——你不希望智能体在运行时发明新能力
代码生成胜出的场景:
- 任务需要用中间逻辑组合多个操作
- 智能体需要根据中间结果进行调整——条件路径、重试、转换
- 领域是软件开发、数据分析,或任何在代码中表达逻辑是自然的场景
- 你想减少往返次数——在一次生成中编写完整程序比逐步编排工具调用更快
改变一切的安全不对称性
这是代码生成倡导者感到不舒服的分析部分。
使用函数调用,威胁模型是狭窄的:恶意或困惑的模型可能用错误参数调用函数,或调用错误的函数。两者都很糟糕,但两者都是可预测和可约束的。你可以在执行前验证模式,对高风险操作要求人工确认,并对照固定目录审计每次调用。
使用代码生成,威胁模型急剧扩大。能编写任意代码的智能体原则上可以编写以下代码:
- 读取不应该读取的文件
- 向外部端点发出网络请求
- 执行代码生成提示从未明确授权的 shell 命令
- 链接操作以实现任何单个工具调用都不允许的效果
提示注入——对于使用工具的智能体而言已经是一级关注点——当执行层是代码时会变得在操作上危险。在函数调用架构中,成功的注入可能导致智能体调用不应该调用的 API。在代码生成架构中,它可能导致智能体执行任意命令。
2025 年关于运行时强制框架的研究表明,当代码生成提示较为复杂时,简单的沙盒捕获的不安全执行尝试不到一半。更健壮的方法——信息流控制、预执行策略检查、黑名单/白名单强制执行——可以实现 90% 以上的不安全执行预防,但需要大量基础设施投资。
操作要点:对于大多数接触敏感数据或不可逆操作的生产工作流,函数调用受约束的动作空间是一个特性,而非限制。
解析错误是一个惊人的隐藏税
代码生成有一个在基准论文中很少出现的实际失败模式:markdown 解析错误。当 LLM 将代码包裹在 markdown 围栏中时,执行环境需要可靠地提取代码。对多步骤智能体轨迹的研究发现,2.4% 的首次代码生成调用由于 markdown 解析错误失败——不是逻辑错误,不是运行时错误,只是格式化提取问题。存在解析错误的轨迹比干净轨迹的成功率低 21%。
HuggingFace 的结构化 CodeAgent 模式通过将代码生成输出约束为带有明确 thoughts 和 code 字段的 JSON 对象来解决这个问题。这完全消除了解析错误类别,并为有能力模型上推理密集型任务增加了 2-7 个百分点的任务准确率。权衡是你获得了结构化输出的可靠性以及大多数代码生成的灵活性——代价是输出 token 数量增加。
函数调用没有这个问题。结构化 JSON 格式是模型经过微调生成的;它不会经过可能失败的解析层。
调试不是对称的
这一选择中一个被低估的维度是出错时会发生什么。两种方法都会失败;问题是失败是否可解读。
使用函数调用,失败轨迹看起来像:函数调用 → 参数 → 返回值 → 下一个动作。你可以像读日志一样读它。你可以对每个函数编写确定性测试。你可以重放轨迹。出错时,你通常可以识别哪个函数调用出错了以及原因。
使用代码生成,失败模式是一个行为出乎意料的程序。调试需要理解生成的代码、运行时环境、中间变量状态,以及代码是否正确解读了上一个工具调用返回的内容。失败面更大且更隐式。执行成功但产生错误输出的代码比类型错误更难捕获。
这种不对称性对需要快速迭代生产失败的团队影响最大。损坏的函数调用模式很容易修复和测试。系统性缺陷的代码生成模式——模型可靠地错误解读某类 API 响应——更难表征,也更难进行回归测试。
生产系统实际使用的混合模式
当你审视复杂生产智能体系统的实际构建方式时,函数调用与代码生成之间的虚假二元对立就消解了:它们两者都使用,选择由动作类别决定。
常见架构将动作分为确定性层和组合层:
- 确定性操作(数据读写、具有已知模式的 API 调用)通过函数调用运行。模型选择和参数化;系统验证和执行。
- 组合操作(转换、分析、多步骤程序)通过代码生成路径进行,有沙盒执行和输出验证,然后将结果返回给智能体。
编译 AI 方法更进一步:LLM 在"编译时"一次性生成代码,后续执行在关键路径上确定性运行,无需任何模型调用。对于高吞吐量或合规敏感的工作流,这完全消除了不确定性,代价是失去运行时适应性。与按请求模型推理相比,在大约 17 次交易后达到盈亏平衡,之后编译代码变得更加 token 高效。
另一种模式——工具搜索加代码模式——解决了当智能体目录增长到超过 30 个工具时出现的扩展问题。智能体的工具模式被编译成 TypeScript API 表面,而不是在上下文中呈现完整的工具菜单(昂贵、缓慢、降低推理质量)。模型针对 API 编写代码,而不是从 JSON 菜单中选择。这在大型目录上将 token 消耗减少了 85%,同时保留了预定义工具实现的安全属性。
反映生产现实的决策框架
在为给定智能体或任务类别选择函数调用与代码生成之间时,有用的问题是:
错误动作的爆炸半径是什么? 如果不可逆操作是可能的,函数调用有界的动作空间和更容易的人机协作模式值得牺牲灵活性。
任务的组合程度如何? 清晰映射到 API 调用的单操作任务倾向于函数调用。需要条件逻辑、循环或中间状态操作的任务倾向于代码生成。
你的调试基础设施是什么样的? 如果你有强大的可观测性工具并可以重放轨迹,代码生成的失败模式是可管理的。如果你对智能体行为的可见性有限,函数调用轨迹的可解读性就很有价值。
动作面对合规性有多重要? 受监管的领域通常需要可枚举的、可审计的动作目录。代码生成的开放式动作面很难为合规目的进行界定。
你的性能约束是什么? 函数调用通常更快、更便宜。代码生成需要执行基础设施,复杂任务通常需要更多 token。
非显而易见的洞见是,这些问题对于同一系统的不同部分往往有不同的解答。答案很少是"到处都用函数调用"或"到处都用代码生成"——而是"对这类操作用函数调用,对那类操作用代码生成,以及一个验证两者之间交叉内容的边界层"。
基准分数遗漏的内容
Berkeley 函数调用排行榜和类似基准测试对于比较特定任务上的模型很有用,但它们衡量的是简单的部分:模型是否选择了正确的函数并生成了有效参数。更难的部分——当工具返回意外响应时智能体做什么,如何处理多轮失败,当提示注入尝试通过工具结果到来时如何行为——目前的基准测试覆盖不足。
大规模运行智能体的团队的生产失败数据一致指向相同的差距:动作选择问题已基本被前沿模型解决。基础设施问题——身份验证、速率限制、分页、错误恢复、结果的语义验证——是可靠性崩溃的地方。该基础设施问题取决于你的动作层是函数调用还是代码生成而呈现出不同面貌。
在两者之间选择首先不是哪个在基准测试中更准确的问题。而是哪种失败模式你的团队能够应对、你的应用需要哪些安全属性,以及你能在整个系统生命周期中维持哪种调试体验。
会员专享
余下内容仅对会员开放。
会员可读完整内容 —— 每一个公开发布的观点背后,那些框架、决策与推理的全貌。
- —完整文章,包含未公开存档的部分
- —可落地的工作框架,附带权衡与决策依据
- —新文章抢先看,先于公开发布
随时取消 · 一次订阅,畅读全部