自动化GPT让ChatGPT有了结构化思维的能力
最近开始火起来的自动化GPT和单纯的ChatGPT的本质区别是什么呢?个人认为是让ChatGPT有了结构化思维能力。对于复杂的问题,往往无法一次就获得完整的答案,人类思考这类问题的时候会把大问题拆解成若干个相关联的小问题,每个小问题再拆成若干个步骤去完成。而自动化GPT就是模拟这种思维的方式,让ChatGPT自我驱动拆解问题,并分步骤不断迭代接近答案,等所有问题都解决后再汇总输出给提问者。

结构化思维抽象示意图
原理和流程分析
自动化GPT项目目前GitHub上关注较多的有Auto-GPT和AgentGPT。两者主要差别在于AgentGPT目前只是内循环,任务拆解和任务执行求解答案都是ChatGPT自己。而Auto-GPT的实现更完整些,打通了外循环,ChatGPT拆解完任务,会向外部搜索引擎探寻答案,再由ChatGPT进行整合判断,最后里外结合产生最终的结果,输出结果时还可以调用文生图引擎生成插图。
不过两者的原理是类似的,今天就先拆解一下比较简单的AgentGPT来了解自动化GPT的基本原理和执行过程。
首先,我们来看看AgentGPT的提示语,提示语在chain.ts文件。注解部分是翻译成中文后的提示语。
// 启动提示语,你是一个名为AgentGPT的自主任务创建人工智能。// 你有以下目标 {goal}。创建一个任务列表,包含零至三项任务,// 以便你的AI系统更接近或完全达成你的目标。// 将响应作为字符串数组返回,可以在JSON.parse()中使用。const startGoalPrompt = new PromptTemplate({ template: "You are an autonomous task creation AI called AgentGPT. You have the following objective `{goal}`. Create a list of zero to three tasks to be completed by your AI system such that your goal is more closely reached or completely reached. Return the response as an array of strings that can be used in JSON.parse()", inputVariables: ["goal"],});// 你是一款名为AgentGPT的自主任务执行AI。你有以下目标{goal}。// 你有以下任务{task}。执行任务并将响应作为字符串返回。const executeTaskPrompt = new PromptTemplate({ template: "You are an autonomous task execution AI called AgentGPT. You have the following objective `{goal}`. You have the following tasks `{task}`. Execute the task and return the response as a string.", inputVariables: ["goal", "task"],});// 你是一个AI任务创建代理。你有以下目标{goal}。// 你有以下未完成任务{tasks},并刚刚执行了以下任务{lastTask},// 并收到了以下结果{result}。基于此,仅在必要时创建一个新任务,// 以使你的AI系统更接近或完全达成目标。返回响应作为字符串数组,// 只能用于JSON.parse(),没有其他内容。const createTaskPrompt = new PromptTemplate({ template: "You are an AI task creation agent. You have the following objective `{goal}`. You have the following incomplete tasks `{tasks}` and have just executed the following task `{lastTask}` and received the following result `{result}`. Based on this, create a new task to be completed by your AI system ONLY IF NEEDED such that your goal is more closely reached or completely reached. Return the response as an array of strings that can be used in JSON.parse() and NOTHING ELSE", inputVariables: ["goal", "tasks", "lastTask", "result"],});
通过提示语,再结合其它源码,可以知道AgentGPT的执行过程大体如下图所示,很类似于我们人类的结构化思维:
- 先将问题拆解成0-3个相关的子任务
- 然后分别执行子任务获取答案,如果一次无法获得满意的答案,就再提个任务继续逼进答案
- 所有子任务完成后,汇总输出最终结果

AgentGPT流程图
Auto-GPT的提示语要更丰富细致一些,包含了生成google查询和生成插图的prompts,这个改天再细说。Auto-GPT流程的主要区别在于执行子任务时会向google搜索资料。
部署使用
跑AgentGPT比较简单,有演示站点AgentGPT直接可用,通过Settings设置自己的openAI的key就可以了。

如果当心密钥泄露,有GitHub帐号的可以直接使用GitHub的CodeSpaces,添加一个Codespaces后就会启动一个虚拟机,自动拉到AgentGPT的代码。

Codespace
在Codespace终端中运行 bash ./setup.sh --local。 当在终端中提示输入密钥时,输入你的 OpenAI API 密钥。 构建过程完成后,右下角会弹出一个小框问你是否 “在浏览器中打开”,直接单击它就可以打开AgentGPT的界面 。

要关闭 AgentGPT,请在终端中输入 Ctrl+C。 要重新启动 AgentGPT,请在终端中运行 npm run dev。
实战一个小任务
AgentGPT现在还很弱,复杂点的任务很难收敛,需要一定的钞能力支持。而且受限于4096个token的限制,如果太复杂,单次任务返回的字数会超限,会使该任务一直无法完成,反复创建新任务。经过几番试验,我用了一个小任务来DEMO,本身并无实际意义,主要是为了用实例说明一下整个过程。下面是这个试验任务的Goal:
写一篇关于李白诗作“赠汪伦”的讲解文章,要求输出诗作的原文及白话文解释和诗作背后的故事。要求全中文输出。
由于系统设置的提示语是英文的,最后那句"全中文输出"如果不写的话,整个过程中的任务创建都会是英文的,用英文的任务执行实际需要中文输出的任务,会不容易收敛。
最后的效果如下图,总的来说是差强人意,多次迭代后开始犯一本正经胡说八道的毛病,还不如直接丢ChatGPT一轮游返回的结果。

AgentGPT实战示例
局限性
通过实战可以看出目前AgentGPT仍然是试验性性质,由于问题分解和答案获取都是ChatGPT自身,所以输出结果的质量最终不会超过ChatGPT自身的水平,只是让复杂问题能够有机会通过自动化的拆解迭代获得更完整的结果。Auto GPT加上GPT4应该会改观一些。
AgentGPT很容易会陷入重复相似任务的无限循环,需要注意适时停止,要不然会快速消耗你的API调用费用。
评论留言