BabyAGI:自我构建的极简自主智能体框架
官方信息表
| 项目 | 信息 |
|---|---|
| 项目名称 | BabyAGI(新一代 self-building 版本) |
| 开源仓库 | yoheinakajima/babyagi |
| 归档仓库 | babyagi_archive(2024 年 9 月快照) |
| PyPI 包 | babyagi |
| 作者 | Yohei Nakajima |
| 协议 | MIT |
| 演示仪表盘默认端口 | 8080 |
| 文章分类 | AI智能体 |
| 文章标签 | 若琳部署 |
一、项目背景:从任务规划实验,到"自我构建"框架
BabyAGI 最早在 2023 年 3 月以一段极简的脚本走红,它把"任务规划(task planning)"作为一种开发自主智能体的方法引入大众视野。README 开篇用两个醒目的提示框说明了现状:
- NOTE:2023 年 3 月那个最初的 BabyAGI 已经归档,代码迁移到了 babyagi_archive 仓库(2024 年 9 月快照)。
- CAUTION:这个框架的作者 Yohei 本人从来没有当过职业开发者。这个仓库的目的是分享想法、引发讨论,供有经验的开发者把玩,并不适合生产环境,使用需谨慎。
现在这个仓库里的"新一代 BabyAGI",是一个用于自我构建(self-building)自主智能体的实验性框架。README 解释了它的设计哲学:之前各种把 BabyAGI 做大做全的尝试表明,构建通用自主智能体的最优路径,是"做一个最简单、但能自己构建自己的东西(build the simplest thing that can build itself)"。换句话说,作者认为与其手工堆一个大而全的智能体,不如做一个最小内核,让智能体在运行中自己长出所需的能力,这也是它和 2023 年那版"任务列表+执行+记忆"脚本最根本的区别。
它的核心是一套全新的函数框架 functionz:用于从数据库里存储、管理和执行函数。它提供了基于图(graph)的结构,用来追踪 import 依赖、函数依赖和认证密钥,并且具备自动加载和完整日志能力。除此之外,它还自带一个仪表盘(dashboard),用来管理函数、运行更新和查看日志。作者建议想快速了解全貌的人去看他在 X/Twitter 上的介绍帖。
这套设计的关键在于:BabyAGI 不再试图把所有能力硬编码进一个庞大的智能体里,而是把"函数"当作一等公民,让智能体自己去数据库里发现、复用、组合乃至新写函数。imports 描述函数需要哪些外部库,dependencies 描述它依赖哪些其他函数,key_dependencies 描述它需要哪些密钥——这些关系全部被画成一张图,于是系统在执行任何函数之前,都能自动把所需的库、函数和密钥准备好。这也解释了为什么它叫"自我构建":当一个用户请求无法被现有函数满足时,智能体会把请求拆解成若干小函数,逐个生成、登记进图里,再像搭积木一样拼成最终能干活的函数。
二、环境要求与安装
BabyAGI 以 Python 包的形式发布,安装非常简单:
pip install babyagi
它的运行依赖 Python 环境,并且在你需要用到 AI 能力时,需要自备 OpenAI API Key(通过环境变量或仪表盘注入)。启动仪表盘后默认监听 8080 端口,因此运行时需要保证该端口未被占用,或按需在代码里改成其他端口。
三、快速开始:三步跑起仪表盘
README 给出的快速体验步骤如下:
-
安装 BabyAGI:
bash pip install babyagi -
导入 BabyAGI 并加载仪表盘:
```python import babyagi
if name == "main": app = babyagi.create_app('/dashboard') app.run(host='0.0.0.0', port=8080) ```
-
打开浏览器访问仪表盘:访问
http://localhost:8080/dashboard即可看到 BabyAGI 的仪表盘界面。
四、基本用法:注册函数与依赖
BabyAGI 的核心概念是"函数"。你从导入 babyagi 开始,然后注册自己的函数。下面这个例子注册了两个函数,其中一个依赖另一个:
import babyagi
# 注册一个简单函数
@babyagi.register_function()
def world():
return "world"
# 注册一个依赖 'world' 的函数
@babyagi.register_function(dependencies=["world"])
def hello_world():
x = world()
return f"Hello {x}!"
# 执行函数
print(babyagi.hello_world()) # 输出: Hello world!
if __name__ == "__main__":
app = babyagi.create_app('/dashboard')
app.run(host='0.0.0.0', port=8080)
运行后会打印 Hello world!。关键点在于:被 @babyagi.register_function(dependencies=["world"]) 标注的函数,会把 world 记录为它的依赖,functionz 会在图结构里自动维护这层关系。
五、函数元数据:imports / dependencies / key_dependencies
函数可以带元数据注册,以增强能力并管理彼此关系。README 给了一个更完整的例子,展示了所有字段的逻辑用法:
import babyagi
@babyagi.register_function(
imports=["math"],
dependencies=["circle_area"],
key_dependencies=["openai_api_key"],
metadata={
"description": "Calculates the volume of a cylinder using the circle_area function."
}
)
def cylinder_volume(radius, height):
import math
area = circle_area(radius)
return area * height
可用的元数据字段有四个:
imports:该函数依赖的外部库列表。dependencies:该函数依赖的其他函数列表。key_dependencies:该函数需要的密钥列表。metadata["description"]:函数做什么的文字描述。
六、函数加载:内置与自定义 packs
除了用 register_function,你还可以用 load_function 来加载插件或函数草稿包。BabyAGI 自带函数包,也可以指向文件路径加载你自己的包。可用的函数包位于 babyagi/functionz/packs 目录。
加载自定义函数包的写法:
import babyagi
# 加载你自己的自定义函数包
babyagi.load_functions("path/to/your/custom_functions.py")
这种方式把相关函数组织成包,让函数的构建和管理更轻松。README 的目录里还列了 API Reference 一节,说明这些注册、加载、加密钥、跑仪表盘的调用都有对应的 Python API,开发者可以在自己的脚本里完整地用代码控制整个 functionz,而不必手动操作网页。
七、密钥管理:代码与仪表盘两种方式
key_dependencies 既可以直接从代码里存,也可以通过仪表盘管理。从代码里存:
import babyagi
# 添加一个密钥
babyagi.add_key_wrapper('openai_api_key', 'your_openai_api_key')
通过仪表盘添加:打开仪表盘,使用 add_key_wrapper 功能安全地加入你的密钥。
八、执行环境与日志系统
BabyAGI 会自动加载必要的函数包并管理它们的依赖,保证执行环境顺畅。同时它会记录所有活动,包括函数之间的关系,以便完整追踪函数执行与依赖。
它的日志系统有以下关键能力:
- 执行追踪(Execution Tracking):记录函数何时开始、何时结束,包括函数名、位置参数、关键字参数和执行耗时。
- 错误日志(Error Logging):捕获并记录函数执行中发生的任何错误,给出详细错误信息便于排查。
- 依赖管理(Dependency Management):自动解析并记录函数间的依赖,确保执行前所需的函数和库都已加载。
- 触发日志(Trigger Logging):记录被触发的函数,详细说明哪个函数触发了哪个函数、各自结果如何。
- 完整记录(Comprehensive Records):保留所有函数执行历史,方便回看、理解函数关系、分析性能。
关于"触发器(triggers)":它是一种机制,让某些函数在系统内特定事件或动作发生时被自动执行。例如当一个函数被新增或更新时,触发器可以自动为它生成描述。触发器增强了 BabyAGI 的自主性,让工作流自动化、减少人工干预;但 README 也提醒要小心管理触发器,避免意外的递归执行或依赖冲突。
九、仪表盘功能
BabyAGI 仪表盘提供了一个友好界面来管理函数、监控执行和处理配置。关键功能包括:
- 函数管理:直接在仪表盘上注册、注销和更新函数。
- 依赖可视化:查看和管理函数之间的依赖关系。
- 密钥管理:通过仪表盘界面安全地添加和管理密钥。
- 日志与监控:访问完整的函数执行日志,包括输入、输出和执行时间。
- 触发器管理:根据特定事件或条件设置触发器,自动执行函数。
运行应用后访问 http://localhost:8080/dashboard 即可进入。
十、预置函数包
BabyAGI 自带两个预置函数包:
- 默认函数(
packs/default_functions.py):包含函数执行(运行、添加、更新、查询函数和版本)、密钥管理(添加、查询密钥)、触发器(基于其他函数添加触发器)、日志(带可选过滤地查询日志)。 - AI 函数(
packs/ai_generator.py):包含 AI 描述与嵌入(自动为函数生成描述和 embedding)、函数选择(根据 prompt 查找或选择相似函数)。
十一、运行自我构建智能体
BabyAGI 还带了两个实验性的自我构建智能体,用来展示框架如何帮助一个"会写代码的智能体"复用已有函数、并写出新函数。
1. code_writing_functions 包里的 process_user_input
这个函数先判断是该用已有函数还是生成新函数;如果需要新函数,它会把新函数拆解成更小的可复用组件,再组合成最终函数。试一下:
import babyagi
babyagi.add_key_wrapper('openai_api_key', os.environ['OPENAI_API_KEY'])
babyagi.load_functions("drafts/code_writing_functions")
babyagi.process_user_input("Grab today's score from ESPN and email it to test@test.com")
运行后,你会在 shell 里看到函数被逐个生成,完成后新函数会出现在仪表盘里。
2. self_build 包里的 self_build
这个函数接收一段用户描述,生成 X 个用户可能问 AI 助手的不同任务;每个任务交给 process_user_input 处理,若已有函数不够用就创建新函数。试一下:
import babyagi
babyagi.add_key_wrapper('openai_api_key', os.environ['OPENAI_API_KEY'])
babyagi.load_functions("drafts/code_writing_functions")
babyagi.load_functions("drafts/self_build")
babyagi.self_build("A sales person at an enterprise SaaS company.", 3)
这会生成 3 个销售可能问 AI 助手的不同任务,并创建函数来处理它们。README 同时提醒:这些函数会被生成并存入仪表盘,但生成的代码非常精简,可能需要人工改进;这些草稿特性属于实验性概念,可能不会按预期工作,需要大量改进,请谨慎使用。
把这两个例子连起来看,BabyAGI 的自我构建闭环就很清楚了:你给它一句自然语言请求(比如"抓今天 ESPN 的比分并发邮件到 test@test.com"),process_user_input 先在已有函数里找有没有能直接用的;找不到或不够用时,它就把请求拆成更小的步骤——抓比分、发邮件、拼接文案——每一步生成一个小函数,再把这些小函数按 dependencies 串起来。新函数连同它的 import、依赖、所需密钥一起登记进 functionz 的图里,之后你就能在仪表盘上看到它们、改它们、再被别的函数复用。这就是 README 所说的"最简单、但能自己构建自己"的具体含义:框架本身不预设业务能力,业务能力是在运行中由智能体自己一点点长出来的。
十二、FAQ(常见问题)
Q1:这个 BabyAGI 还能直接拿来做生产项目吗? A:不能。README 用 CAUTION 明确声明作者并非职业开发者,仓库用于分享想法和实验,不适合生产使用。
Q2:我以前听过的那个简单 BabyAGI 还在吗? A:在归档仓库 babyagi_archive 里,是 2024 年 9 月的快照。
Q3:pip install babyagi 后怎么用?
A:写几行代码调用 babyagi.create_app('/dashboard') 并 app.run(port=8080),然后浏览器打开 http://localhost:8080/dashboard。
Q4:需要 OpenAI Key 吗?
A:基础的函数注册与演示不需要;但要跑 AI 相关函数和自我构建演示,必须通过 add_key_wrapper 或仪表盘注入 OpenAI API Key。
Q5:生成的函数能直接用吗? A:README 坦言生成代码非常精简、可能需要改进,且这些草稿功能是实验性的,使用需谨慎。
Q6:函数之间的依赖是怎么被自动满足的?
A:每个函数用 imports、dependencies、key_dependencies 登记了所需的外部库、其他函数和密钥;functionz 在执行前会按这张图自动把它们准备好,因此你不用在每个函数里手写 import 和初始化。
Q7:为什么要仪表盘?它和命令行是什么关系?
A:仪表盘是 functionz 的管理界面:注册/注销/更新函数、可视化依赖、安全地加密钥、看执行日志、配触发器。命令行脚本里 create_app('/dashboard') 就是把这个界面挂在 8080 端口上,数据和你代码里注册的函数是同一份。
Q8:触发器会不会让系统失控? A:README 明确提示要小心管理触发器,避免意外的递归执行或依赖冲突。例如一个函数更新时触发"自动生成描述",而描述生成又触发别的动作,就可能形成循环,需要人工审查。
十三、参与贡献与许可
README 表示非常欢迎贡献,但作者坦言自己一直不太擅长管理 PR,因为他是一个人在晚上和周末维护,进展会比较慢;他提到可能会先组建一个小的核心团队,再和更大的社区协作。如果你是开发者、投资人或开源支持者,可以通过他提供的表单联系。BabyAGI 基于 MIT 协议发布,详见仓库内的 LICENSE 文件。
十四、跳转链接
- 项目仓库:yoheinakajima/babyagi
- 归档版本:babyagi_archive
- 作者介绍帖:X/Twitter
- 联系表单:Google Forms