聊天模式

Aider 提供几种不同的聊天模式:

  • code(代码模式)- Aider 会修改你的代码来满足需求
  • ask(问答模式)- Aider 会讨论你的代码并回答相关问题,但不会做任何修改
  • architect(架构模式)- 类似代码模式,但采用架构师-编辑双模型协作:架构模型提出修改建议,编辑模型将建议转化为具体的文件修改
  • help(帮助模式)- Aider 会回答关于 aider 本身的问题:使用方式、配置、故障排除等

默认情况下,aider 以”code”模式启动。在对话过程中,你可以通过以下命令为单条消息指定特定模式: /code/architect/ask/help: 这些斜杠命令仅作用于当前消息,下一条消息会恢复为当前活动模式(默认为”code”模式)。

你可以使用 /chat-mode <mode> 命令持久切换活动模式:

/chat-mode code
/chat-mode architect
/chat-mode ask
/chat-mode help

或者使用以下无参数命令在编码模式间切换:

/code
/architect
/ask

你也可以通过 --chat-mode <mode> 参数在启动时指定模式。 还有一个特殊快捷参数 --architect 等价于 --chat-mode architect

aider 的提示符会显示当前活动模式:

> 这是代码模式。
ask> 这是问答模式。
architect> 这是架构模式。

提问/编码工作流

推荐的工作流程是在 /ask/code 模式之间来回切换。

使用提问模式来讨论你想做什么,从 aider 获取建议或选项,并对方法提供反馈。 一旦 aider 理解了任务,就切换到编码模式让它开始编辑你的文件。 提问模式中的所有对话和决策将有助于确保执行正确的代码更改。

当你最终从提问模式切换到编码模式时,可以非常简洁。 在编码模式下说一些简单的话,比如”开始吧”,就会让 aider 执行你们讨论过的计划。

下面是一个示例,先用两个提问模式消息来确认计划, 然后用两个简洁的编码模式消息来编辑代码。

─────────────────────────────────────────────────────────────────────────────────────
Aider v0.79.0
模型: gemini/gemini-2.5-pro-exp-03-25 使用 diff-fenced 编辑格式

> /ask 如果我们做一个快速的小演示程序,打印什么最好?

听起来你想写一个"Hello, world!"程序。这是小型演示程序非常流行的短语。

> /ask 是的,就是这个想法。有什么更有创意的选择吗?

1. "Greetings, Earthlings!"(问候地球人!)
2. "Beep boop, I am a computer!"(哔哔嘟嘟,我是一台电脑!)
3. "To code, or not to code, that is the question."(编码还是不编码,这是个问题)
4. "I think, therefore I print."(我思故我打印)
5. "01001000 01101001!"("Hi!"的二进制表示)

> 选第4个

hello.py
>>>>>>> SEARCH
=======
def main():
    print("I think, therefore I print.")
<<<<<<< REPLACE

> 全部大写!

hello.py
>>>>>>> SEARCH
    print("I think, therefore I print.")
=======
    print("I THINK, THEREFORE I PRINT!")
<<<<<<< REPLACE

你可以把这种提问/编码工作流看作是架构师模式的一个更流畅的版本,但整个过程只使用同一个模型。

架构师模式与编辑器模型

当您处于架构师模式时,aider会将您的请求发送给两个模型:

  1. 首先,它会将您的请求发送给主模型(通过/model--model配置),该模型将作为架构师提出解决编码请求的方案。

  2. 接着aider会向”编辑器模型”发送另一个请求,要求它将架构师的提案转化为具体的文件编辑指令。aider内置了根据主模型自动选择编辑器模型的默认机制。您也可以通过--editor-model <model>指定特定的编辑器模型。

某些大型语言模型无法一次性完成编码方案设计详细文件编辑指令生成。对于这些模型,架构师模式通过搭配专门负责生成文件编辑指令的编辑器模型,可以比纯代码模式产生更好的结果。但这种模式会使用两次LLM请求,可能耗时更长且增加成本。

架构师模式特别适用于OpenAI的o1系列模型,这些模型擅长推理但文件编辑能力较弱。将o1架构师与GPT-4o或Sonnet等编辑器模型搭配使用能获得最佳效果。

但即使使用同一模型同时担任架构师和编辑器,架构师模式也可能带来帮助。让模型通过两次请求分别解决问题和编辑文件,有时能产生更好的结果。

编辑器模型使用aider的编辑格式之一来让LLM修改源代码文件。aider会默认选择合适的编辑格式,但您可以通过--editor-edit-format <format>自定义。在使用架构师模式时,推荐使用“editor-diff”和”editor-whole”编辑格式。更多细节请参阅这篇关于aider的架构师/编辑器模式的文章。

示例

Aider v0.47.1-dev
模型:claude-3-5-sonnet-20240620 使用 diff 编辑格式
Git 仓库:.git 包含 298 个文件
仓库映射:使用 1024 tokens
使用 /help 查看聊天命令,运行 –help 查看命令行参数

/ask 这个仓库是什么?

这是一个包含各种数学计算函数的 Python 函数集合。

/help 如何将 aider 与 ollama 一起使用?

运行 aider --model ollama/<ollama-model>。 更多信息请参阅文档:https://aider.chat/docs/llms/ollama.html

/code 添加一个计算数字阶乘的函数

好的!我将添加一个计算数字阶乘的函数。以下是变更内容:

def factorial(n):
    if n == 0 or n == 1:
        return 1
    else:
        return n * factorial(n - 1)


# 示例用法
print(factorial(5))  # 输出:120

这个函数使用递归来计算阶乘。它已被添加到您的代码中。

/architect 我们能简化这个吗?

是的,您可以用调用内置的 math.factorial() 来替换 factorial() 函数。 这样您就不需要维护自定义的阶乘实现, 而且内置函数经过了良好的优化。

<<<<<<< SEARCH
def factorial(n):
    if n == 0 or n == 1:
        return 1
    else:
        return n * factorial(n - 1)
=======
from math import factorial
>>>>>>> REPLACE

目录