8_Agent讨论
1 Agent 怎么选
1.1 引言
可以说,agent 是一种解决问题的思路(道),具体的工具(术)并不重要。但在程序中,它仍需要一个具体的形态。由于时间有限,我只调研了目前 GitHub 上最热门的 agent 工具,也查看了一些项目中自行实现的 agent 代码。最终选择了 autogen。
1.2 目标
首先,明确选型的目的是什么:
- 支持我需要的所有功能,减少自定义开发。
- 易于理解和使用,学习成本低,安装和打包方便。
- 高稳定性和灵活性。
- 便于未来扩展。
具体选择还要根据所需功能来决定。如果只是做一个以闲聊为主、偶尔调用现有工具的聊天机器人,可以使用 langchain。如果涉及较多功能、偏重于 Agent 应用、工具之间有复杂逻辑,或者觉得 langchain 无法满足需求,可以尝试 autogen。
1.3 选择工具
langchain 就像一家初创公司,只有几个员工,扁平化管理。在事务简单人也少的时候还能应付,但一旦人多事杂,就会变得混乱。即使没有一个主管,也至少一套制度规则,满足常用功能。Langchain 的 agent 主要在结构上较弱,而不是功能性差。其它一些更偏应用的工具则是完全定制好的 Agent,用户可以直接调用。
1.3.1 Langchain
Langchain 提供了丰富的工具和功能,但在 Agent 方面相对简单。它主要是对 LLM 工具/函数的简单封装,示例比较零散,网上的教程大多只介绍最基础的用法,上手较慢。Langchain 包含很多工具集,由于考虑了代码重用和逻辑统一性,如果仅使用 Agent,会有点重;对于复杂的逻辑,需要手动修改的也比较多。对于简单使用 Agent 的情况,选择 Langchain 也是可行的。
由于 Langchain 出现较早且功能全面,对其 API 熟悉的人不少。我的代码中已经使用了 LangChain 的其他功能,所以一开始我选择的也是 LangChain 的 agent。
1.3.2 AutoGen
AutoGen 是由 Microsoft 出品的。它的文档和示例非常完整,还有一篇论文介绍其原理和功能(AutoGen: Enabling Next-Gen LLM Applications via Multi-Agent Conversation)。初次使用接口非常方便,只需十行代码即可搞定。对于较复杂的用法,由于接口参数设计得较为充分,其绝大部分功能都可以通过接口调用实现。除了需要跟踪基本的调用关系和了解类的父子关系外,不需要理解太多内部代码。
另一个亮点是,它集成了 Python 环境,并且可以在独立的 Docker 容器中运行代码。简单的工具可以边生成边执行,提供更好的运行时体验,不仅能调用最初设计好的工具。
此外,还允许用户参与与多个 Agent 的对话,引导这些 Agent 完成任务,非常灵活。
1.3.3 自己实现 Agent
我也查看了一些代码中自行实现的 Agent(有些利用了 Langchain 的 LLM 部分和 Memory 部分,并自行实现了 Agent 部分)。对于简单的功能来说,这样做是可行的,代码量也不多。但要在短时间内实现一个良好的抽象是很难的。随着功能的增加,可能需要重写或大幅修改,还会出现各种各样的 bug,不如直接使用一个相对成熟的工具。
如果只考虑调用工作,还有更底层的方法是直接调用 LLM 的 API 中 Tool/Function 的功能,但这需要自己构造很多东西,还要考虑支持多个 LLM,非常麻烦。
1.3.4 易用性
从大模型支持来看,LangChain 和 AutoGen 都支持保留对话上下文。常用的 LLM 接口,如 OpenAI、Gemini 和 Claude,也都提供支持。
从安装方面看,这两个库都可以通过 pip 安装。LangChain 目前被拆成了多个包,因此相对较重,而 AutoGen 则相对更简单一些。
1.3.5 框架切换
我的程序将逻辑和框架分开,因此可以随时替换代理框架而不影响功能。从 LangChain 切换到 AutoGen 非常迅速。也可以在调试工具时使用 AutoGen,而其他对话场景可以继续使用 LangChain。两者同时使用也没问题。
从 LangChain 转向 AutoGen,之前在使用 LangChain 时遇到的一些疑问或不便,AutoGen 基本都有所改善。特别是程序员能够控制整个流程,它包含控制层(多层控管),而不是全部交由初始的提示和 LLM 控制。这种方式具有更大的可控性,从而提升了稳定性。
1.4 当前问题
1.4.1 稳定性
- 稍微改动 prompt 就会出错
- 还需要严格把关
1.4.2 可控性
- 我觉得大部分时间,不需要让它思考,只要选择工具并进行操作即可。
- 可设置:只有在需要时的时候思考
2 当前的 Agent
2.1 为啥要用多 Agent
- 问题复杂:无法在一个提示中描述所有 100 步和 50 种工具。
- LLM 无记忆功能,只能依赖提示信息。
- 信息越简单单一,LLM 越容易处理;信息多了容易混乱。
- 提示可以包括:问题、步骤分解、当前进度、可用工具、结束条件等。
- 提示的主要内容和结构需事先确定,不应随意更改,而每次问答的侧重点可能不同。
- 多个代理,每个代理的提示管理本次问答的主旨和上下文,有效解决上述问题。每个代理可专注于内部处理,减少按下葫芦起了瓢的问题。
- 多个代理就像多人协作,通过设定交互规则,可以组织成串型、中心化或小组为核心,每次只专注处理一小部分。
2.2 当前 LLM 能解决哪些问题
- AI 目前主要处理一些非核心问题,如接口问题、外围问题和简单任务,更多是起到辅助作用,减轻工作量。
- 核心问题仍需程序员解决,包括:可能需要微调模型、结构设计、大问题拆分成小问题,或边探索边调整。
- AI 缺乏整体能力,只能独立解决单个问题。
2.3 Agent 可以改善什么
- 无代码编程,之前为什么不行
- 复用问题:高耦合
- 接口问题:不同设备、不同数据库、不同界面、不同格式
- 人为建造的壁垒
- 搭积木到底行不行
- 在模型、业务、当前工具之间建立桥梁。
- 出现了好的 Agent 框架,基于这个架构,用搭积木的方法完成各种功能。
- 每个 Agent 是一个模块,内部封装所有功能,只提供输入输出和使用场景,最终变成面向 Agent 的编程。
- 所有东西都是 Agent。拆分计划是 Agent,存储是 Agent,搜索是 Agent,审查是 Agent,接口也是 Agent。各个 Agent 非常强大,然后把它们对接起来,就像 Coze 和 Dify 一样,谁都能用。
- 程序员是那些提供和售卖 Agent 或提供整体解决方案的人。
2.4 新技术是否取代 Agent
- OpenAI O1
- 解决小领域的复杂问题
- 原理:自我强化学习(Self-RL),通过奖励和惩罚来教导模型自行解决问题,并通过“思维链”(chain of thoughts)来处理用户查询的问题。
- 询问完整思维链会导致账号被封。