cover

AutoGPT@v0.4.7 代码分析

本文分析了 AutoGPT@release-v0.4.7 的代码,主要内容包含 AutoGPT 的主要工作流程、迭代的主要方法及 command 的定义。

2023-10-30

主流程分析

在命令行中使用 ./run.sh 启动 autogpt 后,app/cli.py 中会通过调用 run_auto_gpt 开始主流程。

run_auto_gpt 中,首先进行初始化工作(如 configs、workspace、plugin、ai_config、memory)及注册 commands

其中执行目标(ai_goals)的设定方式为:

  • 继续上一次的目标;
  • 用户通过输入 --manual 进行手动设置;
  • 用户输入目标,通过调用 generate_aiconfig_automatic 自动生成。

注册 commands 的方法是通过 Command Registry 的静态方法 with_command_modules 在应用启动时,在该方法中调用 import_command_moduleCOMMAND_CATEGORIES 导入支持的 command,并将其注册到 CommandRegistry 中。

其中 command_registry.register 将可执行的操作放到一个 dict 中以便后续取用。

完成 commands 的注册后会初始化一个 agent ,并将其传递到 run_interaction_loop 中执行后续操作。

在主循环(run_interaction_loop) 中,首先通过 agent.think 调用 openai 接口,获取需要执行的 command 以及响应。

然后通过调用 update_user 方法获取用户反馈。

确认用户反馈后,根据反馈结果调用 agent.execute 执行 command。

agent.execute 方法中,通过调用 command_registry.get_command 获取对应的 command 后执行,执行完成后,如果结果长度超出了可发送的 token 数量,会返回 ActionErrorResult 异常,否则返回执行结果,然后重新开始新一轮的流程。

cycles_remaining 为零时会退出主循环,其中 cycle_remaining 的变化情况是:

  1. 如果在初始化时启用了 continuous_mode,则为 continuous_limit 或 ∞,否则为 1;
  2. get_user_feedback 中,如果用户输入 y,则 cycles_remaining 被重新设置为 1,若指定了连续执行的轮数,则 cycles_remaining 为执行轮数 + 1;
  3. 在执行human_feedback 的指令前将 cycles_remaining -1。

agent.think 方法

agent.think 由其父类 BaseAgent 实现。 其主要流程为:

首先使用 DEFAULT_TRIGGERING_PROMPT`one-shot Thought Process ID 构造 Prompt。这个 Prompt 的由 5 部分组成:

  1. system prompt
  2. 定义响应结构体 Response
  3. 历史消息(会使用 gpt-3.5 提取摘要);
  4. 限制输出数量
  5. DEFAULT_TRIGGERING_PROMPT;

其中,system prompt 的主要内容是:

  1. 指定 assistant 的名称和角色,要求 LLM 独立做决定;
  2. (可选)指定本机系统、可用的额度、限制条件(constraints)、可用资源(resoources)及最佳实践(best_practice)
  3. assistant 的执行目标(ai_goals)。

生成 prompt 之后,调用 openai 接口生成响应(Response),随后更新历史消息,并从响应中提取内容和 command。

command 指令

AutoGPT 内置了 5 种指令:

  1. execute_code: 执行 Python 代码或 Shell 指令;
  2. file_operations:文件和文件夹操作;
  3. web_search:使用 DuckDuckGo 或 Google 进行搜索;
  4. web_selenium:使用 headless 浏览器访问特定 url;
  5. system:·goals_accomplished` 任务完成;
  6. image_gen:使用 dallehuggingfacesdwebui 生成图片(默认不启用);
  7. git_operations:git 操作(默认不启用)。

定义 command 的方法是在目标函数前使用 @command 装饰器装饰该函数。在装饰器中指定这个 command 的名称、描述和参数列表。因为指令名称和参数列表会提供给 LLM 进行选择,所以名称应当能清楚地表达这一指令的功能。

定义完指令后要添加对应的 COMMAND_CATEGORIES ,这样才能被加载到可执行的指令中。