从GPT到Agent:大语言模型的进化之路


一、 引言 (Introduction)

1.1 钩子:从“只会聊天的秘书”到“能自主干活的超级员工”

你是不是刷到过B站/抖音上用AutoGPT自动生成论文大纲、整理行业数据、写周报周报甚至一键生成带逻辑链PPT的“全自动AI打工人”短视频?是不是用过大豆豆、豆包或者ChatGPT的GPTs插件搭过自己的专属AI助手——比如“考研政治知识点带背+错题自动收集+院校分析生成器”“程序员BUG排查+代码优化建议+Git提交自动生成助手”?是不是对前一阵OpenAI DevDay上发布的GPT-4o和自定义Action/GPTs能调用浏览器、计算器、本地API甚至第三方电商插件完成“订一张明天下午三点从上海虹桥到杭州东站的高铁二等座、查一下到达站附近评分4.5以上人均150元以内的杭帮菜馆、并生成一份100字以内的杭州行程建议草稿”这类连贯多步任务的能力感到震惊?

这些看起来“无所不能”的AI应用,本质上都不是凭空出现的——它们既不是什么新物种,也没有完全脱离现有的大语言模型(Large Language Model,LLM)技术底座,而是站在最经典、最成熟的LLM代表——GPT系列肩膀上的“Agent(智能体)”。

在没有Agent概念普及之前,我们对GPT的认知大多停留在“高级聊天机器人”“信息查询工具升级款”“代码助手的代码生成模块”——它虽然能理解复杂的上下文、生成流畅的文本、写简单的Python脚本,但它的能力边界非常清晰:

  1. 它没有长期记忆,聊天窗口一关,你之前和它说的“要生成符合《阿里巴巴Java开发手册》泰山版的规范代码”就会完全消失;
  2. 它不会自主规划任务,你必须把“订高铁票查馆子写行程”这件事拆成“第一步:提取我的位置、时间、目的地需求;第二步:调用12306查询符合条件的车票;第三步:筛选二等座且有票的车次;第四步:调用高德/大众点评查杭州东站附近的杭帮菜馆;第五步:筛选评分4.5+人均150以内的;第六步:把所有信息汇总写100字行程”这6个明确的、一步一步的指令喂给它,它才能勉强完成(中间还可能因为指令描述不够细、调用第三方接口失败/格式不对而卡壳);
  3. 它没有工具使用意识和能力——除非你提前给它装好了插件,否则它只会告诉你“抱歉,我没有实时访问网络的权限,无法查询明天的高铁票”;
  4. 它不会自我反思和迭代,如果你指出它生成的代码“不符合阿里巴巴Java开发手册的命名规范(比如方法名用了下划线而不是驼峰)”,它只会改这一处,下次生成代码还是可能犯同样的错误,除非你每次都把规范写在上下文里;
  5. 它没有环境交互能力——它只能处理你输入的文本(或者GPT-4o、Gemini 1.5 Pro能处理的图片、音频、视频等多模态输入),但它无法真正“打开”电脑上的Word文档修改内容、无法“点击”浏览器上的按钮提交表单、无法“移动”机器人的手臂抓取桌子上的水杯。

但有了Agent之后,这一切都变了:

  • 长期记忆可以存储在外部的向量数据库(比如Pinecone、ChromaDB)里,Agent每次启动都会先从向量数据库里检索“用户的历史偏好、之前的任务完成情况、常用的规范和规则”,然后再处理新的请求;
  • 自主规划任务的能力由专门的“规划模块”(比如基于GPT-4/Turbo的思维链/树搜索规划)实现——你只需要说一句“明天下午三点我要从上海去杭州出差,帮我安排一下相关事宜,控制晚饭人均在150以内,行程要赶,只需要逛西湖断桥和雷峰塔就行”,Agent就能自动把这个模糊的需求拆解成N个明确的子任务,排好优先级,甚至预留出“高铁延误预案”“餐馆预约失败备选方案”;
  • 工具使用意识和能力由“工具选择与调用模块”实现——Agent会根据当前的子任务,自动从你提前配置好的“工具库”(比如12306API、大众点评API、浏览器插件、本地Python脚本执行器、文件读写工具)里选择最合适的工具,生成符合工具要求的调用参数,执行工具,然后把工具的返回结果“翻译”成自己能理解的自然语言/结构化数据;
  • 自我反思和迭代的能力由“反思与学习模块”实现——每次任务完成(或者失败)之后,Agent都会先“复盘”整个过程:“刚才的子任务拆解是不是合理?有没有冗余的步骤?工具调用的时候参数是不是传错了?为什么会失败?如果换一种方法会不会更好?”然后把复盘的结果存入外部的“经验库”或者向量数据库里,下次遇到类似的任务就会吸取教训,做得更快更好;
  • 环境交互能力由“执行器模块”实现——对于软件环境(比如电脑、手机、服务器),执行器可以是基于Selenium、Playwright的自动化测试工具,也可以是专门的命令行/API执行器;对于物理环境(比如工厂、家庭、办公室),执行器可以是机器人的控制系统、无人机的飞控系统、智能家居的控制中枢。

