如何Fork一个正在思考的AI Agent:forkd BRANCH实时快照教程,150ms分叉不丢任何上下文
【免费下载链接】forkdFork() for AI agent microVMs. Spawn 100 children in ~100ms from a warm parent; BRANCH a live VM in ~150ms. KVM-isolated, snapshot CoW.项目地址: https://gitcode.com/gh_mirrors/fo/forkd
正在运行的 AI Agent 能不能像fork(2)一样被"复制"一份,同时保留它已经想过的每一步推理?答案是肯定的——开源微虚拟机沙箱运行时 forkd 的BRANCH特性,能在 ~150 ms 内暂停一个"正在思考"的沙箱、快照它当前的全部状态并恢复运行,让同一个 Agent 分叉出多个独立分支继续推理,而不丢失任何上下文。本文带你从环境准备到实战演示,完整跑通这条实时快照分叉链路。
为什么 Agent 需要"实时快照"能力
传统的 AI Agent 编排里,想尝试多条推理路径只能从头调用 LLM——历史对话、工具结果、内存里的中间状态全部丢掉。而 forkd 把"父快照 → N 个子"的两层结构扩展成了任意深度的树:任何正在运行的子 VM 都能被快照并分叉出孙 VM。
这直接解锁了几类真实场景(见 docs/design/branching.md):
- 安全破坏性操作——
rm -rf/apt remove前先分叉,后悔就丢弃,确认就提交 - A/B 工具执行—— 并行分支里同时试
grep与ripgrep,取胜者 - 会话检查点—— 生产环境每 N 轮自动分叉,出问题回滚到某一轮快照
- 推测式并行探索—— 同一份"认知状态"分叉成 N 份,各自给出不同结论
一键安装与环境自检
BRANCH 依赖 Linux ≥ 5.7、vm.unprivileged_userfaultfd=1(或CAP_SYS_PTRACE)以及内嵌的 Firecracker 分支。装好后用forkd doctor一次性探测所有前置条件,全部通过即代表你的主机支持 live BRANCH:
forkd doctor它会核对内核版本、userfaultfd 权限、UFFD_WP 与 memfd_create 支持,并报告每项是否就绪。这一步能帮你提前避开"分叉时报 UFFD 不可用"的常见坑。
最简分叉:从快照到孙代
forkd 提供了 REST、CLI、Python / TypeScript / MCP 三套 SDK。核心机制始终是pause() → snapshot_to() → resume()三件套,全部内建于 crates/forkd-vmm/src/lib.rs。
CLI 路径(两条命令完成分叉 + 派生孙代):
# 对正在运行的沙箱做实时分叉 sudo -E forkd snapshot --from-sandbox <sb-id> --live --no-wait # 从分叉出的快照再 fork 出多个孙代 sudo -E forkd fork --tag <branch-tag> -n 3Python SDK 路径(更适合 Agent 代码里调用):
from forkd import Controller c = Controller() parent = c.spawn_sandboxes("pyagent", n=1, live_fork=True)[0] # ... 驱动 parent 运行到"想好了" ... branch = c.branch_sandbox(parent["id"], mode="live", wait=False)对应 REST 端点为POST /v1/sandboxes/:id/branch,详细字段与错误码见 docs/API.md。
三种模式怎么选:live 才是真"实时"
mode参数决定分叉时的暂停窗口长短,这是 BRANCH 的关键性能开关:
| 模式 | 暂停窗口 p50 | 说明 |
|---|---|---|
full | 13 550 ms | 整个 guest 内存落盘,最慢 |
diff | ~200 ms | 只写脏页,v0.3 默认 |
live | 56 ms | 内存拷贝在恢复后异步进行,最快 |
live模式要求沙箱以live_fork=True启动(memfd 支撑的 RAM),它把暂停窗口从 200 ms 压缩到 56 ms(1.5 GiB 源实测 3.6× 加速)。配合wait=False,调用方约 70 ms 就拿到返回,后台内存拷贝异步完成——对"发了就不管"的 Agent 分叉是 200× 的往返改进。完整实测数据见 bench/live-fork-pause-window/RESULTS-v0.4.md。
实战:分叉一个正在思考的 Agent
forkd 内置了一个 LangGraph ReAct 演示(recipes/langgraph-react/):源 Agent 跑了若干步收集天气和地点数据后,在"想好了下一步"时被 BRANCH,再分叉出 3 个孙代,每个收到不同的引导提示("求详尽"/"要精简"/"省成本")。
关键结果:三个孙代从同一份认知状态分叉,各自继承相同的工具结果、对话历史与 Python 堆内存,唯一不同的是"下一个念头"。父代(无提示)选了锦市场作为 Day 1 下午,而三个带提示的子代都独立改选了岚山竹林——模型并没有被告知要换地点,分叉后的引导提示只扰动了下一次 LLM 调用,之前的推理状态原封不动地跟着走。
这验证了 BRANCH 的三个要点:
- 暂停窗口对 guest 内的 Agent 不可见—— 无 socket 报错、无超时、无需重试
- 提示扰动产出真实分叉—— 每个子代的下一次 LLM 调用看到不同系统消息
- 这是有状态 Agent 上最忠实的推测式并行探索模型
原始转录与汇总结果在 recipes/langgraph-react/results-2026-05-18/。
常见问题速查
| 问题 | 行为 |
|---|---|
源沙箱不在live_vms | 返回 404,无副作用 |
| tag 已存在 | 返回 409 Conflict,先删除旧 tag |
live但源沙箱非live_fork启动 | 400,需重开沙箱 |
| 分支并发达到上限(默认 4) | 返回 503 |
| 快照成功但恢复失败 | 快照文件完整可用,源沙箱状态可能未知 |
完整失败模式与恢复策略见 docs/design/branching.md 的"Failure modes"一节。
小结
用 forkd 的 BRANCH,你可以在 Agent 思考的"中途"把它复制成多个分支,暂停窗口低至 ~56 ms,且每个分支都完整继承父代的推理状态与文件系统。三步走:
forkd doctor确认环境支持 UFFD_WP- 以
live_fork=True启动源沙箱并驱动它运行 - 调用
branch_sandbox(..., mode="live", wait=False)分叉,再从分支快照fork出孙代
开源、Apache 2.0、无厂商 SDK——现在就能跑在自己的硬件上。
【免费下载链接】forkdFork() for AI agent microVMs. Spawn 100 children in ~100ms from a warm parent; BRANCH a live VM in ~150ms. KVM-isolated, snapshot CoW.项目地址: https://gitcode.com/gh_mirrors/fo/forkd
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考