主流程分析
在命令行中使用 ./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 中。
其中 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
的变化情况是:
- 如果在初始化时启用了
continuous_mode
,则为continuous_limit
或 ∞,否则为 1; - 在
get_user_feedback
中,如果用户输入y
,则cycles_remaining
被重新设置为 1,若指定了连续执行的轮数,则cycles_remaining
为执行轮数 + 1; - 在执行非
human_feedback
的指令前将cycles_remaining
-1。
agent.think
方法
agent.think
由其父类 BaseAgent
实现。 其主要流程为:
首先使用 DEFAULT_TRIGGERING_PROMPT
和 `one-shot Thought Process ID 构造 Prompt。这个 Prompt 的由 5 部分组成:
其中,system prompt
的主要内容是:
- 指定
assistant
的名称和角色,要求 LLM 独立做决定; - (可选)指定本机系统、可用的额度、限制条件(constraints)、可用资源(resoources)及最佳实践(best_practice)
- assistant 的执行目标(ai_goals)。
生成 prompt 之后,调用 openai 接口生成响应(Response
),随后更新历史消息,并从响应中提取内容和 command。
command 指令
AutoGPT 内置了 5 种指令:
execute_code
: 执行 Python 代码或 Shell 指令;file_operations
:文件和文件夹操作;web_search
:使用 DuckDuckGo 或 Google 进行搜索;web_selenium
:使用 headless 浏览器访问特定 url;system
:·goals_accomplished` 任务完成;image_gen
:使用dalle
、huggingface
或sdwebui
生成图片(默认不启用);git_operations
:git 操作(默认不启用)。
定义 command 的方法是在目标函数前使用 @command
装饰器装饰该函数。在装饰器中指定这个 command 的名称、描述和参数列表。因为指令名称和参数列表会提供给 LLM 进行选择,所以名称应当能清楚地表达这一指令的功能。
定义完指令后要添加对应的 COMMAND_CATEGORIES
,这样才能被加载到可执行的指令中。