背景OpenManus是一个小巧的agent框架,是几个优秀的小伙子据说在3个小时复刻Manus而做的。github:https://github.com/mannaandpoem/OpenManus对于我个人而言,Agent这么广泛的炒作, 在看smloagents之余, 也看看OpenManus的小巧的实现。这里只会debug一下主线代码, 支线代码就不做了解了(人总有自己的关注点,不用纠结在细枝末节上),当然我也在B站上昨晚偶尔刷到了一个东北的up主大概讲了一小时, 发现不太复杂,自己也尝试着看看这个agent框架,当做算法之外的工作的调剂。费曼学习法,干中学!安装环境- 这个readme中有, 或者在vscode或者pycharm中都可以配,建议配个venv
- 充了10块钱的deepseek的会员, 把api_key填好就可以了,
调试为了简单起见,我提问的问题会尽量让大模型调用一个Python的Tool Agent,靠本地代码执行就能完成的任务(其实也试了下web search的prompt,但打开浏览器有些乱七八糟的失败,懒得弄了, 不耽误主线流程)断点问一个问题, 斐波那契数列的第5位是多少memory是什么这里有个memory的概念,其他框架也有, 当然也有实现的比较复杂的那种,我们只看当前openManus的实现,看看memory到底是什么这是坨什么?其实是类似工厂方法的一类东西, 这里的tool和其他的user,system,assistant不一样,应该是因为tool有不定长度的入参, 其他role的入参只有一个字符串到memory的里面呢, 定义了一个Memory,后面是为了保存多步执行的结果的循环执行每一步到底执行了啥?Think是什么?这个think其实是把输入都怼到memory里,调用LLM这里的提示词是这样的 ,提示了几个工具可以用,比较特殊的是Terminate,提示LLM在认为可以结束的时候, 可以使用这个Tool这里把assistant_msg也写入到message这个上下文中Act是什么?其实是开了个线程,在线程里 执行LLM提示的code,其实还是有些巧思在里面, 例如安全性, 这里只包含了builtins这些函数。把结果塞到result中如何停止呢?既然结果已经有了, 那怎么让这个流程停止呢,openManus靠的还是大模型来判断这一次, LLM给这对prompt的结果就是 terminate了当工具是Terminate时, 这个state的状态也改为FINISHED了, 整个循环也就跳出来了。到这里就看完了这个简单的流程了,Agent也是个挺深的学问结尾这个小巧框架的一点流程就大概讲完了, 实际花费时间2小时不到吧,包括折腾环境。实际上复杂agent框架需要解决很多很多问题, 比如- memory的实现,太长了怎么办,是不是要放到其他存储里,那怎么与LLM交流呢?怎么找出最重要的上下文, 用向量数据库吗?用RAG吗?
- prompt的实现,也一样,现在只有5 6个tool,可以塞在提示词里,当太多了之后怎么办,这些tool要分几个大类,然后再让LLM帮我们找细分类别下的tool吗?
|