cover

AutoGPT@v0.4.7 代码分析

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

2023-10-30

heading

主流程分析

在命令行中使用

./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_module
COMMAND_CATEGORIES
导入支持的 command,并将其注册到 CommandRegistry 中。

其中

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

完成 commands 的注册后会初始化一个 agent ,并将其传递到

run_interaction_loop
中执行后续操作。

在主循环(

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

然后通过调用

方法获取用户反馈。

确认用户反馈后,根据反馈结果调用

执行 command。

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

为零时会退出主循环,其中
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。
heading

agent.think
方法

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

首先使用

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

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

其中,

的主要内容是:

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

生成 prompt 之后,调用 openai 接口生成响应(

),随后更新历史消息,并从响应中提取内容和 command。

heading

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
    :使用
    dalle
    huggingface
    sdwebui
    生成图片(默认不启用);
  7. git_operations
    :git 操作(默认不启用)。

定义 command 的方法是在目标函数前使用

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

定义完指令后要添加对应的

,这样才能被加载到可执行的指令中。