看到这里,你是不是对“从GPT到Agent的进化之路”充满了好奇?到底什么是GPT?什么是Agent?它们之间的核心区别是什么?GPT是怎么一步步进化到能够支撑Agent运行的?我们又怎么从会聊天的GPT基座,一步步“组装”出一个能自主完成多步复杂任务的Agent?未来的Agent又会发展成什么样子?

1.2 定义问题/阐述背景:为什么GPT进化到Agent是必然趋势?

在讨论“从GPT到Agent的进化之路”之前,我们必须先搞清楚两个最核心的问题:

  1. 大语言模型(LLM)本质上是什么?
  2. 为什么我们不满足于“只会聊天的GPT”,一定要把它进化成“能自主干活的Agent”?
1.2.1 大语言模型(LLM)的本质:一个“超级文本预测器”+“知识压缩器”

首先,我们来拆解一下LLM的本质——这一点是理解整个进化之路的基础。

很多非技术背景的人(甚至一些刚接触AI的技术背景的人)会把LLM想象成“一个装了全世界所有知识的超级大脑”,或者“一个有自主意识的机器人”——但这完全是误解

从技术原理上来说,目前所有的主流LLM(包括GPT系列、Gemini系列、Claude系列、Llama系列、Qwen系列等),本质上都只是一个基于Transformer架构的、用海量文本数据训练出来的、统计意义上的“超级文本预测器”——它们的核心功能只有一个:给定一段文本(称为“上下文”或者“Prompt”),预测下一个最可能出现的Token(Token可以理解为“文本的最小单位”,比如中文里的一个字、英文里的一个单词或者半个单词)

举个最简单的例子:如果你给GPT输入一段文本“今天天气真____”,GPT会根据它在训练过程中学到的“海量文本中‘今天天气真’后面最常出现的词是什么”的统计规律,预测出下一个最可能的Token是“好”,然后是“热”“冷”“晴朗”“糟糕”等等——然后它会根据概率大小,选择一个(或者几个)Token输出。

当然,为了让这个“超级文本预测器”能生成更流畅、更符合人类逻辑、更有实用价值的文本,研究人员在Transformer架构的基础上,做了很多改进:

  • 增大模型参数量:从GPT-1的1.17亿参数,到GPT-2的15亿参数,到GPT-3的1750亿参数,再到GPT-4的(据说)万亿级参数——参数量越大,模型能“记住”的训练数据中的“统计规律”和“隐含知识”就越多,生成的文本质量就越高;
  • 增加训练数据量和数据质量:GPT-3的训练数据量是45TB的文本(包括维基百科、书籍、新闻、博客、代码仓库等),GPT-4的训练数据量据说更大,而且数据质量更高(过滤掉了大量低质量的垃圾文本)——训练数据越多越高质量,模型的“知识储备”就越丰富,理解能力就越强;
  • 引入上下文窗口(Context Window):上下文窗口指的是模型能“看到”的最长的输入文本长度——从GPT-1的1024个Token,到GPT-3的2048个Token,到GPT-3.5 Turbo的4k/16k/128k个Token,到GPT-4的8k/32k/128k/1M个Token——上下文窗口越大,模型能“记住”的当前对话的上下文就越多,就能处理更复杂的长文本任务(比如阅读一本10万字的小说并写读后感、分析一份100页的行业报告并提取核心观点);
  • 引入对齐(Alignment)技术:对齐技术指的是“让模型的输出符合人类的价值观和期望”的技术——比如OpenAI在GPT-3.5和GPT-4中使用的**RLHF(Reinforcement Learning from Human Feedback,基于人类反馈的强化学习)**技术:首先用大量的人类标注数据训练一个“奖励模型(Reward Model)”,这个模型的作用是“给模型的输出打分”——分数越高,说明输出越符合人类的价值观和期望;然后用强化学习的方法(比如PPO,Proximal Policy Optimization,近端策略优化),让GPT模型不断地生成输出,然后用奖励模型给输出打分,再根据分数调整模型的参数,最终让模型的输出越来越符合人类的要求;
  • 引入多模态(Multimodal)能力:多模态能力指的是“模型不仅能处理文本,还能处理图片、音频、视频等其他模态的输入”的能力——比如GPT-4o能理解图片、音频、视频,能生成图片(虽然目前图片生成能力不如DALL-E 3,但已经能满足基本需求),能生成语音,能理解语音;Gemini 1.5 Pro能处理长达10小时的音频、长达1小时的视频、多达1000页的PDF文档;

即使做了这么多改进,LLM的本质依然没有变——它还是一个“超级文本预测器”+“知识压缩器”(它把海量的训练数据压缩成了模型的参数)——它没有自主意识,没有情感,没有欲望,它只是在根据训练数据中学到的统计规律,“猜”下一个最可能出现的Token而已。

1.2.2 为什么我们不满足于“只会聊天的GPT”?——LLM的五大核心局限性

虽然现在的主流LLM已经非常强大了,但它们依然存在五大核心局限性,这些局限性使得它们无法直接用来解决现实世界中的大多数多步复杂任务——而现实世界中的大多数任务(比如订高铁票查馆子写行程、写一篇学术论文、开发一个软件项目、管理一个团队、制定一个市场营销策略),都是多步复杂任务。

接下来,我们就来详细拆解一下LLM的五大核心局限性:

局限性一:缺乏长期记忆(Lack of Long-Term Memory)

