30秒快速回答: CodeAct(Code as Action,代码即行动)是一种让 AI Agent 直接写代码、再执行代码来完成动作的新范式。传统 Agent 调用工具时,大模型输出一段 JSON(
{"name": "search", "arguments": {...}}),由运行时解析后调用对应函数;而 CodeAct 让模型直接输出一段 Python 代码,沙箱执行这段代码来完成任务。循环、条件、变量、算术运算在代码里原生可用,多步任务不再需要一轮轮”JSON 对话”,Hugging Face 的 smolagents、苹果的研究以及多个主流框架在 2026 年纷纷押注这一方向,把它视为 Agent 执行层的下一站。
核心价值一句话: 工具调用从”填表单”进化成”写程序”——Agent 用代码自由组合动作,任务成功率更高、交互轮数更少、能力边界更宽。
为什么 2026 年大家都在讨论 CodeAct?
先看一个典型任务:“找出下载量最高的 3 个文本分类模型,然后计算它们的平均下载量。”
在传统 Function Calling 架构里,Agent 需要这样干活:
第1轮:调用 search_models("text-classification")
→ 返回一堆结果
第2轮:再调用 search_models 换关键词或分页
→ 继续返回
第3轮:调用 add()、divide() 算平均……(如果系统有算术工具)
→ 但多数工具集里根本没有"加法工具"
JSON 工具调用做不了算术、做不了循环、做不了中间变量——每一项能力都要单独注册一个工具,模型每做一个动作都要多烧一轮 token。这就是”N×M 集成困境”在 Agent 内部的版本:工具越多,交互越碎。
CodeAct 让 Agent 直接写一段 Python 解决全部问题:
models = search_models("text-classification", limit=3)
counts = [m.downloads for m in models]
average = sum(counts) / len(counts)
final_answer(average)
一次代码块 = 循环 + 变量 + 算术 + 多次工具调用全搞定。这正是 CodeAct 论文(CodeAct: Executable Code Actions Elicit Better LLM Agents)与 2026 年苹果、Hugging Face 相关研究反复验证的结论:代码是天然的”通用组合层”,工具调用的表达能力上限就是代码语言的表达能力上限。
CodeAct 与 Function Calling 到底差在哪?
| 维度 | Function Calling(JSON 工具调用) | CodeAct(代码即行动) |
|---|---|---|
| 模型输出 | 结构化 JSON(工具名+参数) | 可执行的 Python 代码 |
| 循环/条件 | 需要额外工具或反复多轮 | 代码原生支持 |
| 算术运算 | 多数框架没有算术工具,靠模型口算 | sum() / 表达式直接算 |
| 中间状态 | 靠”对话上下文”传递,易丢 | 变量天然保存 |
| 多步任务交互轮数 | 一步一往返 | 一段代码覆盖多步 |
| 组合复杂动作 | 受限于工具清单 | 函数嵌套、条件分支随意 |
| 安全边界 | 按工具粒度授权 | 必须靠沙箱隔离执行 |
| 代表实现 | OpenAI、LangGraph、CrewAI 等 | smolagents、CodeAct Agent、部分编程 Agent |
核心差异一句话:JSON 是”给系统看的指令”,代码是”给机器跑的程序”。前者每个动作都要模型和系统来回确认,后者把一连串动作打包成一段程序一次性执行。
实测收益(多份 2026 年基准与框架文档的共识):
- 多步任务的 LLM 交互次数减少约 30%
- 在真实软件工程类任务上的成功率提升最高达 20%
- 代码可复现、可调试、可审计——比黑盒 JSON 调用更容易排查问题
实战:用 smolagents 跑一个 CodeAct Agent
Hugging Face 的 smolagents 是 CodeAct 范式最直观的落地框架,核心就是 CodeAgent:
from smolagents import CodeAgent, HfApiModel, tool
@tool
def search_models(task: str, limit: int = 3) -> list:
"""搜索 Hugging Face 模型,返回模型对象列表"""
# 真实场景这里调用 HF Hub API
return [{"name": f"model-{i}", "downloads": i * 10000} for i in range(limit)]
agent = CodeAgent(
tools=[search_models],
model=HfApiModel(),
max_steps=5,
)
result = agent.run("找出下载量最高的 3 个文本分类模型,然后计算平均下载量")
print(result)
运行时,CodeAgent 会把模型生成的代码块放进受限沙箱(默认 E2B 或本地受限执行器)执行,工具函数以 Python 对象形式直接暴露给模型调用——不是 JSON-RPC,而是真正的”import 进来调用”。
如果你想用更轻的方式理解 CodeAct,可以把它想成:模型拿到一个 Python REPL + 一堆预置函数,它像程序员一样写代码、跑代码、看报错、改代码,直到任务完成。
CodeAct 最大的坑:执行安全
能力越强,风险越大。让模型写代码并执行,等于把”任意代码执行”交给了一个可能产生幻觉的模型。生产落地必须守住三层防线:
| 防线 | 措施 | 说明 |
|---|---|---|
| 沙箱隔离 | E2B、Docker 容器、Firecracker 微虚机 | 代码在隔离环境跑,禁止访问宿主机文件系统与网络 |
| 权限收敛 | 最小化 API Key、只读文件系统、无外网(按需开放) | 即使代码恶意,也拿不到敏感资源 |
| 行为审计 | 记录每次执行代码、输出、耗时 | 可回放、可追踪,出事能定位 |
另外要注意:所有工具输出都要视为不可信输入——代码里可能被注入恶意指令(提示注入),因此”执行前做代码审查/静态扫描”正在成为 CodeAct 框架的标准配置。如果做金融、医疗等高风险场景,建议保留 human-in-the-loop 审批环节。
什么时候该用 CodeAct?
优先选 CodeAct:
- 任务涉及多步数据处理、循环遍历、条件分支(批量分析、ETL、爬取整理)
- 需要算术、统计、格式转换等”通用能力”,不想为每件事注册一个工具
- 你的 Agent 主要跑在沙箱环境里,安全可控
- 需要代码可复现、可审计的场景(数据分析、自动化脚本)
继续用 Function Calling:
- 工具调用是简单的一问一答(查天气、发消息)
- 强合规行业,执行层必须走严格审批流程,不便引入代码执行
- 你的模型对代码生成不够稳(小模型写代码容易翻车)
- 平台只暴露受控 API,不允许任意代码执行
总结与延伸
- CodeAct 的本质:让 AI Agent 用”写代码 + 执行代码”代替”输出 JSON + 系统解析”,把工具调用升级成编程。
- 核心收益:交互轮数减少约 30%、复杂任务成功率提升、能力边界更宽、代码可审计。
- 核心代价:引入任意代码执行风险,必须用沙箱 + 权限收敛 + 审计三件套兜底。
- 选择标准:任务越”程序化”越适合 CodeAct,任务越”一问一答”越适合 Function Calling。
延伸阅读建议: 想深入可以看 CodeAct 原论文(arXiv:2402.01030)、Hugging Face smolagents 官方文档;如果想了解工具调用层协议标准化,可以配合本站的《什么是 MCP 协议?一文读懂 AI 的 USB 接口标准》和《怎么用 Function Calling?让 AI 调用外部工具》一起阅读,正好串起”模型 → 工具 → 协议”的完整链路。