项目的地址和标题
https://github.com/Significant-Gravitas/Auto-GPT
前面的话(废话)
大致看了几个文档和视频,我按我的逻辑来分析,主要是厘清消息传递的过程,这里将我看到的几个链接也附上:
【知乎:AutoGPT源码阅读】https://zhuanlan.zhihu.com/p/623597557
【掘金:ChatGPT|Auto-GPT实现解析】https://juejin.cn/post/7221461913003442236
为什么要做一些事情(废话+1)
我对python并不是很熟悉,但是勉为其难能看懂一些,看代码的过程我要加注释,屏蔽一些影响,因为我想自己来实现和控制代码的走向,目前autogpt最大的问题是会“陷入奇怪的死循环”,特别是在Windows系统下。
autogpt的另一个问题在于会陷入token限制,如果被中断,不得不面临重新开始执行。在最新的release版本(4.0)中,这个问题依旧是存在的,但是在issue中可以找到解决方案,我认为我已经不会出现这个问题了,不会再报这个错误。
√ 从masterr分支中复制 autogpt/memory/message_history.py 替换 release 中的对应的文件即可。
进入正题
直接进入到 autogpt\agent\agent.py 这个文件的 start_interaction_loop 开始看就可以了,这个文件是进入交互模式下开始循环执行的入口函数。
将代码中的日志、交互、插件配置都默认为不需要,所以忽略相关的所有代码。
左边代码是去除部分不影响阅读代码后的版本,大致对应到右边的流程图,其中记录执行结果这个过程可以理解为是全局的,在记录执行结束后,会在最右边的生成摘要中被使用。
下面是 autogpt\llm\chat.py 代码的删减后和流程图对应的情况。
最后给一个我大概理解的完成的执行流程(不是简单的空讲,呃呃呃,流程就是这样,而是大致能匹配代码实际执行流程的)。
autogpt 有给出一个默认的摘要信息,即最开始没有对话时的摘要信息(I was created)。
这里有几个问题需要理解,一个是所有发送到GPT或者从GPT获取的回复都是模板化的,二是,我其实没理解封装摘要前挑选的事件的条件是什么,三是,每次发送的上下文(即最近的对话场景信息)其实是有限制的,不会超过十个,但是我也不知道他怎么选的。
对于第一个问题,模板可以在 autogpt\prompts\generator.py 中找到一个,摘要的模板是在 autogpt\memroy\message_history.py 中。
后面的内容,等我看懂了代码的消息生成情况后再发上来。
如果已经执行过一次,可在log中找到一个系类的执行过程,如下
具体看对话内容,下面打开了连续的两次发送给gpt的信息,这两次对应的是最开始的两次。
再看一个后面的对话信息
上面的图片如果不够清晰可以在下面地址找到,还有修改过的代码(但不保证代码可以用)
https://github.com/IBAS0742/ShareCode/blob/main/bilibili/20230614.md