目前的主流LLM,不管它的上下文窗口有多大(比如GPT-4 Turbo的128k Token,大概相当于96万字的中文文本;Gemini 1.5 Pro的1M Token,大概相当于750万字的中文文本),它的记忆都是短期记忆——这个短期记忆只存在于“当前的上下文窗口”里,一旦上下文窗口满了,或者你关闭了聊天窗口,这个短期记忆就会完全消失,模型就会“忘光”之前和你说的所有内容。

举个现实中的例子:假设你是一个产品经理,你正在用GPT-4 Turbo帮你写一份“电商APP618大促活动方案”——

  1. 第一天,你和GPT-4 Turbo聊了3小时,确定了活动的主题、目标用户群体、活动时间、活动规则(比如满300减50、满600减120、抽奖赢iPhone 15 Pro Max)、活动预算(比如1000万元);
  2. 第二天,你打开新的聊天窗口,问GPT-4 Turbo:“昨天我们讨论的电商APP618大促活动方案的抽奖规则是什么?”——GPT-4 Turbo会完全懵掉,它会告诉你“抱歉,我没有之前对话的历史记录,请你重新提供一下相关信息”;
  3. 即使你第二天没有关闭聊天窗口,而是继续在第一天的聊天窗口里聊,但随着你和GPT-4 Turbo的对话越来越多,上下文窗口满了,GPT-4 Turbo也会“忘光”最开始你和它说的活动主题、目标用户群体等内容。

这种“缺乏长期记忆”的局限性,使得LLM无法直接用来完成需要“持续积累知识、了解用户长期偏好、跟踪长期任务进度”的任务——比如产品经理的需求文档管理、程序员的项目代码库维护、医生的患者病历管理、老师的学生学习进度跟踪等。

局限性二:缺乏自主规划能力(Lack of Autonomous Planning Ability)

目前的主流LLM,虽然能在明确的、一步一步的指令下完成简单的任务,但它们完全没有自主规划能力——也就是说,它们无法把一个模糊的、高层次的需求(比如“明天下午三点我要从上海去杭州出差,帮我安排一下相关事宜”)自动拆解成明确的、低层次的、可执行的子任务(比如“第一步:提取用户的需求——出发地上海虹桥、目的地杭州东站、出发时间明天下午三点、交通方式高铁二等座、晚上要逛西湖断桥和雷峰塔、晚饭人均150以内;第二步:调用12306API查询符合条件的车票;第三步:筛选二等座且有票的车次,优先选择到达时间最早、价格最低的;第四步:调用高德地图API查询杭州东站到西湖断桥的交通方式和时间;第五步:调用大众点评API查询西湖断桥附近评分4.5以上人均150以内的杭帮菜馆,优先选择距离近、好评多、支持预约的;第六步:调用大众点评API预约选中的杭帮菜馆;第七步:汇总所有信息,生成一份100字以内的行程建议草稿;第八步:如果某个子任务失败(比如高铁票售罄、杭帮菜馆预约失败),自动生成备选方案”),也无法排定子任务的优先级,更无法预留出子任务失败的备选方案

举个现实中的例子:假设你是一个刚毕业的大学生,你正在用GPT-4帮你找一份“上海的互联网公司的产品经理助理岗位”——

  1. 你给GPT-4输入一段模糊的高层次需求:“我是上海某大学2024届的计算机科学与技术专业的本科毕业生,GPA3.7/4.0,有过一段在某小型创业公司做产品运营实习生的经历(实习了3个月,主要负责用户调研、竞品分析、内容运营),现在想找一份上海的互联网公司的产品经理助理岗位,月薪要求8k-12k,希望公司的氛围好一点,能学到东西,最好是做电商或者社交产品的——你帮我安排一下找工作的相关事宜。”
  2. 如果你不给GPT-4任何明确的指令,GPT-4只会生成一段“通用的找工作建议”——比如“首先你要修改你的简历,突出你的产品相关经历;然后你要在招聘网站(比如BOSS直聘、拉勾网、前程无忧)上投递简历;然后你要准备面试;然后你要参加面试;然后你要等待offer;然后你要选择offer”——但这段“通用的找工作建议”完全没有可操作性,它没有告诉你“怎么修改简历才能突出你的产品相关经历?”“怎么在招聘网站上筛选符合条件的岗位?”“怎么准备产品经理助理的面试?”“如果面试失败了怎么办?”
  3. 即使你给GPT-4一些明确的指令,比如“首先你要帮我修改简历”,GPT-4也只会根据你提供的“简历原始内容”修改简历,但它不会“自主”地去做“用户调研——看看现在上海的互联网公司的产品经理助理岗位的JD(Job Description,岗位描述)是什么?它们最看重什么能力?”——而用户调研才是修改简历的第一步。

这种“缺乏自主规划能力”的局限性,使得LLM无法直接用来完成现实世界中的大多数多步复杂任务——因为现实世界中的大多数多步复杂任务,都是“模糊的、高层次的”,没有人会把任务拆成“一步一步的、明确的、可执行的子任务”喂给你。

局限性三:缺乏工具使用意识和能力(Lack of Tool Use Awareness and Ability)

