Aider:Repository Map 与 Architect Editor 分工¶
为什么值得单独看¶
Aider 有两个机制很适合放在一起看。Repository Map(仓库映射)会用有限的 Token 预算挑出仓库结构,让 Model 看到聊天文件之外的相关符号。Architect(架构师)模式则先出方案,再编辑文件,这两个阶段还能选用不同模型和编辑格式。前一个机制决定 Context 里放什么,后一个机制决定怎样把建议交给 Editor 落到文件上。
这两个机制能降低大型代码库的操作难度,却补不上所有证据缺口。信息仍可能漏掉。Map(映射)压缩以后可能丢掉关键文件,Architect 也可能拿着残缺的上下文出方案,Editor 甚至会把正确建议改错。本文只讲锁定源码中可以核对的选择过程和交接过程。模型表现不错、生成提交或测试碰巧通过一次,都不能证明 Task 做对了。
机制一:Repository Map;机制二:Architect 与 Editor¶
RepoMap.get_repo_map 先检查 Token 预算,也检查有没有其他文件。预算为零,或者其他文件一个都没有,它就直接跳过 Map。检查通过后,这个函数收下聊天文件、其他文件、用户提到的文件和标识符,再调用标签排序逻辑。若当前没有聊天文件,它还会从 Context 窗口里扣掉预留空间,把剩余容量拿来扩大仓库视图。
Repository Map 会把候选符号和引用排好顺序,再投进 Context,让每个 Token 尽量多带一些有用信息。它不包含完整文件,也不能保证每项依赖都会入选。配置本身不够。map_tokens、Context 窗口、用户提到的线索和排序结果会一起决定模型看见什么,所以复现实验还要保存最终 Map 或它的哈希,以及预算 Config。
ArchitectCoder 继承 AskCoder,它会先给出架构建议或修改建议。等 Response 完整返回后,如果内容不为空,并且没有开启自动接受,它就会问用户要不要继续改文件。用户批准后,代码再从主模型配置里选择 editor_model。没有独立 Editor 时,它就继续用主模型,同时设置 editor_edit_format,然后新建一个 Coder,把 Architect 的 Message 交给 Editor 执行。
交接以后,自然语言方案和结构化编辑 Protocol(协议)由两个阶段分别处理。Architect 负责分析,Editor 负责应用 Diff(差异)或整文件格式,但它们也可能指向同一个模型对象。有没有人工 Confirmation,要看 auto_accept_architect 的实际值。只有有效配置关闭了自动接受,而且确认交互确实发生过,才能说「Architect 模式有人审」。
Editor 做完以后,会把总成本和 Aider 生成的提交哈希交回 Architect,当前消息也会移回上文。提交也会骗人。提交哈希能把 Artifact(产物)追溯到某次编辑,说明那次编辑形成了 Git 对象,但它证明不了需求已经满足,也排除不了测试被改坏的可能。Git 记录和任务 Score 必须分开看。
从哪里开始读源码¶
先读 RepoMap.get_repo_map,核对哪些条件会让函数提前返回,预算什么时候会放大,以及代码怎样调用 get_ranked_tags_map。如果还要解释排序,就继续查看标签图、Cache 和排名实现,同时记下哪些文件算 chat_files,哪些算 other_files。只看最终 Map 文本,你很难查出文件是在哪一步漏掉的。
再读 ArchitectCoder.reply_completed。空回复怎么处理、人工怎样确认、Editor 模型和编辑格式怎么选、新 Coder 怎么建、建议怎么交出去、提交哈希怎么收回来,都集中在这里。然后沿着代码查到模型配置,确认 editor_model 是独立模型,还是主模型的别名。
把两段源码连成因果链¶
要找到 Repository Map 真正接进模型 Context 的位置,就查最终 Map 文本进了哪一次 Query,别停在 map_tokens 这项配置上。教学实现应保存候选文件、符号排序、预算怎样裁剪以及最终内容哈希,再把哈希关联到 Architect 请求。错误来源才查得清。方案若漏了依赖,复核者才能继续判断:源文件没被扫描,排名太低,预算把它裁掉了,还是模型忽略了已经收到的信息。
Architect 会把一份能追到来源的建议消息交给 Editor。交接记录至少要写明 Architect 模型、输入 Map、原始建议、确认决定、Editor 模型、编辑格式和新 Coder 标识。用户拒绝后,就不能创建 Editor。哪怕两个阶段使用同一模型,也要分别留下 Call 边界,不能因为模型 ID 相同,就把规划和编辑挤成一次说不清的请求。
文件 Diff、Command 结果和提交哈希把 Editor 的动作连到最终产物。提交虽然给出了不可变引用,未追踪文件、工作树残留和外部副作用仍要另行收集。做最小实验时,可以让 Architect 给出正确建议,却故意让 Editor 改错一行,再在另一轮里让 Map 漏掉关键符号。前一种错在交接,后一种错在 Context 选择。这两类失败不能混。
沿一次任务走完整链¶
- 入口确定聊天文件、其他仓库文件、提及文件与标识符,并计算 Map 预算。
- RepoMap 对符号与引用排序,生成受上下文窗口约束的仓库投影。
- Architect 读取任务、聊天文件和 Map,输出可执行的修改建议。
- 根据有效配置等待用户确认或自动接受,再选择 Editor 模型与编辑格式。
- Editor Coder 接收建议,修改文件并可能运行命令、测试或创建 Git 提交。
- 外部验收比较最终差异、测试与需求,独立决定任务是否通过。
记录里至少要留下 Map 预算、最终 Map、Architect 原始建议、确认决定、Editor 模型与格式、文件 Diff、命令和提交哈希。只留最终提交,你就分不出错误发生在 Context 选择、规划还是编辑。只留聊天也不够,因为它证明不了磁盘究竟变成了什么样。
它补充了六条主课程的什么¶
Aider 这个扩展样本讲清两件事:怎样压缩代码 Context,怎样把规划和编辑分开做。六条一级主线还会覆盖更完整的 Runtime、Session、Permission 和产品 Surface。这里不做综合排名,也不要求所有 Harness(位于模型外部,负责输入装配、工具、权限、状态和产品表面的程序)照搬 Repository Map。你真正可以带走的是三组问题:Context 投影怎么生成,遗漏怎么查出来,两个角色交接时怎样留下来源。
独立核对时,Map 和 Architect 建议属于运行 Trace,文件 Diff 和 Git 对象则是环境产物。Evaluator 要读取冻结任务和最终产物,不能因为 Architect 给了建议、Editor 正常结束或 Git 生成提交,就直接算通过。
什么时候值得采用¶
代码任务如果符号关系很多,完整仓库又放不进 Context,Repository Map 会比较合适。项目若只有少量文件,主要内容不是代码,语言不受解析器支持,或者依赖主要藏在 Runtime 配置里,Map 可能花了成本仍漏掉核心事实。预算也不能无限扩大,因为更多符号会挤掉任务、History 和 Tool Result 的空间。效果要按具体任务验证。
如果方案要先复核、编辑格式要专门处理,或者不同模型适合分担不同角色,可以采用 Architect/Editor 分工。改动非常小时,多一次调用反而会增加延迟和误差,自动接受也会拿掉人工检查。本文只覆盖锁定源码中的 Map 和交接机制,不评价 Aider 的所有 Mode、真实模型质量或任何部署的默认安全。迁移时沿用这些问题和记录方法即可,不必照搬类名。
最容易误判的地方¶
Map 最大的风险在于选错信息。预算不足、解析失败或图排名较低,都可能让关键实现缺席,模型却容易把眼前这份投影当成完整仓库。角色名称也会制造错觉。叫作 Architect 和 Editor,并不能证明背后用了不同模型,也不能证明有人审过方案。
也别把 Git 当成完成门槛。自动提交便于追查,却仍可能收进错误改动、漏掉未追踪文件,甚至通过修改测试来凑出绿色结果。运行信号不够。命令返回零、提交已经生成以后,你还得结合冻结任务、禁止项和独立测试来解释。
怎样亲手核对¶
你可以准备一项跨三个文件的受控任务,把关键符号放在聊天文件之外,再分别用充足和极小的 Map 预算运行。记录最终 Map 有没有带上这个符号,也记录符号缺席后方案发生了什么变化。这个实验只验证 Context 怎样投影,单个模型跑出的结果不能代表普遍性能。
做 Architect 实验时,先关掉自动接受,确认用户拒绝后代码不会创建 Editor。然后批准一次,固定独立的 editor_model 和编辑格式,再检查 Editor 收到的内容是否等于 Architect 的建议。这一步不能省。最后用外部测试验收文件产物,并故意造出一个「提交成功但需求做错」的案例,确认门禁不会把提交本身算成通过。
读完后做四个判断¶
问题 1¶
Repository Map 是完整源码吗?
答案: 不是,它是受预算和排序约束的符号投影。
问题 2¶
Architect 与 Editor 一定使用不同模型吗?
答案: 不一定,没有独立 Editor 时会回退主模型。
问题 3¶
Architect 模式一定有人确认吗?
答案: 不一定,自动接受配置会改变这条边界。
问题 4¶
生成 Git 提交能否计为完成?
答案: 不能,仍需按任务契约验证差异、测试和副作用。