Appearance
Apply Patch 是将 LLM 生成的代码修改应用到文件系统的机制,支持
*** Begin Patch自定义格式解析和原子性应用。
为什么需要 Apply Patch
LLM 生成代码修改时,需要一种可靠的机制将文本形式的修改应用到实际文件。标准的 unified diff 格式对 LLM 来说容易出错(行号偏移、上下文不匹配)。Codex 设计了 *** Begin Patch 自定义格式,更易于 LLM 生成且更容错,同时支持原子性应用——要么全部成功,要么全部回滚。
核心原理
- 自定义格式:
*** Begin Patch...*** End Patch格式,比 unified diff 更简洁,LLM 生成更准确 - 流式解析:
StreamingPatchParser支持在接收 LLM 流式输出时即时解析,无需等待完整响应 - Hunk 抽象:每个
Hunk描述对单个文件的一组增/删/改操作,独立验证和应用 - 验证机制:
verify_apply_patch_args()在应用前校验补丁格式和目标文件状态,防止损坏文件
在源码中的实现
codex-rs/apply-patch/src/lib.rs—parse_patch()、StreamingPatchParser、verify_apply_patch_args()、Hunk、ApplyPatchErrorcodex-rs/core/src/tools/— 工具调用框架,将apply_patch注册为模型可调用的工具codex-rs/core/src/session/mod.rs— Session 处理apply_patch工具调用,通过审批流(request_patch_approval())获取用户确认