目前的主流LLM,除非你提前给它装好了插件(比如ChatGPT的Plugins、GPTs的Custom Actions),否则它们完全没有工具使用意识和能力——也就是说,它们不知道“当它们遇到自己无法直接解决的问题时(比如需要实时访问网络查询信息、需要读取本地文件、需要执行Python脚本、需要调用第三方API),它们应该去使用工具”,更不知道“怎么选择合适的工具?怎么生成符合工具要求的调用参数?怎么执行工具?怎么把工具的返回结果‘翻译’成自己能理解的自然语言/结构化数据?”。

举个现实中的例子:假设你是一个数据分析师,你正在用GPT-4帮你分析一份“2024年第一季度某电商APP的用户行为数据”——这份数据存储在本地的一个CSV文件里,文件名为“2024_Q1_ecommerce_user_behavior.csv”,文件大小是1GB——

  1. 你给GPT-4输入一段需求:“帮我分析一下这份2024年第一季度某电商APP的用户行为数据——数据存储在本地的CSV文件‘2024_Q1_ecommerce_user_behavior.csv’里——分析一下用户的日活跃率(DAU)、月活跃率(MAU)、用户留存率(次日留存、7日留存、30日留存)、用户转化率(浏览商品→加入购物车→下单→支付)、最受欢迎的商品类别、最受欢迎的商品、用户的消费金额分布、用户的消费时间分布——最后生成一份10页的PPT分析报告。”
  2. 如果你不给GPT-4装任何插件,GPT-4只会告诉你“抱歉,我没有权限访问本地文件,也没有权限执行Python脚本,更没有权限生成PPT文件——请你把数据直接输入到聊天窗口里,或者把数据分析的需求拆成更明确的步骤,我可以帮你写Python脚本,然后你自己执行脚本,再把执行结果输入到聊天窗口里,我可以帮你分析结果,最后你自己生成PPT文件”——但1GB的CSV文件根本不可能直接输入到聊天窗口里,而且整个过程非常繁琐,需要你不断地和GPT-4交互,完全失去了“用AI提高效率”的意义;
  3. 即使你给GPT-4装了“Code Interpreter(代码解释器)”插件(现在叫“Advanced Data Analysis,高级数据分析”),GPT-4也只能执行简单的Python脚本,分析小文件(比如几十MB的CSV文件),但对于1GB的大文件,Code Interpreter插件的性能会非常差,甚至会直接崩溃——而且Code Interpreter插件无法调用第三方数据分析工具(比如Spark、Hive),无法访问本地的数据库(比如MySQL、PostgreSQL),更无法直接生成PPT文件。

这种“缺乏工具使用意识和能力”的局限性,使得LLM无法直接用来完成现实世界中的大多数任务——因为现实世界中的大多数任务,都需要“访问外部信息”“处理本地数据”“执行代码”“调用第三方工具/API”。

局限性四:缺乏自我反思和迭代能力(Lack of Self-Reflection and Iteration Ability)

目前的主流LLM,虽然能在你明确指出它的错误之后,修改它的输出,但它们完全没有自我反思和迭代能力——也就是说,它们不会“自主”地去“复盘”自己的输出/任务完成过程,不会“自主”地去“发现”自己的错误,不会“自主”地去“总结”经验教训,更不会“自主”地去“改进”自己的输出/任务完成过程——下次遇到类似的问题,它们还是可能犯同样的错误,除非你每次都把“错误的原因”“正确的方法”“经验教训”写在上下文里。

举个现实中的例子:假设你是一个Java程序员,你正在用GPT-4帮你写符合《阿里巴巴Java开发手册》泰山版的规范代码——

  1. 第一次,你给GPT-4输入一段需求:“帮我写一个Java类,这个类的功能是‘计算两个整数的和’——类名要符合阿里巴巴Java开发手册的命名规范。”
  2. GPT-4生成了一个类名是“CalculateTwoIntSum”的类——但根据《阿里巴巴Java开发手册》泰山版的命名规范,类名应该用“大驼峰命名法(Upper Camel Case)”,而且类名应该是“名词”,不应该包含“动词”(除非是工具类,但工具类的类名应该以“Utils”或者“Helper”结尾)——所以正确的类名应该是“TwoIntSumCalculator”或者“IntCalculator”;
  3. 你指出了GPT-4的错误:“类名不符合阿里巴巴Java开发手册的命名规范——类名应该用大驼峰命名法,而且应该是名词,不应该包含动词——请你修改一下。”
  4. GPT-4修改了类名,改成了“TwoIntSumCalculator”——这次符合规范了;
  5. 第二次,你又给GPT-4输入一段需求:“帮我写一个Java类,这个类的功能是‘计算两个整数的乘积’——类名要符合阿里巴巴Java开发手册的命名规范。”
  6. GPT-4又生成了一个类名是“CalculateTwoIntProduct”的类——又犯了同样的错误!

这种“缺乏自我反思和迭代能力”的局限性,使得LLM的“复用性”和“稳定性”非常差——你每次使用它的时候,都必须把“所有的规范、所有的规则、所有的经验教训”写在上下文里,这不仅会占用大量的上下文窗口空间,而且会非常繁琐。

局限性五:缺乏环境交互能力(Lack of Environmental Interaction Ability)

