快速掌握OpenManus框架的核心要点,其实并没有想象中那么复杂。这个轻量级Agent框架,在短短几个小时内就被复刻出来,实在让人惊叹。与其在众多概念里绕来绕去,不如直接动手撸一遍源码的调试流程,看看Memory、Tool Agent这些组件到底是如何协同工作的。下面就从环境搭建开始,一步步拆解。
背景
OpenManus是一个迷你的Agent框架,由几位优秀开发者据说在三小时内复刻Manus而成。项目地址:https://github.com/mannaandpoem/OpenManus。在Agent概念炒得热火朝天的时候,读完smloagents那套之后,再看OpenManus这种小巧的实现,格外清爽。这里只啃主线代码的调试过程,支线部分先放一边(每个人都有自己的关注点,不必纠结所有细节)。刚好在B站上也刷到一位东北up主详细讲解了大约一小时,发现逻辑并不复杂,于是尝试自己走一遍这个Agent框架,作为工作之余的调剂。费曼学习法,干中学。
安装环境
- 按照README里的步骤操作就行,在VSCode或PyCharm里都能配,建议新建一个venv虚拟环境。
- 给DeepSeek充了10块钱的会员,拿到API key填进去就完了。
调试
提问时尽量让大模型调用一个Python Tool Agent,靠本地代码执行就能完成的任务(也试过Web Search相关的prompt,但浏览器打开时总报些乱七八糟的错误,懒得折腾了,反正不影响主线流程)。
断点
问一个问题:斐波那契数列的第5位是多少
Memory是什么
Memory这个组件在其他框架里也有,有些实现得非常复杂。这里只看OpenManus的实现,直观感受一下Memory到底是什么东西。
其实就是一个类似工厂方法的封装。里面Tool和其他的user、system、assistant角色不太一样——Tool有不定长度的入参,而其他角色的入参只有一个字符串。Memory层定义了一个结构,后面用来保存多步执行的结果,本质上就是一个list,没什么特别的。
循环执行
每一步到底执行了什么
这里抽象出了一些概念:先思考,再行动。那么思考了什么?返回值又意味着什么?
Think是什么
Think这一步其实就是把输入全都怼进Memory里,然后调用LLM。提示词里给了几个可用的工具,比较特殊的是Terminate——它告诉LLM,在认为可以结束的时候,可以调用这个Tool。
接着进入关键一步:调用LLM的返回。这里把assistant_msg也写入了message上下文。
Act是什么
这一步是根据之前LLM的提示调用具体的Tool。以PythonExecute为例,会开一个线程,在线程里执行LLM提示的code。这里有些巧思,比如安全性——执行环境只包含了builtins这些函数。执行结果会被塞回到result中。
这时候再回头看Memory和results到底是什么,会发现还有一点小心思:当Agent卡住时怎么办?
如何停止
结果出来后,流程怎么停下来?OpenManus依然依赖大模型来判断。这一次,LLM给出的prompt结果如果是terminate,就会跳转到Terminate这个Tool的执行。当工具是Terminate时,state的状态变为FINISHED,整个循环也就跳出来了。
到这里,整个简单流程就看完了。不过Agent是个挺深的学问:退出时居然没打印结果,懒得修了。
这次调试中用到的类,UML图大致如下(图略)。
结尾
这小巧框架的核心流程大概就这些。实际花费时间不到两小时,包括折腾环境。真正复杂的Agent框架需要面对很多实际问题:
- Memory太长怎么办?是不是要放到其他存储里?如何与LLM交流?如何找出最重要的上下文?用向量数据库还是RAG?
- Prompt的实现同样麻烦,现在只有五六个Tool,可以塞在提示词里,但Tool一多该怎么办?要不要先分类,再让LLM帮助查找细类下的Tool?
- 安全性如何保障?
- MCP这种刚冒出来的概念是做什么用的?
