ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Aider 的第一个“Hello World”:从 `hello.md` 示例会话理解 AI 结对编程的最小闭环

2026/9/10 14:28:21 拓冰建站 浏览量
Aider 的第一个“Hello World”:从 `hello.md` 示例会话理解 AI 结对编程的最小闭环 Aider 的第一个“Hello World”从hello.md示例会话理解 AI 结对编程的最小闭环【免费下载链接】aideraider is AI pair programming in your terminal项目地址: https://gitcode.com/GitHub_Trending/ai/aideraider是一款运行在终端中的 AI 结对编程工具。本文将以仓库中 hello.md 这份“最简单的示例会话记录chat transcript”为核心逐行还原一个把print(hello)改成print(goodbye)的完整交互闭环并结合仓库源码剖析其背后的编辑块edit block语法、自动应用编辑、自动生成 git 提交等核心机制。读完本文你将能读懂 aider 的示例会话、看懂工具输出格式并亲自复现第一次 AI 结对编程体验。一、hello.md 是什么aider 世界里的“Hello World”在aider的官方文档体系中hello.md 归属于aider/website/examples/目录下的一组“示例对话转录”Example chat transcripts它的 front matter 中声明了parent: Example chat transcripts。从文件开头那句说明可以看出它的定位Here is the simplest possible hello world example of using aider.它记录的就是一次真实的或按真实交互整理的aider 使用过程——用户只提出了一句需求aider 就完成了“理解 → 修改文件 → 自动应用 → 自动 git 提交”的全部工作。文档正文没有理论说教只有一段可以直接“照葫芦画瓢”的最小转录。这一目录下还有其他循序渐进、主题各异的转录例如hello-world-flask.md从空文件开始让 aider 搭建带多个端点的 Flask 应用README.md汇总介绍了 2048 游戏改造、多文件复杂变更、黑盒测试用例、遵循 NO_COLOR 规范等多种真实任务转录。hello.md之所以被称为“最简单的示例”是因为它只涉及单个文件、单行代码、一次修改非常适合用来建立对 aider 工作流的整体直觉。如果你希望先看一个更完整的“从零建项目”流程建议紧接着阅读 hello-world-flask.md。二、完整会话逐行拆解从 “hello” 到 “goodbye”下面是 hello.md 中转录的核心内容我们逐部分解读。1. 用户的请求####开头的行#### change hello to goodbye在 aider 的所有示例转录中####前缀的行表示用户发送给助手的自然语言指令。这里用户的诉求非常简洁把程序输出的 “hello” 改成 “goodbye”。2. 模型的编辑方案与编辑块edit block紧接着AI 助手先用一段自然语言说明思路示例中略去了冗长解释然后给出一个带语言标注的代码块hello.py ORIGINAL print(hello) print(goodbye) UPDATED这就是 aider 最核心的编辑块。它看起来像一次“代码上的 diff”由四个关键部分组成组成含义首行文件名hello.py本次修改的目标文件独立成行、逐字给出路径 ORIGINAL或实现中的SEARCH编辑块起始标记中间的原文片段需要在文件中精确查找的旧代码原文与替换内容的分隔线 UPDATED或实现中的REPLACE编辑块结束标记其上方为替换后的新代码需要特别指出的是示例转录为了让读者直观理解采用了ORIGINAL / UPDATED这样的措辞仓库中 benchmarks.md 也这样描述该格式“每个编辑是一个围栏代码块指定文件名以及一段 ORIGINAL 与 UPDATED 代码”而在当前源码与提示词模板中同一语义的编辑块以SEARCH / REPLACE标记组织见下文源码剖析。两者本质相同——给出“在文件中查找什么”再给出“把它替换成什么”。3. aider 的工具输出自动应用与自动提交转录最后两行是 aider 工具本身打印的状态信息转录中以引用块呈现 Applied edit to hello.py Commit 672ae42 aider: Changed output from hello to goodbye in hello.py. Applied edit to hello.py表示这个编辑块已被 aider自动应用到磁盘文件。对应源码在 base_coder.pyif self.dry_run: self.io.tool_output(fDid not apply edit to {path} (--dry-run)) else: self.io.tool_output(fApplied edit to {path})可以看到只有在--dry-run预演模式下才不会真正写入文件正常模式下aider会直接修改源文件。 Commit 672ae42 aider: ...表示 aider 已把这些改动自动创建为一次 git 提交。提交信息采用 “aider: 对改动的概括” 的固定前缀格式对应 repo.py 中的实现if prefix_commit_message: commit_message aider: commit_message因此可以推断你完全可以在命令行里用git log --oneline快速筛选出所有由 aider 代劳的提交记录便于复盘或回滚。这就是一次完整的“最小闭环”用户一句话 → 模型产出编辑块 → aider 解析并写入文件 → aider 提交 git。三、读懂示例转录的排版约定首次接触示例转录的人常被其中混杂的角色搞混。其实 examples/README.md 用一节的篇幅专门解释了转录排版约定Transcript formatting归纳如下以引用块开头的行是aider 工具本身的输出例如 Applied edit to hello.py、 Commit ...以及“文件已被加入/移出会话”等通知。以####开头的行是用户手写的聊天消息。其余普通段落在网页上以蓝色字体呈现是LLM 的回复其中往往内嵌着“上色高亮”的编辑块代码。hello.md与hello-world-flask.md都通过div classchat-transcript容器承载转录正是为了在网页渲染时套用这套统一样式。此外examples/README.md 还说明了示例转录背后共同遵循的几条重要规则每当 LLM 建议一处代码改动aider 都会自动把它应用到源文件应用编辑后aider 会以描述性的提交信息自动提交到 gitLLM 只能看到并编辑“已加入本次会话added to the chat session”的文件。用户既可以在启动时通过命令行参数传入文件如aider app.py也可以在会话中用/add命令加入。若 LLM 主动要求查看文件aider 会先征得用户同意再将其加入会话——这正是示例转录里频繁出现文件添加/移出通知的原因。在 hello-world-flask.md 的开头可以看到这一机制的现场表现 $ aider app.py Creating empty file app.py Added app.py to the chat也就是说用户启动时把app.py交给了 aideraider 便自动为它创建了会话入口后续所有编辑都围绕该文件展开。四、编辑块的底层实现从解析到容错替换为什么 LLM 输出一段看似普通的代码块aider 就能可靠地改文件关键在于一套“先解析、再精确定位、最后柔性替换”的源码机制主要落在 editblock_coder.py 与 search_replace.py 两个文件中。1. 编辑块的解析在 editblock_coder.py 中LLM 返回的内容会先交给find_original_update_blocks()做结构化解析从中提取出“目标文件、原文片段、替换内容”三元组edits list( find_original_update_blocks( content, self.fence, self.get_inchat_relative_files(), ) )解析器用正则识别编辑块的三个关键标记editblock_coder.pyHEAD r^{5,9} SEARCH?\s*$ # 起始标记如 SEARCH DIVIDER r^{5,9}\s*$ # 分隔线 UPDATED r^{5,9} REPLACE\s*$ # 结束标记如 REPLACE可见标记符允许 5~9 个//连续字符具备一定容错若出现格式不完整的编辑块解析器会抛出诸如Expected REPLACE的ValueError从而引导模型修正输出。2. 从“精确替换”到“柔性匹配”search_replace.py 提供了一个关键的flexible_search_and_replace()函数它按“由严格到宽松”的顺序尝试多种替换策略editblock_strategies [ (search_and_replace, all_preprocs), # 1. 最字面的整段文本替换 (git_cherry_pick_osr_onto_o, all_preprocs), # 2. 用 git cherry-pick 近似合入 (dmp_lines_apply, all_preprocs), # 3. 基于 diff-match-patch 的行级补丁 ]这意味着即便模型给出的 SEARCH 片段与实际文件存在空白差异、缩进差异RelativeIndenter 会先把双方转换为“相对缩进”再比对aider 仍有较高概率把改动正确落到目标位置。而对于“新建文件”这种常见场景提示词模板editblock_prompts.py要求 LLM 提供一个 SEARCH 段为空的编辑块——即“查找空内容替换为新文件内容”此时需要新增的文件同样不需要任何磁盘前提。3. 对模型的强约束为了保证可解析性提示词模板在 editblock_prompts.py 中对编辑块提出了一系列硬性规则首行必须是完整文件路径单独成行、不加粗不转义每个SEARCH段必须与现有文件内容逐字符精确一致含注释与 docstring编辑块默认只替换第一处匹配如需多处修改应拆分多个编辑块并让每个 SEARCH 段足够独特以便唯一定位SEARCH 段应尽量精简只包含改动行及其必要上下文不要夹带大段未改动代码只允许对已加入会话的文件创建编辑块。理解这些约束也就理解了示例转录中编辑块为什么总是“短小、精准、直击要害”。4. 应用编辑后的自动提交编辑应用成功后base_coder.py 中的auto_commit()会接管后续流程它把本次改动的文件名与对话上下文一起交给repo.commit()开启aider_editsTrue以标记改动由 AI 生成并由self.repo.commit(...)生成“aider: 改动概述”格式的提交信息。提交是否真正发生由auto_commits开关控制——在 base_coder.py 中该参数默认值为True。仓库的提交模块repo.py还支持通过--attribute-committer、--attribute-co-authored-by等参数控制提交署名归属如把提交者标注为“用户名 (aider)”或为提交信息追加Co-authored-by: aider尾注方便与同事协作时区分 AI 生成的改动。五、亲自复现把 “hello” 变成 “goodbye”读完源码机制后你也可以在自己的终端里复现这第一次体验。前提与步骤大致如下准备一个 git 仓库aider 的自动提交依赖 git建议先执行git initaider 仅在检测到 git 仓库时启用自动提交逻辑参见 repo.py 中aider_editsTrue的分支处理。创建一个hello.py内容为print(hello)。启动 aider 并把文件加入会话方式与 hello-world-flask.md 一致$ aider hello.py Added hello.py to the chat输入与示例相同的请求change hello to goodbye模型会返回一个编辑块aider 随后打印 Applied edit to hello.py并给出一次 Commit ... aider: ...提交记录。验证查看hello.py内容已是print(goodbye)再执行git log即可看到带aider:前缀的提交若想回退可在会话中配合/undo撤销并丢弃对应的 aider 提交该提示信息同样出现在 base_coder.py 的实现中。安装环节请参考仓库的安装指引docs/install.md 以及 website/install.sh。六、从 “Hello” 出发继续探索hello.md的价值在于用一行代码展示了 aider 的全部核心流程如果你想看到同样的机制在更复杂任务上的表现仓库 aider/website/examples/ 目录中还有大量配套转录建议按此顺序阅读hello-world-flask.md从零创建 Flask 应用演示“新增端点、带 URL 参数的求和接口、斐波那契数列接口、删除已有端点”四连击——每一轮都完整展示了编辑块 → 应用 → 提交的过程2048-game.md进入一个现有开源仓库先让 aider 理解代码再动手修改complex-change.md跨多个源码文件的复杂改动与调试add-test.md在无法看到被测方法源码的情况下借助 ctags 生成的仓库地图编写“黑盒”测试用例。当你对这些示例转录的“语言”足够熟悉后再回到编辑块的源码editblock_coder.py、search_replace.py深入研读会发现示例中每一行看似简单的输出背后都是一套为“可靠自动改代码”而精心设计的解析、匹配与提交流水线——这正是aider作为终端 AI 结对编程工具的立身之本。【免费下载链接】aideraider is AI pair programming in your terminal项目地址: https://gitcode.com/GitHub_Trending/ai/aider创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考