目前的主流LLM,虽然能处理多模态输入(比如图片、音频、视频),但它们完全没有环境交互能力——也就是说,它们无法真正“操作”软件环境(比如打开电脑上的Word文档修改内容、点击浏览器上的按钮提交表单、执行命令行命令、访问本地的数据库),更无法真正“操作”物理环境(比如移动机器人的手臂抓取桌子上的水杯、控制无人机的飞行、打开家里的空调、调节家里的灯光亮度)。

举个现实中的例子:假设你是一个上班族,你正在用GPT-4o帮你完成“早上起床后的一系列操作”——

  1. 你给GPT-4o输入一段需求:“现在是早上7点,我刚起床——帮我打开家里的客厅灯,把空调调到26度,打开厨房的热水器,设定水温为45度,打开咖啡机,煮一杯美式咖啡,打开手机上的天气APP,查一下今天上海的天气,然后用语音播报给我听——最后生成一份今天的待办事项清单,发到我的微信上。”
  2. 即使你给GPT-4o装了所有能装的插件,它也只能“调用”天气API查一下今天上海的天气,生成一份待办事项清单——但它无法真正“打开”家里的客厅灯、“调节”空调的温度、“打开”厨房的热水器、“设定”热水器的水温、“打开”咖啡机、“煮”一杯美式咖啡、“打开”手机上的天气APP、“用语音播报”天气、“发”待办事项清单到你的微信上——因为这些操作都需要“和物理环境/软件环境进行交互”,而LLM本身没有这个能力。

这种“缺乏环境交互能力”的局限性,使得LLM无法直接用来完成“需要和环境进行交互”的任务——而现实世界中的大多数任务,都是“需要和环境进行交互”的。

1.2.3 为什么Agent是LLM的必然进化方向?——Agent能完美解决LLM的五大核心局限性

既然LLM存在这么多核心局限性,那我们怎么才能让LLM变得更强大,能直接用来解决现实世界中的大多数多步复杂任务呢?

答案就是——把LLM作为“大脑(核心决策单元)”,然后给它加上“手脚(执行器)”“眼睛/耳朵/鼻子(感知器)”“长期记忆库(向量数据库/关系型数据库/文件系统)”“工具库(外部API/本地脚本/第三方工具)”“规划模块”“反思与学习模块”“感知模块”“执行模块”——这样就组成了一个“Agent(智能体)”

接下来,我们就来看一下,Agent是怎么完美解决LLM的五大核心局限性的:

解决方案一:长期记忆库解决“缺乏长期记忆”的局限性

Agent会把“用户的历史偏好、之前的任务完成情况、常用的规范和规则、积累的经验教训”等长期信息存储在外部的“长期记忆库”里——长期记忆库可以是向量数据库(比如Pinecone、ChromaDB、Weaviate、Milvus,用来存储非结构化数据,比如自然语言文本、图片、音频、视频的向量表示),可以是关系型数据库(比如MySQL、PostgreSQL、Oracle,用来存储结构化数据,比如用户的基本信息、任务的进度信息、工具的调用记录),也可以是文件系统(比如本地的硬盘、云存储,用来存储大文件,比如PDF文档、Word文档、PPT文档、代码仓库)。

每次Agent启动或者处理新的请求的时候,它都会先从“长期记忆库”里检索出“和当前请求相关的长期信息”,然后把这些信息“拼接”到当前的“上下文窗口”里,一起喂给作为“大脑”的LLM——这样LLM就能“记住”之前和你说的所有内容,就能“了解”你的长期偏好,就能“跟踪”长期任务的进度了。

解决方案二:规划模块解决“缺乏自主规划能力”的局限性

Agent会有一个专门的“规划模块”——规划模块的作用是“把用户输入的模糊的、高层次的需求,自动拆解成明确的、低层次的、可执行的子任务;排定子任务的优先级;预留出子任务失败的备选方案”。

规划模块的实现方式有很多种——比如基于思维链(Chain-of-Thought,CoT)的规划基于思维树(Tree-of-Thought,ToT)的规划基于思维图(Graph-of-Thought,GoT)的规划基于强化学习(Reinforcement Learning,RL)的规划基于搜索算法(比如A*搜索、蒙特卡洛树搜索MCTS)的规划——其中最常用的是“基于思维链/树/图的规划”,因为这种实现方式不需要额外的训练数据,只需要用现成的LLM就能实现。

解决方案三:工具库+工具选择与调用模块解决“缺乏工具使用意识和能力”的局限性

Agent会有一个专门的“工具库”和一个专门的“工具选择与调用模块”——

  • 工具库:用来存储Agent可以使用的所有工具——工具可以是外部API(比如12306API、大众点评API、天气API、地图API),可以是本地脚本(比如Python脚本、Shell脚本、JavaScript脚本),可以是第三方工具(比如Selenium、Playwright、Spark、Hive),可以是文件读写工具,可以是命令行执行工具,可以是数据库访问工具
  • 工具选择与调用模块:用来“根据当前的子任务,自动从工具库里选择最合适的工具;生成符合工具要求的调用参数;执行工具;把工具的返回结果‘翻译’成LLM能理解的自然语言/结构化数据”。

