前几周一直在忙于同考试、工作、学习间周旋搏斗,也是好久没有同分身乏术的无力感撞个满怀了,甚至感觉有些怀念(bushi)。最近终于闲下来,可以静下心来好好写点东西了。
借着最近在百度实习的机会,自己也是接触到了许多同前沿技术相关的信息与知识。在工作之余呢,读了好多知识库里大家写的关于大模型啊,产品设计啊,Prompt工程啊,营销策略啊之类的文章,觉得都特有意思,之后有机会了会多在这里留存一下自己“偷师”后的感悟。
这次主要想分享一点关于最近讨论热度比较高的 AI Agent 相关的内容,同时结合自己亲身经历的一些相关实践,在这里记录一下自己的思考。
开篇先点个题,用大家都能看的懂的话说,所谓 AI Agent, 其实就是给大语言模型(LLM)装上了一个大脑,使他不仅能回答问题,还能更聪明、更有效地去解决问题。
而用更专业的话讲呢,AI Agent,即“角色框架”,其实是一种编程范式,其核心在于赋予大型语言模型(如 LLM)一种解决问题的策略性思维结构。此框架模拟了人类处理问题的流程:角色设定模块对应对环境背景的理解与认知;规划模块则负责任务的拆解与策略制定;内存模块承载着自我状态的操作与管理;而动作模块则执行最终的决策行为。
现在我们能接触到的大多数大语言模型(LLM)是没有 Agent 的。对于我们这些普通用户而言,使用这种没有 Agent 的大模型的方法呢,也非常得简单粗暴。我们只需要在提问框中输入问题,模型就会直接生成答案。这种方式简单直接,但也有一些局限性,比如模型只能在用户所提供的context(语境)下回答问题,倘若不考虑 Top_p(丰富度) 和 Temperature(随机性) 这些关键因素,使用者对生成内容的质量和其所覆盖的信息,其实是很难去进行控制的。但当我们引入 Agent 后,情况就不一样了。Agent 可以在回答问题之前先进行策略规划,这就像是让模型先做个小计划。更好玩的一点是,Agent 还能在完成任务后独立解决一些子任务,或者调动预设的工具资源。这样一来,整个过程就变成了一个涵盖规划、执行和反馈的智能决策循环。举个例子,假设你问一个没有 Agent 的模型一个复杂的问题,它可能会直接给你一个答案,而不去再次思考所给出答案的准确性和适用程度。但如果你向一个有 Agent 的模型进行提问,它会先进行规划,计划如何回答你的问题,这个过程可能会涉及到查阅相关资料,组织合适的语言表达风格和叙述逻辑等,最后输出一个更全面、更准确的答案。如果你需要,它还会调用一些外部工具来辅助完成这个任务。
这种结构分成四个主要部分:
- 角色设定模块:这个模块负责理解和认知环境背景,就像我们大脑里形成的“角色”。例如,一个AI可以被设计成“医生”角色,从而更好地回答医疗相关的问题。
- 规划模块:制定任务的步骤和策略,就像我们做事前的计划。这个模块会把复杂任务分解成多个小任务,按步骤来完成。例如,一个AI规划模块可能会先把一个最最基本的问题单拎出来进行分析,然后再制定相关的策略来解决它。
- 内存模块:管理和操作自我状态,类似于我们记忆和回忆信息。内存模块可以记录之前的对话和决策,帮助AI在后续的任务中做出更好的决策。
- 动作模块:执行最终的决策行为,比如我们做出行动。这个模块会根据规划模块的策略来执行具体的操作。
这些理解起来其实并不困难,我们接下来详细探讨一下每个模块的功能与作用。
规划模块
在讨论 AI Agent 的规划模块时,我们可以将其分为两种架构类型:开环系统和闭环系统。
- 开环系统
开环系统的特点是当前行动步骤的结果不会影响后续的规划。比如,思维链(Chain of Thought, COT)就是一个典型的开环系统,它按照线性路径执行,没有反馈机制。这种系统的好处是简单直接,但也有明显的局限性。
更先进的一种技术是多路径系统,这种设计灵感来源于人类在解决问题时会从多个角度思考的方式。Self-consistency 策略就特别关注在多种不同思路可能导向相同结论的情况。然而,在开环系统中频繁调用 LLM 的方法,其实并不太划算。根据个人的实践观察,反复调用 LLM 会增加成本和响应时间。所以,直接采用闭环系统往往更为高效。
- 闭环系统
AI Agent 本质上是一个闭环系统,其规划的每个步骤都会受到之前步骤的影响。这种闭环性质意味着 Agent 会多次调用大语言模型(LLM),并且对内存的管理更为复杂。以下是几个代表性的闭环系统实例:
- Self Ask:基于 Chain of Thought(COT)理念,并加入了一系列后续问题,以此实现闭环。这种方法允许模型在回答前不断反问自己,确保答案的准确性。
- React:这是一个典型的闭环系统,但它在进行局部规划时可能会逐渐偏离最初的目标,导致目标遗忘。尽管如此,它仍然能够在执行过程中不断调整策略。
- Plan & Solution:与 ReAct 有相似之处,但它从一开始就由 LLM 进行全局规划,减少了目标偏移的可能性。这种方法更适合需要全局视角的复杂任务。
- Reflection:注重内存操作的细化,区分短期记忆和长期记忆,每类记忆由不同角色使用,有助于实现群体智能。这种方法因内存操作复杂性而独树一帜,内存的形态决定了编写 prompt 的方式,无论是向量、字符串还是 SQL 数据库形式。
内存模块
而说到相关记忆的存储方式,那对于内存的处理便是我们绕不开的话题了。
在处理内存时,我们主要关注三个重要方面:内存内容的检索、数据去重,以及内存满载时的数据简化。这些步骤是至关重要的,因为内存类型的差异会直接影响到研发端的编程逻辑。
- 内存管理
首先,我们得确保能快速找到需要的信息,这就是内存内容的检索。其次,我们需要去重,避免重复信息占用宝贵的内存空间。最后,当内存接近满载时,我们要进行数据简化,删除不必要的信息,保留最关键的部分。
动作模块
接下来是动作模块或者更专业一点的说法叫行动模块,这部分大致可以分为两类函数执行方式:
- 人类编写的函数:这些函数有严格定义的 API 和输入参数,确保操作的一致性和可靠性。
- 直接调用 LLM 自身的能力:这种方法相当于自我引用,利用 LLM 的内在功能来直接生成和处理数据。
然而,根据我个人的一些相关项目经验,在实际应用中,行动模块在调用人类编写的函数时可能会遇到一些很致命的问题。这些函数要求固定且结构化的输入,而 LLM 产生的输出通常是非结构化字符串。因此,我们需要进行转换,例如转化为 JSON 或字典格式。这一转换过程容易出错,比如括号缺失等问题。同样,函数返回结果的结构化处理也是一大挑战。我们需要确保这些结果能够被有效利用于人类函数和 LLM 函数之间的交互,而不仅仅局限于 LLM 内部循环。
目前,这一模块在鲁棒性(Robust:在异常和危险情况下系统生存的能力)上仍有改进空间。不过值得庆幸的是,GPT-4-Turbo 在生成 JSON 格式方面的稳定性已有所提升,这无疑为改进系统的整体性能提供了帮助。
多模态
之后便是多模态的问题了。现在每当我们讨论到 AI Agent,特别是基于底座大模型的 Agent ,当前最热门的话题总会聚焦于这些模型的多模态能力。引入多模态能力后,Agent 的操作将变得更加智能和全面,不仅能回答文本问题,还能处理图像、音频等多种形式的信息。这样一来,整个过程不仅涵盖了规划、执行和反馈,还能够集成多种数据源,提供更丰富和准确的回答。同时,这个过程涉及到许多模型应用的技术和工具,比如文字识别,语音识别、图像识别、视频中的动作识别啊之类的技术,详细内容之后有时间了再写。
总结
最后来个一句话总结:引入 Agent 后,模型所能收获到的最大的增益是变得更像我们现实中处理问题的人了,先进行策略规划,然后拆解并调用工具解决子任务,实现"感知 -> 规划 -> 执行(工具调用)"这种常见的思维方式。