Agent杂谈
引言
在Agent的学习过程中,我不断的遇到了很多问题,在此过程中,也阅读了现有的很多教程与资料,本次有感而发,回顾总结一下在个人的学习历程中遇到的问题。
阶段
入门
在现今,入门课程经过一定时间的发展已经足够丰富。我们这里主要集中关注用于入门的Agent教程(毕竟本人目前也只局限于这个阶段),对于这些教程,大多都会存在一些问题,哪怕是一些足够贴近小白的教程也会存在几个主要的问题。这些问题可能不是教程本身的问题,而是教程本身的性质所带来的特性。
对于初学者来说,接触到Agent之后,其往往会看到一个最简单的Agent实现:一个while循环+LLM调用+用户输入接口。然后接下来不断的基于这个模型来进行扩展,不断为其附加上提示词设计,工具调用,消息协议约定,记忆模块,上下文工程等等。在阅读这些教程的时候,我们能够很明显的感觉到我们对于Agent的认知在不断的加深。我们理解了一个最简的Agent是如何一步步来成为一个更加复杂,更加可用的Agent的。我们会在这个阶段感觉到快速学习一个先前未接触的领域里的知识的爽感。但是,这种感觉在某种程度上会蒙蔽我们的认知。
举我学习中的真实经历吧,在我的学习历程中,初期对于Agent的基础架构和各个组件,我都是很快的就过了一遍。但是在后续当我想要基于已经了解的知识来设计出一个自己的简单Agent时,我都无从入手。此时我意识到我先前的一个问题,这个问题实际上在之前的学习经历中也出现过很多次了。就是仍然是未做到”知行合一”。我实际上只是浏览了下概念。这是在现在乃至之后的学习阶段将会暴露的越来越明显的问题:在现有技术快速迭代的同时,哪怕我们不愿,我们也仍得沉得下气,能够自己古法的coding。在我个人看来,这种古法的coding在很大程度上是为了让我们在一个学习阶段中强制停下来,通过所谓的”手敲”来使得对应的知识深化。当然,这种深化知识只是其中一个方面,抽象点说,这种coding是在练我们的内功,而这种内功,是支撑我们后续对于一个知识的深度学习的基础。
总的来说,在入门这个阶段,其实与先前我们在很多其他领域知识的学习遭遇的问题大致相同。但是由于现今AI的高速发展,我们或主动或被动地变得更为浮躁,但是对应学习的标准还是没有变。虽然已经被说烂了,但是对于这种一个领域知识的入门学习阶段,我们还是得沉得住气来磨炼。这是一个必须经历的坎,并不会由于外部技术的进化而发生大的改变。
实践
在经历过一定的基础学习之后,我们会很快的进入一个瓶颈,此时我们完成了基础概念的简单了解。在这个阶段,我们往往会想要自己来做些实践,这是一些基础知识积累到一定程度后自然而然的想法。但是在这个阶段,我们往往会进入到一个误区,仍然以我个人为例子。当初我处于这个阶段时,我想着是直接按照教程中附带的后续几个复杂的文档教程跟着进行实现,即使我在这之前并没有自己深入了解并且独立敲一个完整的Agent Demo。在这个阶段,我想着我已经了解了很多的基础知识了,我对于自己有一种盲目的自信,我觉得自己已经足够应对这个稍微算得上复杂的设计了。
但是现实给了我一巴掌,哪怕我只是想照着教程运行其给的Demo,我也只是运行起了对应的简单的壳。而且这个壳运行完之后,我测试功能时也还是没有给出期望中的效果。而接下来,既然出现了问题,我自然想着去尝试解决存在的问题。但是更不幸的是,现在的这个系统,对于我来说,基本上就是一个黑盒,即使其的代码就摆在那里,单独拆出来几行代码,我也能够一定程度上看得懂其所表达的含义,但是对于整体的代码架构,甚至于一个简单的函数,一个类的设计,我都没有办法进行维护以及修改。此时我明白了在这个阶段我一直踩的一个坑。我仍然对于自己太过自信了。借用一句话:”还没会走就先想飞”。
现在回过头来,我其实能够很明白那会为什么对于那段代码无法进行”维护”:
- 首先,我并没有掌握工程的细节。整段代码实际上我并没有插手任何一个阶段,我没办法理解各处的设计理念,我只是想着凭借自己的现有理解就去猜测其设计的意图,只是局限在一个较小的窗口中去观察代码,并没有建立起整体的思维
- 其次,我对于相关领域的知识仍然知识浮于表面,仍然大多只是知其然而不是知其所以然。这种想法在外面的学习过程中将是致命的
到了这一步,虽然还是很老套,不过我选择了一个很老套的思路,我选择了自己从头来搓一套相似的系统。我要从基础重新做起,自己手搓一个教程中提及到的框架。复用一个已经被大家说烂了的话题:在智能体技术快速发展的今天,市面上已经存在众多成熟的Agent框架。那么,为什么我们还要从零开始构建一个新的框架呢?
在很多教程中,对于这个问题已经有很多令人有所启发的答案了,我这里再给出其中几条我认为在学习这个阶段最为核心的理由:
- 深度理解Agent工作原理:通过亲手实现每个组件,我们能够真正理解Agent的思考过程、工具调用机制、以及各种设计模式的好坏与区别。
- 获得完全的控制权:自建框架意味着对每一行代码都有完全的掌控,可以根据具体需求进行精确调优,而不受第三方框架设计理念的束缚。
- 培养系统设计能力:框架构建过程涉及模块化设计、接口抽象、错误处理等软件工程核心技能,这些能力对开发者的长期成长具有重要价值。
其实本质上还是先前所说的一个方面,这是我们”内功心法”的修炼。可以说,对于市面上成熟的框架的使用,是我们的外功。其决定的是我们能够发挥出来的能力的大小。而除了外功之外,内功也是相当重要的一环,其决定了我们整体的思维高度,虽然其并不能够实际的转换为开发的效能,但是其却实打实的影响了我们外功的发挥。这一块不再赘诉。