工具选择与调用模块的实现方式也有很多种——比如基于ReAct(Reasoning + Acting,推理+行动)框架的实现基于Function Calling(OpenAI提出的一种让LLM调用函数的技术)的实现基于ToolFormer(Meta提出的一种让LLM自主学习使用工具的技术)的实现——其中最常用的是“基于ReAct框架+Function Calling的实现”,因为这种实现方式既简单又高效,而且OpenAI、Anthropic、Google等公司的主流LLM都已经原生支持Function Calling了。

解决方案四:反思与学习模块解决“缺乏自我反思和迭代能力”的局限性

Agent会有一个专门的“反思与学习模块”——反思与学习模块的作用是“每次任务完成(或者失败)之后,自主复盘整个任务完成过程;自主发现任务完成过程中存在的问题;自主总结经验教训;自主把经验教训存入长期记忆库;下次遇到类似的任务,自主从长期记忆库里检索经验教训,改进任务完成过程”。

反思与学习模块的实现方式也有很多种——比如基于Self-Refine(Meta提出的一种让LLM自我优化输出的技术)的实现基于Reflexion(普林斯顿大学提出的一种让Agent自我反思和迭代的框架)的实现基于强化学习的实现——其中最常用的是“基于Self-Refine+Reflexion的实现”,因为这种实现方式不需要额外的训练数据,只需要用现成的LLM就能实现。

解决方案五:感知器+执行器解决“缺乏环境交互能力”的局限性

Agent会有一个专门的“感知器”和一个专门的“执行器”——

  • 感知器:用来“感知”软件环境和物理环境的状态——比如对于软件环境,感知器可以是“屏幕录制工具”“键盘鼠标监听工具”“命令行输出监听工具”“API返回结果监听工具”;对于物理环境,感知器可以是“摄像头”“麦克风”“传感器(比如温度传感器、湿度传感器、光线传感器、压力传感器)”;
  • 执行器:用来“操作”软件环境和物理环境——比如对于软件环境,执行器可以是“Selenium/Playwright自动化测试工具”“命令行执行工具”“API调用工具”“文件读写工具”;对于物理环境,执行器可以是“机器人的控制系统”“无人机的飞控系统”“智能家居的控制中枢”。

1.3 亮明观点/文章目标:我们将带你从零开始,走完从GPT到Agent的完整进化之路

看到这里,你是不是已经对“从GPT到Agent的进化之路”有了一个初步的了解?是不是已经迫不及待地想深入学习一下了?

在这篇文章里,我们将带你从零开始,走完从GPT到Agent的完整进化之路——我们将:

  1. 回顾GPT系列的发展历史:从GPT-1到GPT-4o,我们将详细拆解每一代GPT的技术原理、核心改进、优缺点、应用场景;
  2. 深入理解Agent的核心概念:我们将详细解释什么是Agent、Agent的核心组成部分、Agent的分类、Agent和LLM的核心区别、Agent和传统AI的核心区别;
  3. 掌握Agent的核心技术栈:我们将详细介绍Agent开发过程中需要用到的核心技术——比如向量数据库、Function Calling、ReAct框架、思维链/树/图规划、Reflexion反思框架;
  4. 从零开始,实战开发一个Agent:我们将带你用Python+LangChain+OpenAI GPT-4 Turbo+ChromaDB+Streamlit,从零开始,实战开发一个“全自动考研政治备考Agent”——这个Agent能帮你“制定考研政治备考计划、带背考研政治知识点、自动收集你的错题、生成错题本、分析你的薄弱环节、生成针对性的强化训练题、查考研政治的实时新闻热点、生成热点分析报告”;
  5. 探讨Agent的进阶技术和最佳实践:我们将详细介绍Agent的进阶技术——比如多Agent协作(Multi-Agent System,MAS)、大模型+知识库(RAG,Retrieval-Augmented Generation,检索增强生成)、大模型+长上下文(Long Context)、大模型+代码(Code LLM);我们还将总结一些Agent开发的最佳实践和避坑指南;
  6. 展望Agent的未来发展趋势:我们将详细探讨Agent的未来发展趋势——比如通用人工智能(Artificial General Intelligence,AGI)、具身智能(Embodied AI)、多模态具身智能、个性化Agent、Agent生态系统;
  7. 提供Agent学习的资源链接:我们将提供一些Agent学习的资源链接——比如相关的论文、官方文档、开源项目、在线课程、技术博客。

读完这篇文章之后,你将:

  1. 完全理解GPT系列的发展历史和技术原理
  2. 完全理解Agent的核心概念和核心组成部分
  3. 掌握Agent开发的核心技术栈
  4. 能够独立开发一个简单但实用的Agent
  5. 了解Agent的进阶技术和最佳实践
  6. 了解Agent的未来发展趋势
  7. 拥有继续深入学习Agent的资源链接

好了,废话不多说——让我们正式开始“从GPT到Agent的进化之路”吧!


二、 基础知识/背景铺垫:从GPT的诞生到Agent的萌芽——大语言模型的早期探索

2.1 核心概念一:语言模型的发展历史——从N-gram到Transformer

在讨论GPT系列之前,我们必须先回顾一下**语言模型(Language Model,LM)**的发展历史——因为GPT系列本质上就是一种“基于Transformer架构的、自回归的、预训练的大语言模型”。

2.1.1 什么是语言模型?

首先,我们来定义一下什么是语言模型——语言模型是一种用来计算“一段文本(或者一个句子、一个单词序列)出现的概率”的数学模型

