Skip to content

Aider 架构设计与源码分析

Aider 是一款终端 AI 编程助手,其核心设计理念是"LLM 驱动的 Git 感知编辑"。与 Claude Code 和 Cursor 不同,Aider 将 Git 作为核心抽象——所有修改都通过 Git 操作完成,确保每次 AI 编辑都可追溯、可回滚。

Aider 架构图

核心架构

Aider 的架构围绕三个核心组件:

  1. Coder:与 LLM 交互的主循环,管理对话和工具调用
  2. RepoMap:代码仓库的语义索引,为 LLM 提供项目结构上下文
  3. 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 降低成本

相关资源

最近更新