1. 为什么我要花两周时间逐个拆解这六个Agent代码库
过去大半年,Agent这个词被反复提起,几乎每隔几天就能看到新的开源项目冒出来。但真正上手跑过一圈之后你会发现,能跑通Demo的和能扛住真实任务的,完全是两回事。我前后花了将近两周时间,把目前社区里讨论度最高的六个开源Agent代码库逐个拉下来、配环境、跑任务、读源码,有些甚至还改了几处逻辑来验证自己的判断。这篇文章就是这两周折腾下来的完整记录。
先说清楚这六个库大概是什么定位。它们覆盖了从轻量级任务编排到复杂多轮推理的不同方向,有的偏重工具调用,有的偏重记忆管理,有的把重点放在多Agent协作上。我关注的维度主要有四个:任务规划能力、工具调用的稳定性、记忆与上下文管理、代码可维护性。这四个维度基本决定了一个Agent框架能不能从玩具变成生产力工具。
适合谁看这篇内容?如果你正在选型一个Agent框架准备落地到实际业务里,或者你已经用过其中一两个但总觉得哪里不对劲,又或者你只是想搞清楚这些框架到底有什么区别、值不值得投入时间,那这篇拆解应该能帮你省下不少自己踩坑的时间。我不会只讲优点,每个库的问题和局限我都会直说。
另外说明一下,文中涉及的具体项目我一律用代称,比如“框架A”“框架B”,这样既方便你对照自己熟悉的项目,也避免先入为主的偏见。每个框架的评测都基于我实际跑过的任务,不是看文档猜的。
2. 六个Agent代码库的整体设计思路对比
2.1 任务规划:从“一步一思考”到“先规划再执行”
这六个库在任务规划上的设计思路差异非常大,基本上可以分成三个流派。
第一个流派是链式思考驱动,代表的是框架A和框架D。它们的核心逻辑是让模型每一步都输出思考过程,然后根据当前状态决定下一步动作。这种方式的优点是灵活,遇到意外情况能及时调整;缺点是每一步都要调用模型,token消耗大,而且容易陷入循环——模型反复思考同一个问题却迟迟不行动。我在测试框架A的时候,给它一个“整理某目录下所有日志文件并按日期归档”的任务,它在第三步就开始反复确认“日志文件是否包含子目录”,连续输出了四轮几乎一样的思考,最后是我手动干预才继续往下走。
第二个流派是先规划后执行,框架B和框架F走的是这条路。它们会先让模型生成一个完整的任务计划,然后按步骤逐步执行。这个思路的好处是全局观强,不会走着走着就迷路;问题是计划一旦生成就很难动态调整,如果第一步的实际结果和预期不符,后面的步骤可能全部作废。框架B在这方面做了一个折中,允许在执行过程中插入“重新规划”的节点,但触发条件比较苛刻,需要模型自己判断“当前结果与预期偏差过大”,实际跑下来模型很少主动触发这个机制。
第三个流派是混合式,框架C和框架E属于这一类。它们既有初始规划阶段,也允许在执行过程中动态调整,算是取了两者的中间路线。框架C的做法是先让模型生成一个粗粒度的计划,每个步骤只描述目标不描述具体操作,然后在执行每个步骤时再细化。这个设计我觉得是比较务实的,既避免了过度规划导致的僵化,也防止了完全无规划带来的混乱。
2.2 工具调用:稳定性和灵活性的取舍
工具调用是Agent框架最核心的能力之一,这六个库在这方面的设计差异直接决定了它们的适用场景。
框架A和框架B采用的是预注册工具模式,你需要先把所有可用的工具注册到框架里,模型只能从注册过的工具中选择。这种方式的优点是安全可控,不会出现模型调用未授权工具的情况;缺点是扩展性差,每加一个新工具都要改代码重新注册。框架A的工具注册接口设计得比较简洁,基本上就是一个装饰器的事,但框架B的注册流程就繁琐得多,需要先定义工具的输入输出schema,再写一个适配层,最后才能注册。
框架C、框架D和框架E采用的是动态工具发现模式,模型可以根据任务需要动态生成工具调用请求,框架负责解析和执行。这种方式灵活度高,但稳定性明显下降。我在测试框架D的时候遇到过好几次模型生成了格式正确的工具调用请求,但参数类型不对导致执行失败的情况。框架D的错误处理做得还行,会把执行失败的信息返回给模型让它重试,但重试三次之后如果还是失败就会直接放弃当前任务。
框架F比较特殊,它采用的是工具链模式,把多个工具组合成一个工具链,模型调用的是工具链而不是单个工具。这个设计在处理复杂任务时很有优势,比如“搜索并总结”这个操作,在框架F里就是一个工具链,模型不需要分别调用搜索工具和总结工具。但缺点是工具链的粒度不好把握,太粗了灵活性差,太细了又失去了工具链的意义。
2.3 记忆管理:短期上下文与长期记忆的分野
记忆管理是区分这些框架成熟度的一个重要指标。简单来说,短期记忆就是当前对话的上下文窗口,长期记忆则是跨会话的信息持久化。
框架A和框架C只支持短期记忆,对话结束上下文就丢了。框架A的上下文管理比较简单粗暴,就是按轮次截断,超过一定轮次就把最早的对话丢掉。这个策略在简单任务上够用,但在需要长程依赖的任务上就会出问题。我测试过一个需要引用前面第五轮对话内容的任务,框架A因为已经把那段对话截掉了,完全无法完成任务。
框架B、框架D和框架F支持长期记忆,但实现方式各不相同。框架B用的是向量数据库存储历史对话,检索时按语义相似度召回。这个方案理论上很好,但实际用下来召回质量很不稳定,有时候召回的是语义相似但完全不相关的内容,反而干扰了模型的判断。框架D用的是结构化存储,把历史对话按任务ID分组存储,检索时按任务ID精确匹配。这个方案召回准确率高,但灵活性差,跨任务的知识迁移基本做不到。框架F的记忆管理是最复杂的,它同时维护了向量存储和结构化存储两套系统,检索时会综合两边的结果做排序。效果确实好一些,但配置和维护成本也明显更高。
框架E的记忆管理比较另类,它不存储历史对话,而是让模型自己决定哪些信息值得记住,然后把这些信息写入一个“记忆文件”。下次对话时框架会读取这个文件作为上下文的一部分。这个设计思路很新颖,实际效果取决于模型判断哪些信息值得记住的能力。我在测试中发现,模型经常会记住一些无关紧要的细节,反而漏掉了关键信息。
2.4 代码可维护性:文档、测试与社区活跃度
这一块我主要看三个指标:文档完整度、测试覆盖率和社区活跃度。
框架A的文档是最完整的,基本上每个API都有详细的说明和示例代码,新手照着文档就能跑起来。但它的测试覆盖率偏低,我翻了一下测试目录,很多核心模块都没有对应的测试用例。社区活跃度中等,issue响应速度还行,但PR合并比较慢。
框架B的文档质量参差不齐,核心模块的文档很详细,但一些边缘功能的文档几乎是空的。测试覆盖率是六个库里最高的,核心模块基本都有单元测试和集成测试。社区非常活跃,issue基本当天就有回复,PR合并也很快。
框架C的文档和测试都中规中矩,没有特别突出的地方也没有明显的短板。社区活跃度偏低,有些issue挂了几个月都没人处理。
框架D的文档写得比较随意,很多地方需要读源码才能搞清楚具体行为。测试覆盖率一般,但关键路径都有测试覆盖。社区活跃度较高,主要贡献者比较固定,大概有五六个人在持续维护。
框架E的文档是最差的,基本上只有README里的一些简单说明,详细用法全靠读源码。测试覆盖率也很低。社区活跃度不高,但有一个核心维护者一直在更新,代码提交比较频繁。
框架F的文档和测试都做得不错,而且有一个很详细的迁移指南,从其他框架迁移过来的注意事项写得很清楚。社区活跃度中等偏上,讨论氛围比较好。
3. 逐个拆解:每个框架的核心机制与实操表现
3.1 框架A:轻量级任务编排的入门首选
框架A的定位很明确,就是做轻量级的任务编排。它的核心抽象是一个“任务链”,你把多个步骤串在一起,框架负责按顺序执行。每个步骤可以是一个模型调用、一个工具调用,或者一个条件判断。
我拿它跑了一个比较典型的场景:从某个数据源拉取数据,清洗后写入另一个存储。整个流程在框架A里配置起来大概二十行代码,非常简洁。执行效率也不错,整个流程跑完大概用了十几秒,其中大部分时间花在模型调用上。
但框架A的问题也很明显。首先是错误处理机制比较弱,如果某个步骤执行失败,整个任务链就会中断,没有自动重试或降级处理的机制。我测试的时候故意让第二步的工具调用返回一个错误,框架A直接抛异常退出了,没有任何补救措施。其次是并发支持有限,框架A的任务链是串行执行的,虽然支持在单个步骤内做并发,但步骤之间无法并行。这在处理大量数据时会成为瓶颈。
还有一个细节值得提一下,框架A的上下文管理是按轮次截断的,默认保留最近十轮对话。这个默认值在简单任务上够用,但如果你的任务需要引用更早的上下文,就需要手动调整这个参数。我建议把它调到二十轮以上,除非你确定任务不需要长程依赖。
实操心得:框架A最适合的场景是流程固定、步骤较少的任务。如果你的任务需要动态调整步骤或者处理复杂的错误情况,建议直接看框架C或框架F。
3.2 框架B:规划能力强但灵活性不足
框架B最大的卖点是它的规划能力。它内置了一个规划器模块,会先让模型生成一个完整的任务计划,然后按计划执行。规划器的提示词设计得比较精细,生成的计划通常质量不错,步骤划分合理,依赖关系也标注得比较清楚。
我拿它跑了一个多步骤的研究任务:先搜索某个主题的相关资料,然后筛选出最相关的几篇,最后生成一份摘要。框架B生成的计划是五步:搜索、去重、相关性排序、摘要生成、结果整合。这个计划本身没问题,但在执行过程中我发现了一个问题:第二步的去重逻辑是基于URL的,但搜索结果里有些内容来自同一个来源的不同页面,URL不同但内容高度重复。框架B的去重步骤没有处理这种情况,导致后续的摘要生成被重复内容干扰了。
这个问题的根源在于框架B的计划一旦生成就很难调整。去重逻辑不够完善这个问题在执行前是看不出来的,只有实际跑起来才会暴露。但框架B没有提供方便的机制来在执行过程中修改计划,你只能中断任务、修改代码、重新开始。
框架B的另一个特点是它的工具注册流程比较规范,每个工具都需要定义清晰的输入输出schema。这个设计在团队协作时很有优势,不同的人可以各自开发工具然后注册到框架里。但如果你只是个人使用,这个流程就显得有些繁琐了。
框架B的记忆管理用的是向量数据库方案,我测试下来召回质量不太稳定。有时候能准确召回相关的历史信息,有时候召回的内容完全不相关。我怀疑是嵌入模型的选择问题,但框架B没有提供方便的接口来更换嵌入模型,需要改源码。
3.3 框架C:平衡性最好的全能选手
框架C是我个人比较喜欢的一个,它在规划能力和灵活性之间找到了一个不错的平衡点。它的核心设计是“粗粒度规划+细粒度执行”,先让模型生成一个高层级的计划,每个步骤只描述目标,然后在执行每个步骤时再让模型细化具体操作。
这个设计的好处是计划不会过于僵化,因为每个步骤的具体操作是在执行时才确定的,可以根据实际情况调整。同时又有全局的计划作为指导,不会完全迷失方向。
我拿框架C跑了一个比较复杂的数据处理任务:从多个来源收集数据,清洗后做统计分析,最后生成报告。整个任务在框架C里跑了大概三分钟,中间遇到了两次数据格式不一致的问题,框架C都自动调整了处理逻辑,没有中断任务。这个表现让我比较满意。
框架C的工具调用支持动态发现,模型可以根据需要生成工具调用请求。稳定性方面比框架D好一些,我测试了大概五十次工具调用,失败率在百分之五左右,失败的主要原因还是参数类型不对。框架C的错误处理机制比较完善,会把失败信息返回给模型让它重试,重试两次之后如果还是失败会尝试用备用方案。
框架C的文档和测试都中规中矩,没有特别亮眼的地方但也没有明显的短板。社区活跃度偏低是一个问题,我在使用过程中遇到过一个bug,提了issue之后大概两周才有人回复。
注意事项:框架C的默认重试次数是两次,对于关键任务建议调到三次或以上。另外它的备用方案机制需要你提前配置好备用工具,否则重试失败后还是会直接放弃。
3.4 框架D:动态工具发现的激进派
框架D在工具调用上走得最远,它完全放弃了预注册模式,模型可以动态生成任何工具调用请求。这个设计的灵活性极高,理论上模型可以调用任何你提供的工具,甚至可以在运行时组合出新的工具。
但灵活性带来的代价是稳定性下降。我在测试框架D的时候,工具调用的失败率大概在百分之十五左右,主要失败原因有三个:参数类型不对、参数缺失、调用了不存在的工具。框架D的错误处理机制会把失败信息返回给模型,但模型有时候会反复犯同样的错误,重试三次之后框架就会放弃当前任务。
框架D的另一个问题是它的文档质量比较差,很多行为需要读源码才能搞清楚。比如它的工具调用请求格式,文档里只给了一个简单的示例,但实际支持的字段远不止示例里提到的那些。我是翻了源码才搞明白完整的请求格式。
框架D的记忆管理用的是结构化存储方案,按任务ID分组存储历史对话。这个方案的召回准确率很高,但跨任务的知识迁移基本做不到。如果你的任务之间需要共享知识,框架D可能不太适合。
框架D的社区活跃度还不错,有几个核心贡献者在持续维护。但代码质量参差不齐,有些模块写得很规范,有些模块明显是赶工出来的,注释很少,变量命名也很随意。
3.5 框架E:记忆管理最有创意的实验品
框架E在记忆管理上的设计是六个库里最有创意的。它不存储历史对话,而是让模型自己判断哪些信息值得记住,然后把这些信息写入一个“记忆文件”。下次对话时框架会读取这个文件作为上下文的一部分。
这个设计的核心理念是让模型自己管理记忆,而不是由框架机械地截断或检索。理论上这可以让记忆更加精准和相关,因为模型知道哪些信息对当前任务重要。
但实际效果取决于模型判断哪些信息值得记住的能力。我在测试中发现,模型经常会记住一些无关紧要的细节,比如某个中间步骤的输出格式,反而漏掉了关键信息,比如用户的偏好设置。我分析了一下原因,可能是模型在判断“什么值得记住”时缺乏足够的上下文信息,它不知道后续任务会需要什么信息。
框架E的另一个特点是它的代码非常简洁,核心模块加起来大概只有一千多行。这个简洁性让读源码变得很容易,但功能也相对有限。它不支持多Agent协作,不支持复杂的任务规划,基本上就是一个带记忆功能的对话循环。
框架E的文档质量是六个库里最差的,基本上只有README里的一些简单说明。测试覆盖率也很低,我翻了一下测试目录,只有几个基本的单元测试。但有一个核心维护者一直在更新,代码提交比较频繁,说明这个项目还在活跃开发中。
实操心得:框架E适合做实验性项目,特别是那些需要长期记忆的场景。但如果你需要稳定的生产级Agent,建议等它的记忆管理机制更成熟之后再考虑。
3.6 框架F:工具链模式的重型武器
框架F是六个库里最复杂的一个,它的核心设计是“工具链模式”。它把多个工具组合成一个工具链,模型调用的是工具链而不是单个工具。比如“搜索并总结”这个操作,在框架F里就是一个工具链,模型不需要分别调用搜索工具和总结工具。
这个设计在处理复杂任务时很有优势,因为工具链内部可以实现复杂的逻辑,比如错误重试、结果缓存、并行调用等。模型只需要关心“我要完成什么任务”,不需要关心“具体怎么调用工具”。
但工具链的粒度不好把握。太粗了灵活性差,比如你把“搜索、筛选、总结、格式化”全部打包成一个工具链,模型就无法在中间步骤做调整。太细了又失去了工具链的意义,跟直接调用单个工具没什么区别。框架F提供了一些预置的工具链,但实际使用中我发现这些预置工具链的粒度偏粗,很多场景下需要自己重新定义。
框架F的记忆管理是最复杂的,它同时维护了向量存储和结构化存储两套系统,检索时会综合两边的结果做排序。效果确实好一些,我测试了几个需要长程依赖的任务,框架F的表现明显优于其他几个库。但配置和维护成本也明显更高,你需要同时维护两套存储系统,还要调优检索排序的权重。
框架F的文档和测试都做得不错,而且有一个很详细的迁移指南,从其他框架迁移过来的注意事项写得很清楚。社区活跃度中等偏上,讨论氛围比较好。但框架F的学习曲线是六个库里最陡的,我花了大概三天时间才把它的核心概念和配置项搞清楚。
4. 实操过程中遇到的典型问题与排查记录
4.1 工具调用参数类型不匹配
这是我在测试过程中遇到的最频繁的问题,六个库里有四个都出现过。具体表现是模型生成了格式正确的工具调用请求,但参数类型不对。比如某个工具期望一个整数参数,模型传了一个字符串;或者期望一个数组,模型传了一个对象。
这个问题的根源在于模型对工具参数类型的理解不够精确。虽然工具定义里写了参数类型,但模型在生成调用请求时有时候会忽略这些约束。框架层面的解决方案主要有两种:一种是在工具调用前做参数校验,类型不对就直接拒绝并返回错误信息;另一种是在工具定义里加入更详细的参数说明,帮助模型理解参数类型。
框架B和框架F采用的是第一种方案,参数校验做得比较严格。框架A和框架C采用的是第二种方案,在工具定义里加入了参数示例和类型说明。实际效果来看,第一种方案更可靠,但需要框架层面做更多的工作。第二种方案依赖模型的理解能力,效果不太稳定。
我自己的经验是,无论用哪个框架,工具定义里的参数说明都要尽可能详细。不要只写“参数X是整数”,要写“参数X是整数,表示要处理的数据条数,取值范围1到1000”。这样模型生成正确参数的概率会高很多。
4.2 任务执行陷入循环
这个问题主要出现在链式思考驱动的框架上,框架A和框架D都出现过。具体表现是模型反复思考同一个问题,输出几乎一样的内容,但迟迟不采取行动。
我分析了一下原因,主要是模型的思考过程缺乏终止条件。模型在思考“下一步该做什么”时,如果没有明确的判断标准,就容易陷入反复确认的循环。框架层面的解决方案是在提示词里加入明确的终止条件,比如“如果你已经连续两次输出相同的思考内容,请立即选择一个行动方案并执行”。
框架A和框架D都没有内置这个机制,需要用户自己在提示词里加。我测试的时候在框架A的提示词里加了一句“如果你不确定下一步该做什么,请选择最可能的方案并执行,不要反复确认”,循环问题就明显改善了。
4.3 记忆召回质量不稳定
这个问题主要出现在使用向量数据库做长期记忆的框架上,框架B和框架F都出现过。具体表现是召回的历史信息有时候很相关,有时候完全不相关。
我分析了一下原因,主要是嵌入模型的选择和检索策略的问题。框架B默认用的嵌入模型对中文的支持不太好,召回中文内容时质量明显下降。框架F允许更换嵌入模型,但需要自己配置,默认配置的嵌入模型也是英文优先的。
解决方案有两个:一是更换更适合中文的嵌入模型,二是调整检索策略,比如加入关键词过滤或时间衰减因子。框架F支持这两种调整,框架B只支持第一种。我测试下来,更换嵌入模型之后召回质量有明显提升,但需要重新索引所有历史数据。
4.4 常见问题速查表
| 问题现象 | 可能原因 | 排查方法 | 解决方案 |
|---|---|---|---|
| 工具调用失败 | 参数类型不匹配 | 检查工具定义和实际调用参数 | 完善工具定义中的参数说明,加入类型校验 |
| 任务陷入循环 | 思考过程缺乏终止条件 | 观察模型输出是否重复 | 在提示词中加入明确的终止条件 |
| 记忆召回不相关 | 嵌入模型不适合当前语言 | 测试不同嵌入模型的召回效果 | 更换嵌入模型或调整检索策略 |
| 任务执行中断 | 错误处理机制不完善 | 检查失败步骤的错误信息 | 配置重试机制和备用方案 |
| 上下文丢失 | 上下文窗口截断 | 检查上下文管理配置 | 调整截断轮次或启用长期记忆 |
| 计划无法调整 | 规划机制过于僵化 | 观察执行结果与计划的偏差 | 选择支持动态调整的框架或手动干预 |
5. 选型建议:不同场景下该用哪个框架
5.1 快速原型验证:框架A或框架E
如果你只是想快速验证一个想法,不需要复杂的任务规划和工具调用,框架A和框架E都是不错的选择。框架A的优势是任务链配置简单,二十行代码就能跑起来一个基本流程。框架E的优势是记忆管理有创意,适合做需要长期记忆的实验。
这两个框架的学习曲线都比较平缓,文档虽然不算特别完善但基本够用。框架A的社区活跃度中等,遇到问题提issue一般能在一周内得到回复。框架E的社区活跃度偏低,但核心维护者响应比较及时。
5.2 生产级任务编排:框架C或框架F
如果你需要把Agent用到实际业务里,对稳定性和可维护性有要求,框架C和框架F是更合适的选择。框架C的平衡性最好,规划能力和灵活性都不错,适合大多数场景。框架F的工具链模式在处理复杂任务时很有优势,但学习曲线较陡,配置和维护成本也更高。
这两个框架的文档和测试都做得不错,社区活跃度也在可接受范围内。框架C的issue响应速度偏慢,但核心功能比较稳定,不太需要频繁更新。框架F的社区讨论氛围比较好,遇到问题容易找到解决方案。
5.3 多Agent协作:目前还没有特别成熟的选项
如果你需要多Agent协作,说实话目前这六个框架都没有特别成熟的方案。框架F支持一定程度的多Agent协作,但配置复杂,实际效果也不太稳定。框架C和框架D有一些多Agent的实验性功能,但文档很少,基本上要靠读源码才能搞清楚怎么用。
我个人的建议是,如果你确实需要多Agent协作,可以考虑用框架F作为基础,然后自己实现协作逻辑。或者等这些框架的多Agent功能更成熟之后再考虑。
5.4 各框架综合对比
| 维度 | 框架A | 框架B | 框架C | 框架D | 框架E | 框架F |
|---|---|---|---|---|---|---|
| 任务规划 | 链式思考 | 先规划后执行 | 混合式 | 链式思考 | 无 | 先规划后执行 |
| 工具调用 | 预注册 | 预注册 | 动态发现 | 动态发现 | 预注册 | 工具链 |
| 记忆管理 | 短期 | 向量存储 | 短期 | 结构化存储 | 记忆文件 | 混合存储 |
| 文档质量 | 高 | 中 | 中 | 低 | 低 | 高 |
| 测试覆盖率 | 低 | 高 | 中 | 中 | 低 | 高 |
| 社区活跃度 | 中 | 高 | 低 | 中 | 低 | 中高 |
| 学习曲线 | 平缓 | 中等 | 中等 | 中等 | 平缓 | 陡峭 |
| 适用场景 | 快速原型 | 规划密集型 | 通用 | 工具密集型 | 实验性 | 复杂任务 |
6. 我在实际使用中总结的几条经验
先说一个最容易被忽略的点:工具定义的详细程度直接决定了Agent的稳定性。我一开始用框架A的时候,工具定义写得很简单,就写了个函数名和参数名。结果模型经常传错参数类型,失败率很高。后来我把每个参数的说明都写得很详细,包括类型、取值范围、示例值,失败率直接降了一半以上。这个经验在六个框架上都适用。
第二个经验是不要迷信框架的默认配置。这六个框架的默认配置都是偏向保守的,比如默认重试次数是两次,默认上下文窗口是十轮,默认嵌入模型是英文优先的。这些默认值在简单任务上够用,但在实际业务场景下往往需要调整。我建议你在正式使用之前,先把所有默认配置过一遍,该调的调,该换的换。
第三个经验是日志和监控比你想的重要。Agent执行任务的过程中会产生大量的中间状态,如果不记录日志,出了问题根本不知道是哪一步出的错。我在测试框架D的时候,有一次任务执行到一半就停了,没有任何错误信息。后来我加了详细的日志记录,才发现是某个工具调用返回了一个空结果,框架没有处理这种情况就直接退出了。从那以后我养成了一个习惯,不管用哪个框架,先把日志和监控配好再跑任务。
第四个经验是不要试图用一个框架解决所有问题。这六个框架各有各的擅长场景,没有哪个是万能的。我现在的做法是,简单任务用框架A快速验证,复杂任务用框架C或框架F,需要长期记忆的实验用框架E。根据任务特点选择合适的工具,比强行用一个框架硬扛要高效得多。
最后分享一个小技巧:如果你不确定该选哪个框架,可以先花半天时间把框架A和框架C都跑一遍,用同一个任务对比一下效果。框架A能让你快速理解Agent的基本概念,框架C能让你看到更复杂的任务规划是怎么做的。这两个跑通了,再根据实际需求决定要不要深入其他框架。