举个最简单的例子:给定一段文本“今天天气真____”,语言模型的作用就是计算“下一个单词是‘好’的概率”“下一个单词是‘热’的概率”“下一个单词是‘冷’的概率”……然后根据概率大小,选择一个(或者几个)最可能的单词输出。

用数学公式来表示的话,语言模型的目标就是计算给定单词序列 w1,w2,...,wt−1w_1, w_2, ..., w_{t-1}w1,w2,...,wt1 时,下一个单词 wtw_twt 出现的条件概率 P(wt∣w1,w2,...,wt−1)P(w_t | w_1, w_2, ..., w_{t-1})P(wtw1,w2,...,wt1) ——然后,整个单词序列 w1,w2,...,wnw_1, w_2, ..., w_nw1,w2,...,wn 出现的联合概率 P(w1,w2,...,wn)P(w_1, w_2, ..., w_n)P(w1,w2,...,wn) 就可以用**链式法则(Chain Rule)**计算出来:

P(w1,w2,...,wn)=P(w1)×P(w2∣w1)×P(w3∣w1,w2)×...×P(wn∣w1,w2,...,wn−1) P(w_1, w_2, ..., w_n) = P(w_1) \times P(w_2 | w_1) \times P(w_3 | w_1, w_2) \times ... \times P(w_n | w_1, w_2, ..., w_{n-1}) P(w1,w2,...,wn)=P(w1)×P(w2w1)×P(w3w1,w2)×...×P(wnw1,w2,...,wn1)

其中:

  • P(w1)P(w_1)P(w1) 是第一个单词 w1w_1w1 出现的概率;
  • P(w2∣w1)P(w_2 | w_1)P(w2w1) 是给定第一个单词 w1w_1w1 时,第二个单词 w2w_2w2 出现的条件概率;
  • P(w3∣w1,w2)P(w_3 | w_1, w_2)P(w3w1,w2) 是给定前两个单词 w1,w2w_1, w_2w1,w2 时,第三个单词 w3w_3w3 出现的条件概率;
  • ……
  • P(wn∣w1,w2,...,wn−1)P(w_n | w_1, w_2, ..., w_{n-1})P(wnw1,w2,...,wn1) 是给定前 n−1n-1n1 个单词 w1,w2,...,wn−1w_1, w_2, ..., w_{n-1}w1,w2,...,wn1 时,第 nnn 个单词 wnw_nwn 出现的条件概率。
2.1.2 语言模型的发展阶段一:传统统计语言模型——N-gram模型

最早的语言模型是传统统计语言模型——其中最经典、最常用的是N-gram模型

N-gram模型的核心思想

N-gram模型的核心思想非常简单——马尔可夫假设(Markov Assumption):马尔可夫假设认为,“下一个单词 wtw_twt 出现的概率,只和它前面的 N−1N-1N1 个单词有关,而和它前面的所有其他单词无关”。

用数学公式来表示的话,马尔可夫假设可以写成:

P(wt∣w1,w2,...,wt−1)≈P(wt∣wt−N+1,wt−N+2,...,wt−1) P(w_t | w_1, w_2, ..., w_{t-1}) \approx P(w_t | w_{t-N+1}, w_{t-N+2}, ..., w_{t-1}) P(wtw1,w2,...,wt1)P(wtwtN+1,wtN+2,...,wt1)

其中 NNN 是一个正整数——当 N=1N=1N=1 时,N-gram模型称为Unigram模型(一元模型);当 N=2N=2N=2 时,称为Bigram模型(二元模型);当 N=3N=3N=3 时,称为Trigram模型(三元模型);当 N>3N>3N>3 时,称为High-order N-gram模型(高阶N-gram模型)。

N-gram模型的概率计算方法

N-gram模型的概率计算方法也非常简单——最大似然估计(Maximum Likelihood Estimation,MLE):最大似然估计认为,“某个单词序列出现的概率,等于这个单词序列在训练数据中出现的次数,除以前面的 N−1N-1N1 个单词组成的单词序列在训练数据中出现的次数”。

用数学公式来表示的话,最大似然估计可以写成:

P(wt∣wt−N+1,wt−N+2,...,wt−1)=C(wt−N+1,wt−N+2,...,wt−1,wt)C(wt−N+1,wt−N+2,...,wt−1) P(w_t | w_{t-N+1}, w_{t-N+2}, ..., w_{t-1}) = \frac{C(w_{t-N+1}, w_{t-N+2}, ..., w_{t-1}, w_t)}{C(w_{t-N+1}, w_{t-N+2}, ..., w_{t-1})} P(wtwtN+1,wtN+2,...,wt1)=C(wtN+1,wtN+2,...,wt1)C(wtN+1,wtN+2,...,wt1,wt)

其中:

  • C(wt−N+1,wt−N+2,...,wt−1,wt)C(w_{t-N+1}, w_{t-N+2}, ..., w_{t-1}, w_t)C(wtN+1,wtN+2,...,wt1,wt) 是前面的 N−1N-1N1 个单词组成的单词序列加上当前单词 wtw_twt 组成的长度为 NNN 的单词序列在训练数据中出现的次数;
  • C(wt−N+1,wt−N+2,...,wt−1)C(w_{t-N+1}, w_{t-N+2}, ..., w_{t-1})C(wtN+1,wtN+2,...,wt1) 是前面的 N−1N-1N1 个单词组成的单词序列在训练数据中出现的次数。

