当行业还在争论「AI 能不能自主做研究」时,Recursive 已经把答案跑出来了。6 月 11 日,这家专注递归超智能的公司公开了自动化 AI 研究系统的首批实验结果——在三项基准测试上,全部超越了此前由人类研究员手工调优的最佳成绩。
这不是概念验证,而是完整研究循环的自动化执行:从提出假设、编写代码、跑实验、分析结果,到迭代改进,整个链路由系统自主完成。
自动化研究循环怎么跑
Recursive 的系统设计并不神秘,核心是把研究流程拆成可机器执行的闭环:
- 提出想法——系统基于当前知识状态生成候选研究方向。
- 实现方案——自动将想法转化为可运行的代码或实验配置。
- 执行实验——在受控环境中跑通实验,收集指标。
- 分析结果——解读实验数据,判断方向是否值得继续。
- 迭代改进——根据分析结果调整假设,回到步骤 1。
关键在于每一步都不需要人类介入决策。人类研究员的角色从「亲自做实验」变成「定义评估标准和约束条件」。
三项基准超越人类最优意味着什么
超越人类最优结果这件事本身值得细看。此前各基准的最好成绩,往往是资深研究员经过多轮手动调参、试错、领域知识注入才达到的。自动化系统在同等条件下跑出更高分数,说明几件事:
- 搜索效率:系统可以在同一时间窗口内尝试更多组合,覆盖人类因时间精力限制而跳过的路径。 -- 一致性:每次迭代都完整执行,不会因为疲劳或偏见遗漏步骤。
- 可复现:整个优化路径有完整日志,任何结果都可以回溯到具体决策点。
但也要注意边界:基准测试是受限环境下的指标,真实研究还涉及问题定义、跨领域联想、长期方向判断,这些目前仍需要人类把关。
自己搭一个最小自动化研究循环
Recursive 的完整系统很复杂,但核心思路——让算法自动跑实验闭环——可以用开源工具快速搭一个原型。下面是一个用 Python 实现的最小自动化超参数搜索循环,适合小模型或本地实验:
import itertools
import json
import subprocess
import time
from pathlib import Path
# 1. 定义搜索空间——相当于「提出想法」
search_space = {
"learning_rate": [1e-4, 3e-4, 1e-3],
"batch_size": [32, 64],
"hidden_dim": [128, 256],
}
def generate_configs(space):
"""把搜索空间展开成具体实验配置"""
keys = list(space.keys())
values = list(space.values())
for combo in itertools.product(*values):
yield dict(zip(keys, combo))
# 2. 执行单次实验——相当于「实现 + 执行」
def run_experiment(config, train_script="train.py"):
"""
调用外部训练脚本,传入超参配置。
train.py 需要接受 --config 参数并输出 JSON 格式的指标。
"""
config_path = Path(f"configs/exp_{hash(str(config))}.json")
config_path.write_text(json.dumps(config))
result = subprocess.run(
["python", train_script, "--config", str(config_path)],
capture_output=True, text=True, timeout=600
)
if result.returncode != 0:
return {"status": "failed", "error": result.stderr[:200]}
return json.loads(result.stdout.strip())
# 3. 分析 + 迭代——相当于「分析结果 + 改进」
def auto_research_loop(space, max_rounds=3, top_k=2):
"""
自动跑多轮实验,每轮保留 top_k 结果,
下一轮在最优配置附近细粒度搜索。
"""
best_results = []
current_space = space
for round_idx in range(max_rounds):
print(f"=== Round {round_idx + 1} ===")
round_results = []
for config in generate_configs(current_space):
metrics = run_experiment(config)
if metrics.get("status") == "failed":
continue
round_results.append((config, metrics))
print(f" config={config} -> metric={metrics.get('val_acc', 'N/A')}")
# 按验证准确率排序,保留 top_k
round_results.sort(key=lambda x: x[1].get("val_acc", 0), reverse=True)
best_results.extend(round_results[:top_k])
# 下一轮:在最优配置附近做细粒度搜索
if round_results:
top_config = round_results[0][0]
current_space = {
"learning_rate": [top_config["learning_rate"] * f for f in [0.5, 1.0, 2.0]],
"batch_size": [top_config["batch_size"]], # 固定已找到的最优值
"hidden_dim": [top_config["hidden_dim"]],
}
# 最终汇报
best_results.sort(key=lambda x: x[1].get("val_acc", 0), reverse=True)
print(f"\n=== Best result ===")
print(f"config={best_results[0][0]}, metrics={best_results[0][1]}")
return best_results[0]
# 启动自动研究循环
best = auto_research_loop(search_space, max_rounds=3, top_k=2)
配套的 train.py 需要读取配置、训练模型、输出 JSON 指标。一个最小骨架:
import json, argparse, sys
from pathlib import Path
def main():
parser = argparse.ArgumentParser()
parser.add_argument("--config", required=True)
args = parser.parse_args()
config = json.loads(Path(args.config).read_text())
# 这里替换成你的实际训练逻辑
# 示例:假装训练并返回一个指标
val_acc = 0.85 + 0.05 * (config["learning_rate"] / 1e-3)
# 必须输出 JSON 到 stdout,供研究循环解析
result = {"val_acc": round(val_acc, 4), "train_loss": 0.12}
print(json.dumps(result))
if __name__ == "__main__":
main()
运行前确保两点:
- train.py 能独立跑通并输出 JSON 到 stdout。
- auto_research_loop 中的 timeout 设为你的实验实际耗时的 2 倍以上。
这个原型只做了超参搜索,但框架已经具备闭环特征:自动生成配置 → 执行 → 分析 → 缩小搜索范围 → 再执行。加上 LLM 生成代码和假设的模块,就能往 Recursive 的方向演进。
从原型到真实系统:还需要什么
上面的最小循环离 Recursive 的系统还有几道坎:
- 假设生成:当前只是枚举搜索空间,真实系统需要 LLM 根据前轮结果生成新研究方向,包括架构改动、损失函数设计等。
- 代码生成与验证:自动写训练代码并确保能跑,需要沙箱执行 + 语法/运行时错误自动修复。
- 长期记忆:跨项目、跨数据集的研究经验积累,避免重复踩坑。
- 安全约束:防止系统跑出资源爆炸的实验(无限循环、内存泄漏等)。
落地建议
如果你想在团队内尝试自动化研究流程,可以按这个节奏推进:
- 先从超参搜索自动化开始——用上面的脚本或 Optuna 等框架,把最耗人力的调参环节交给机器。
- 加入 LLM 辅助的假设生成——让模型阅读前轮实验日志,提出下一轮尝试方向,人类审核后再执行。
- 逐步放开自主度——当系统在受控场景下表现稳定后,减少人类审核节点,扩大搜索范围。
- 始终保留评估权——基准指标由人类定义,系统只负责优化,不负责决定「优化什么」。
Recursive 的结果证明闭环自动化研究已经能产出超越人类手工优化的成绩。但这项技术目前最适用的场景,是目标明确、评估指标清晰的优化类任务。开放式的创造性研究,人类判断力仍然是不可替代的锚点。