Aider 架构设计与源码分析
Aider 是一款终端 AI 编程助手,其核心设计理念是"LLM 驱动的 Git 感知编辑"。与 Claude Code 和 Cursor 不同,Aider 将 Git 作为核心抽象——所有修改都通过 Git 操作完成,确保每次 AI 编辑都可追溯、可回滚。
核心架构
Aider 的架构围绕三个核心组件:
- Coder:与 LLM 交互的主循环,管理对话和工具调用
- RepoMap:代码仓库的语义索引,为 LLM 提供项目结构上下文
- Editor:将 LLM 输出转化为文件编辑的解析器
python
# Aider 核心循环简化版
class Coder:
def run(self, user_message: str):
# 1. 构建上下文:聊天历史 + 文件内容 + RepoMap
context = self.format_messages(user_message)
# 2. 调用 LLM
response = self.llm.send(context)
# 3. 解析编辑指令
edits = self.editor.parse_edits(response)
# 4. 应用编辑并自动提交
for edit in edits:
self.apply_edit(edit)
# 5. Git 自动提交
self.repo.commit(f"aider: {edit.description}")RepoMap 机制
RepoMap 是 Aider 的关键创新,它为 LLM 提供项目级上下文而不需要加载全部文件:
python
# RepoMap 生成示例
# 通过 tree-sitter 提取符号定义和引用关系
class RepoMap:
def get_map(self, mentioned_files: list[str]) -> str:
"""生成仓库地图,优先包含已提及文件的上下文"""
symbols = self.tree_sitter_analysis()
references = self.build_reference_graph(symbols)
# 选择与当前编辑相关的符号
relevant = self.bfs_from(references, mentioned_files)
return self.format_map(relevant)RepoMap 的上下文效率
RepoMap 通过 tree-sitter 解析提取函数签名、类定义和导入关系,将整个仓库压缩为几百行的高密度摘要。这使得 LLM 能在不读取全部代码的情况下理解项目结构。
编辑协议
Aider 支持多种编辑协议,将 LLM 的文本输出转化为精确的文件修改:
- SEARCH/REPLACE:搜索旧代码块,替换为新代码
- Whole File:替换整个文件内容
- Diff:标准 unified diff 格式
# SEARCH/REPLACE 编辑示例
>>>>>>> SEARCH
def hello(name):
print(f"Hello, {name}!")
=======
def hello(name: str) -> str:
greeting = f"Hello, {name}!"
print(greeting)
return greeting
>>>>>>> REPLACE多模型协作
Aider 支持模型路由——不同任务使用不同模型:
- 架构设计:使用 Claude Opus 等强推理模型
- 代码编辑:使用 Claude Sonnet 平衡速度与质量
- 简单修改:使用 GPT-4o-mini 降低成本