Skip to content

Apply Patch 是将 LLM 生成的代码修改应用到文件系统的机制,支持 *** Begin Patch 自定义格式解析和原子性应用。

为什么需要 Apply Patch

LLM 生成代码修改时,需要一种可靠的机制将文本形式的修改应用到实际文件。标准的 unified diff 格式对 LLM 来说容易出错(行号偏移、上下文不匹配)。Codex 设计了 *** Begin Patch 自定义格式,更易于 LLM 生成且更容错,同时支持原子性应用——要么全部成功,要么全部回滚。

核心原理

  1. 自定义格式*** Begin Patch ... *** End Patch 格式,比 unified diff 更简洁,LLM 生成更准确
  2. 流式解析StreamingPatchParser 支持在接收 LLM 流式输出时即时解析,无需等待完整响应
  3. Hunk 抽象:每个 Hunk 描述对单个文件的一组增/删/改操作,独立验证和应用
  4. 验证机制verify_apply_patch_args() 在应用前校验补丁格式和目标文件状态,防止损坏文件

在源码中的实现

  • codex-rs/apply-patch/src/lib.rsparse_patch()StreamingPatchParserverify_apply_patch_args()HunkApplyPatchError
  • codex-rs/core/src/tools/ — 工具调用框架,将 apply_patch 注册为模型可调用的工具
  • codex-rs/core/src/session/mod.rs — Session 处理 apply_patch 工具调用,通过审批流(request_patch_approval())获取用户确认

相关概念