举个简单的例子:假设我们的训练数据是一段很小的文本——“今天天气真好,今天天气真热,今天天气真糟糕”——我们用Bigram模型(N=2N=2N=2)来计算“给定单词‘真’时,下一个单词是‘好’的概率”:

  1. 首先,我们统计一下“真,好”这个长度为2的单词序列在训练数据中出现的次数——C(真,好)=1C(真, 好) = 1C(,)=1
  2. 然后,我们统计一下“真”这个单词在训练数据中出现的次数——C(真)=3C(真) = 3C()=3
  3. 最后,我们用最大似然估计计算概率——P(好∣真)=13≈0.333P(好 | 真) = \frac{1}{3} \approx 0.333P()=310.333
N-gram模型的优缺点

N-gram模型的优点非常明显——简单、易实现、计算速度快——在深度学习兴起之前,N-gram模型是自然语言处理(Natural Language Processing,NLP)领域最常用的语言模型,广泛应用于语音识别、机器翻译、文本生成、拼写检查等任务。

但N-gram模型的缺点也非常明显——而且这些缺点是致命的

  1. 数据稀疏问题(Data Sparsity Problem):随着 NNN 的增大,长度为 NNN 的单词序列的数量会呈指数级增长——而训练数据的规模总是有限的——所以大多数长度为 NNN 的单词序列在训练数据中都不会出现——它们的计数 CCC 就会是0——它们的概率 PPP 就会是0——这就是“数据稀疏问题”。比如,在一个包含100万个单词的训练数据中,Unigram模型的单词数量可能是10万个,Bigram模型的单词序列数量可能是100万个,Trigram模型的单词序列数量可能是1000万个,而4-gram模型的单词序列数量可能是1亿个——但训练数据中只有999,999个长度为4的单词序列——所以大多数4-gram的概率都是0。为了解决数据稀疏问题,研究人员提出了很多平滑技术(Smoothing Techniques)——比如拉普拉斯平滑(Laplace Smoothing)、古德-图灵平滑(Good-Turing Smoothing)、Kneser-Ney平滑(Kneser-Ney Smoothing)——但这些平滑技术只能缓解数据稀疏问题,不能从根本上解决它;
  2. 无法捕捉长距离依赖关系(Long-Range Dependencies):由于马尔可夫假设的限制,N-gram模型只能捕捉“当前单词和它前面的 N−1N-1N1 个单词之间的依赖关系”——无法捕捉“当前单词和它前面的更远的单词之间的依赖关系”——但在现实世界的自然语言中,长距离依赖关系是非常常见的。比如,在句子“虽然今天天气真____,但我还是要去爬山”中,横线处的单词不仅和它前面的“真”有关,还和它前面的“虽然”以及后面的“但我还是要去爬山”有关——但如果我们用Trigram模型(N=3N=3N=3),我们只能捕捉到横线处的单词和“今天”“天气”“真”之间的依赖关系,无法捕捉到它和“虽然”“但我还是要去爬山”之间的依赖关系;
  3. 无法捕捉单词的语义信息(Semantic Information):N-gram模型只能“记住”单词序列在训练数据中出现的次数——无法“理解”单词的语义信息——比如,“好”和“棒”是两个语义相近的单词,但在N-gram模型中,它们是两个完全不同的单词——“真,好”和“真,棒”是两个完全不同的单词序列——如果训练数据中“真,好”出现的次数很多,但“真,棒”出现的次数很少,那么N-gram模型会认为“给定单词‘真’时,下一个单词是‘好’的概率很高,但下一个单词是‘棒’的概率很低”——但实际上,这两个概率应该是差不多的;
  4. 模型规模受限:由于数据稀疏问题的限制,NNN 的取值不能太大——一般来说,NNN 的取值最多是5——所以N-gram模型的规模非常受限——无法捕捉到自然语言中的复杂依赖关系和语义信息。
2.1.3 语言模型的发展阶段二:神经网络语言模型——从前馈神经网络语言模型到循环神经网络语言模型

随着深度学习(Deep Learning)的兴起,研究人员开始尝试用神经网络(Neural Network)来构建语言模型——这就是神经网络语言模型(Neural Network Language Model,NNLM)

神经网络语言模型的出现,从根本上解决了N-gram模型的大部分缺点——比如数据稀疏问题、无法捕捉单词的语义信息问题、模型规模受限问题——但早期的神经网络语言模型(比如前馈神经网络语言模型、循环神经网络语言模型)依然存在一些缺点——比如无法很好地捕捉长距离依赖关系问题。

接下来,我们就来简要介绍一下几种经典的神经网络语言模型:

神经网络语言模型的先驱:前馈神经网络语言模型(Feedforward Neural Network Language Model,FFNNLM)

前馈神经网络语言模型是由Yoshua Bengio等人在2003年发表的论文《A Neural Probabilistic Language Model》中提出的——这是第一篇用神经网络来构建语言模型的论文——具有划时代的意义。

FFNNLM的核心思想

FFNNLM的核心思想是:

  1. 用分布式表示(Distributed Representation)来表示单词——也就是我们常说的**词向量(Word Embedding)
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