
【2025版】最新全面认识AI Agent,一文读懂AI智能体的架构指南,零基础入门到精通,收藏这篇就够了
AI Agent,或称为人工智能代理,我更愿意称为AI智能体。它是一种模拟人类智能行为的人工智能系统,以大型语言模型(LLM)作为其核心引擎。它们能够感知其环境,做出决策,并执行任务以实现特定的目标。AI Agent的设计理念是赋予机器自主性、适应性和交互性,使其能够在复杂多变的环境中独立运作。本文全面探讨了AI Agent的基本概念、类型、架构和关键技术对比。AI Agent作为人工智能领域的活
文章目录:
-
AI Agent概述
-
AI Agent的架构
-
AI Agent与相关技术的比较
-
AI Agent框架和平台
-
总结与未来展望
AI Agent概述
1.1 定义AI Agent
AI Agent,或称为人工智能代理,我更愿意称为AI智能体。它是一种模拟人类智能行为的人工智能系统,以大型语言模型(LLM)作为其核心引擎。它们能够感知其环境,做出决策,并执行任务以实现特定的目标。AI Agent的设计理念是赋予机器自主性、适应性和交互性,使其能够在复杂多变的环境中独立运作。
1.2 AI Agent的应用领域
AI Agent技术已广泛应用于多个领域,包括但不限于:
-
客户服务(Customer Service):自动回答客户咨询,提供个性化服务。
-
医疗诊断(Medical Diagnosis):辅助医生进行疾病诊断和治疗方案推荐。
-
股市交易(Stock Trading):自动化交易系统,根据市场数据做出买卖决策。
-
智能交通(Intelligent Transportation):自动驾驶车辆和交通管理系统。
-
教育辅导(Educational Tutoring):个性化学习助手,根据学生的学习进度提供辅导。
1.3 AI Agent的重要性
AI Agent的重要性在于其能够提高效率、降低成本、增强用户体验,并在某些情况下提供超越人类能力的决策支持。随着技术的发展,AI Agent正逐渐成为现代社会不可或缺的一部分。
二
AI Agent的架构
2.1 精简架构:Agent的决策流程
AI Agent的决策流程可以精简为三个基本步骤:感知(Perception)、规划(Planning)和行动(Action),简称为PPA模型。这个模型是Agent智能行为的骨架,支撑着其与环境的交互和自主决策。
-
感知(Perception):Agent通过感知系统从环境中收集信息,这些信息可以是文本、图像、声音等多种形式。感知是Agent理解周遭世界的第一道工序。
-
规划(Planning):在收集到信息后,Agent需要一个规划系统来确定如何达到目标。这个过程涉及到决策制定,将复杂任务分解为可执行的子任务。
-
行动(Action):最后,Agent根据规划的结果执行行动。这些行动可能是物理的,如机器人的移动,也可能是虚拟的,如软件系统的数据处理。
在一个理想的AI Agent架构中,Agent与环境的交互是双向的、动态的,并且是连续的。这种交互模式可以类比于人类与物理世界的互动。正如人类通过感知来理解世界,AI Agent通过其感知系统收集关于外部环境的数据。这些数据不仅包括直接的观察结果,还可能涉及通过传感器、数据输入或其他方式获得的信息。
AI Agent内部,它利用这些感知数据,以支持复杂的Planning、决策和行动。因此,记忆对于AI Agent而言,是一种使其能够跨越时间累积经验、学习教训并优化决策的关键能力。
2.2 记忆的基础知识
在深入Agent架构之前,我们首先需要了解记忆的基础知识。记忆是大脑存储、保留和检索信息的能力。
-
感觉记忆(Sensory Memory):这是记忆的最初阶段,负责临时存储通过感官接收到的信息(视觉、听觉等)的印象的能力。感觉记忆通常只持续几秒钟
-
短期记忆(Short-Term Memory, STM):也称为工作记忆,它储存我们当前意识到的信息,以执行复杂的认知任务,如学习和推理。短期记忆被认为有大约7个项目的容量(Miller 1956)并持续20-30秒。。
-
长期记忆(Long-Term Memory, LTM):长期记忆负责存储可长期保留的信息。长期记忆可以储存信息很长一段时间,从几天到几十年,其储存容量基本上是无限的。
2.3 记忆机制:Agent的知识库
如果AI Agent想要实现智能化,Agent的记忆机制便是其学习和决策过程中不可或缺的一部分。在AI Agent的实际制作与应用中,借鉴人类的记忆机制,Agent的记忆可以被分为以下几类:
-
感觉记忆(Sensory Memory):对应于Agent接收到原始感官输入的初步处理,通常时间短暂。
-
短期记忆(Short-Term Memory):用于存储当前会话或任务中的信息,这些信息对于完成手头任务至关重要,但任务完成后通常不再保留。
-
长期记忆(Long-Term Memory):用于存储需要长期保留的信息,如用户偏好、历史交互等。长期记忆通常存储在外部数据库中,并通过快速检索机制供Agent使用。
2.4 完整的Agent架构
AI Agent的架构设计可以有多种方式,不同的研究者和开发者可能会根据特定的应用场景和需求,设计出不同的架构。
MeoAI更倾向的一个完整AI Agent架构,包括以下关键组件:
1)感知(Perception)
定义:感知是Agent与外部世界交互的接口,负责收集和解析环境数据。
例子:在自动驾驶车辆中,感知系统可能包括雷达、摄像头和传感器,它们持续监测周围环境,识别交通标志、行人和其他车辆。
2)规划(Planning)
定义:规划是Agent的决策中心,它将目标分解为可执行的步骤,并制定实现目标的策略。
例子:一个项目管理AI Agent,根据项目截止日期和资源分配,创建任务列表和时间表,为团队成员分配具体工作。
3)记忆(Memory)
定义:分为短期和长期记忆,记忆系统允许Agent存储和检索信息,支持学习和长期知识积累,为Agent提供信息存储和检索的能力。
例子:
短期记忆:一个在线客服AI,在对话中记住用户的问题和偏好,以提供即时的个性化服务。
长期记忆:一个科研AI Agent,存储先前研究的数据和结果,在新项目中利用这些信息加速发现过程
4)工具使用(Tools Use)
定义:工具使用是Agent利用外部资源或工具来增强其感知、决策和行动能力的过程。这些工具可以是API、软件库、硬件设备或其他服务。
例子:一个数据分析AI Agent,使用外部API获取实时股市数据,或调用机器学习模型进行预测分析。
5)行动(Action)
定义:行动是Agent执行任务和与环境交互的具体实施者。基于规划和记忆执行的具体动作,是Agent对于环境的响应和任务的完成
例子:一个智能家居控制系统,根据分析得到的具体执行计划,自动调节家中的照明、温度和安全系统。
2.5 完整的Agent架构实例
我们以一个虚拟个人助理AI Agent,其架构组件协同工作的例子:
-
感知:助理通过语音识别感知用户的口头指令。
-
规划:根据用户请求,规划系统决定需要执行的任务,如预订餐厅或安排会议。
-
记忆:短期记忆帮助Assistant记住对话中的临时信息,长期记忆提供用户偏好和历史交互记录。
-
工具使用:Assistant调用日历API来查找可用时间,使用地图API推荐餐厅。
-
行动:最终,Assistant执行预订操作,并向用户确认细节。
2.6 大型语言模型(LLM)
大型语言模型(LLM)可以在多个部分发挥作用,但它们尤其与以下几个方面紧密相关:
-
感知(Perception):LLM可以用于处理和解析感知数据,尤其是在处理自然语言或文本信息时。例如,如果感知系统收集到的数据是文本形式的用户反馈或指令,LLM可以用来理解这些文本的含义。
-
规划(Planning):LLM在规划阶段非常有用,特别是在需要自然语言处理来理解复杂任务和生成行动计划的情况下。LLM可以帮助Agent将高级目标转化为具体的步骤或策略。
-
记忆(Memory):对于短期记忆,LLM可以用来生成对先前交互的摘要或关键点,帮助Agent在对话中保持上下文连贯性。对于长期记忆,LLM可以辅助检索和分析存储在数据库中的信息,尤其是在信息以文本形式存在时。
-
工具使用(Tools Use):LLM可以与外部API和工具结合使用,以增强Agent的能力。例如,LLM可以生成查询请求,然后使用API获取所需信息,或者分析从API返回的数据。
-
行动(Action):在行动阶段,LLM可以用来生成执行任务所需的自然语言指令,或者解释Agent的决策过程,提供透明度。
-
交互和沟通(Interaction and Communication):LLM的一个关键应用是在Agent与用户或其他Agent的交互中。LLM可以处理和生成自然语言,使得交互更加流畅和人性化。
-
反思和学习(Reflection and Learning):LLM可以用于分析Agent的行为和决策结果,帮助Agent从经验中学习。例如,通过分析交互日志,LLM可以识别改进的领域或提供反馈给Agent。
-
生成性任务(Generative Tasks):在需要创造性输出的任务中,如内容创作、代码生成或策略制定,LLM可以提供创新的解决方案。
总的来说,LLM在AI Agent架构中扮演着处理和生成自然语言的核心角色,它通过增强Agent的理解和表达能力,使得Agent能够更有效地与环境和用户进行交互。
2.7 结论
AI Agent的架构是一个综合了感知、规划、记忆和行动的复杂系统。通过不断的学习和环境交互,Agent能够提高其性能并适应多变的任务需求。记忆机制的引入,尤其是长期记忆的外部存储和快速检索,为Agent提供了处理复杂任务和长期学习的基础。
三
AI Agent与相关技术的比较
AI Agent是人工智能领域的一个重要分支,但它们并不是孤立存在的。本章将探讨AI Agent与其他几种技术的比较,以明确它们各自的特点和应用场景。
3.1 AI Agent与机器人
定义与区别:
-
机器人通常指的是具有物理实体的智能系统,它们可以是自动化机械臂或服务机器人等。
-
AI Agent则主要指软件智能系统,它们运行在服务器或云平台上,不具有物理形态。
例子:一个工业机器人在生产线上执行精确的物理任务,而一个AI Agent可能负责监控这些机器人的性能,并优化生产流程。
3.2 AI Agent与专家系统
定义与区别:
-
专家系统是基于一套固定规则运行的系统,它们通常用于解决特定领域的问题,如医疗诊断或故障排除。
-
AI Agent则具备自学习和适应性,它们可以通过机器学习不断优化自己的行为和决策。
例子:一个专家系统可能用于诊断特定类型的疾病,而一个AI Agent可能通过分析大量医疗记录来发现新的诊断模式。
3.3 AI Agent与Retrieval-Augmented Generation (RAG)
定义与区别:
-
RAG是一种结合了检索和生成的模型,它能够从大量数据中检索相关信息,并结合这些信息生成回答或解决方案。
-
AI Agent可以集成RAG模型,以增强其处理复杂查询和生成创造性内容的能力。
例子:在一个问答系统中,AI Agent使用RAG来从互联网上检索信息,并结合这些信息为用户提供详细、准确的答案。
3.4 AI Agent与Large Language Models (LLM)
定义与区别:
-
大型语言模型(LLM)是能够理解和生成自然语言文本的复杂模型,它们通常需要大量的数据来训练。
-
AI Agent可以利用LLM来处理与语言相关的任务,但AI Agent的范围更广,包括规划、决策和交互等。
例子:一个AI Agent可能使用LLM来理解用户的自然语言指令,并将其转化为行动计划,同时使用其他能力来执行这些计划。
3.5 结论
通过比较,我们可以看到AI Agent与机器人、专家系统、RAG和LLM等技术各有特点和应用领域。AI Agent的灵活性和自适应性使它们能够集成和利用这些技术,以实现更广泛的应用和更高级的智能行为。
四
AI Agent框架和平台
目前,AI Agent框架和构建AI智能体的平台正在快速发展,提供了多样化的工具和环境,使开发者能够创建复杂的智能系统。以下是一些当前流行的AI Agent框架和平台的介绍:
4.1 AI Agent框架
AutoGPT:
AutoGPT是一个基于GPT(生成式预训练转换器)的自主智能体框架,它可以执行复杂的任务,如网页浏览、文件读写和执行Python脚本。
GPT-Engineer:
GPT-Engineer是一个项目,旨在创建一个能够理解自然语言指令并生成代码的AI系统,辅助软件开发过程。
LangChain:
LangChain是一个为构建AI智能体提供的工具链,它集成了多种语言模型和工具,支持复杂的任务自动化。
HuggingGPT:
HuggingGPT是一个框架,使用ChatGPT作为任务规划器,选择HuggingFace平台上的模型,并根据执行结果总结响应。
4.2 构建AI智能体的平台
Coze:它可能会提供用户友好的界面和工具,使非技术用户也能构建和训练自己的AI智能体。
HuggingFace:HuggingFace提供了一个平台,拥有大量的预训练模型和工具,支持开发者构建和部署NLP应用。
OpenAI API:OpenAI提供了一系列的API,允许开发者将强大的语言模型和其他AI功能集成到自己的应用程序中。
Google Cloud AI Platform:Google Cloud AI Platform提供了一系列机器学习服务,包括构建、训练和部署AI模型的工具。
豆包: 字节跳动公司基于云雀模型开发的综合性 AI 智能体平台,它支持网页端、iOS 以及安卓平台,能提供聊天机器人、写作助手、英语学习助手等功能,并允许用户创建自己的智能体。
五
总结与未来展望
5.1 总结
本文全面探讨了AI Agent的基本概念、类型、架构和关键技术对比。AI Agent作为人工智能领域的活跃分支,已经展现出其在多个行业中的实用性和变革潜力。从聊天机器人到复杂的自动化服务,AI Agent正在逐步改变我们的工作和生活方式。
5.2 技术成就
AI Agent的发展得益于机器学习、自然语言处理、知识表示与推理等关键技术的进步。这些技术使AI Agent能够更准确地感知环境、更有效地做出决策,并以更自然的方式与人类交流。
5.3 应用领域
AI Agent的应用范围已经从单一的客服和助手角色,扩展到了医疗、教育、金融、交通等多个领域。它们在提供个性化服务、优化业务流程、增强决策支持等方面发挥着重要作用。
5.4 面临的挑战
尽管AI Agent的发展前景广阔,但它们也面临着技术、伦理、法规等方面的挑战。确保AI Agent的安全性、隐私保护、透明度和公平性是行业发展的重要课题。
5.5 未来展望
展望未来,AI Agent预计将在以下几个方面取得进一步的发展:
-
更深层次的集成:AI Agent将更深入地与各行各业的业务流程集成,提供更加定制化的解决方案。
-
更高的自主性:随着技术的发展,AI Agent将展现出更高的自主决策能力,能够独立处理更复杂的任务。
-
更广泛的协作:AI Agent将与人类以及其他AI系统更紧密地协作,共同解决更加复杂的问题。
-
更强的伦理意识:AI Agent的设计和应用将更加注重伦理和可解释性,确保技术的发展符合社会价值和规范。
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
随着大模型的快速发展,目前出现了各种各样的大模型,如OpenAI的GPT模型、Meta的Llama模型、百度的文心一言模型、科大讯飞的讯飞星火模型、百川的Baichuan-13B,阿里的Qwen-14B和Qwen-72B、清华的GLM。
本文将介绍如何部署大模型,包括环境安装和模型加载,并分享一些低成本的部署技巧,让读者可以在个人电脑上运行大模型。
本文的重点是如何通过有监督微调,构建自己的大模型,让大模型能够适应您的使用场景,发挥最大的价值。
一、选择基座模型
在大模型应用中,选择一款合适的基座模型非常关键,它要求既能达到优秀的效果,又能降低部署的成本。这样就可以方便地在私有数据上进行微调,并且实现低成本的部署。
根据开源评测平台OpenCompass的数据,目前综合能力最好的10个开源基座模型如表1-1所示。从表中可以看出,排名第一的是清华大学于2023年10月发布的60亿参数的大模型ChatGLM3-6B。它在前10名中参数量最少,但是效果最佳,是选择基座模型的最佳候选。
表1-1 开源大模型(基座)评测排名(数据来源自OpenCompass)
模型 | 发布时间 | 所属机构 | 参数量 | 综合得分 |
---|---|---|---|---|
ChatGLM3-6B | 2023/10/27 | 清华大学 | 6B | 65.3 |
Qwen-14B | 2023/9/25 | 阿里巴巴 | 14B | 62.4 |
XunYuan-70B | 2023/9/22 | 度小满 | 70B | 60.0 |
InternLM-20B | 2023/9/20 | 商汤科技 | 20B | 59.3 |
LLaMA-2-70B | 2023/7/19 | Meta | 70B | 57.4 |
TigerBot-70B-Base-V1 | 2023/9/6 | 虎博科技 | 70B | 55.7 |
Qwen-7B | 2023/9/25 | 阿里巴巴 | 7B | 55.2 |
LLaMA-65B | 2023/2/24 | Meta | 65B | 51.9 |
Mistral-7B-v0.1 | 2023/9/27 | Mistral AI | 7B | 51.2 |
TigerBot-13B-Base-V1 | 2023/8/8 | 虎博科技 | 13B | 50.3 |
1.1 环境安装
ChatGLM3是由智谱AI和清华大学KEG实验室联合发布的新一代对话预训练模型,其中ChatGLM3-6B是开源的对话模型,具有以下特性。
-
更强大的基础模型:ChatGLM3-6B基于ChatGLM3-6B-Base进行微调,后者使用了更多样的训练数据、更充分的训练步数和更合理的训练策略。在不同角度的数据集上测评显示,ChatGLM3-6B-Base在10B以下的基础模型中表现最优。
-
更完整的功能支持:ChatGLM3-6B采用了全新设计的 提示(Prompt) 格式,除了支持多轮对话外,还支持工具调用、代码执行等复杂场景。
-
更全面的开源序列:除了对话模型ChatGLM3-6B外,还开源了基础模型ChatGLM3-6B-Base、长文本对话模型ChatGLM3-6B-32K。
为了使用ChatGLM3-6B作为基座模型,首先需要安装环境,可以从gitHub上克隆代码仓库,然后使用pip安装依赖。
git clone https://github.com/THUDM/ChatGLM3
cd ChatGLM3
pip install -r requirements.txt
其中transformers库版本推荐为4.30.2,torch推荐使用2.0及以上的版本,以获得最佳的推理性能。
1.2 模型加载
要想加载 ChatGLM3-6B 模型,有多种方式可以选择,例如代码调用、网页版、命令行、工具调用等。下面先来看看如何通过代码调用的方式加载模型。
代码调用
可以使用下面的方式生成对话,只需调用ChatGLM3-6B模型即可,无须手动下载模型实现和参数,transformers会自动完成这些工作。
from transformers import AutoTokenizer, AutoModel
tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm3-6b", trust_remote_code=True)
model = AutoModel.from_pretrained(
"THUDM/chatglm3-6b", trust_remote_code=True, device='cuda')
model = model.eval()
response, history = model.chat(tokenizer, "你好", history=[])
print(response)
你好 !我是人工智能助手 ChatGLM3-6B,很高兴见到你,欢迎问我任何问题。
response, history = model.chat(tokenizer, "晚上睡不着应该怎么办", history=history)
print(response)
晚上睡不着可能会让你感到焦虑或不舒服,但以下是一些可以帮助你入睡的方法:
1. 制定规律的睡眠时间表:保持规律的睡眠时间表可以帮助你建立健康的睡眠习惯,使你更容易入睡。尽量在每天的相同时间上床,并在同一时间起床。
2. 创造一个舒适的睡眠环境:确保睡眠环境舒适,安静,黑暗且温度适宜。可以使用舒适的床上用品,并保持房间通风。
3. 放松身心:在睡前做些放松的活动,例如泡个热水澡,听些轻柔的音乐,阅读一些有趣的书籍等,有助于缓解紧张和焦虑,使你更容易入睡。
4. 避免饮用含有咖啡因的饮料:咖啡因是一种刺激性物质,会影响你的睡眠质量。尽量避免在睡前饮用含有咖啡因的饮料,例如咖啡,茶和可乐。
5. 避免在床上做与睡眠无关的事情:在床上做些与睡眠无关的事情,例如看电影,玩游戏或工作等,可能会干扰你的睡眠。
6. 尝试呼吸技巧:深呼吸是一种放松技巧,可以帮助你缓解紧张和焦虑,使你更容易入睡。试着慢慢吸气,保持几秒钟,然后缓慢呼气。
如果这些方法无法帮助你入睡,你可以考虑咨询医生或睡眠专家,寻求进一步的建议
完整的模型实现在Hugging Face Hub。如果你的网络环境较差,下载模型参数可能会花费较长时间甚至失败。此时可以先将模型下载到本地,然后从本地加载。从 Hugging Face Hub下载模型需要先安装Git LFS。
网页版示例
您可以通过下面的命令,启动一个基于Gradio的网页版示例。
python web_demo.py
当ChatGLM3-6B模型成功启动,您就可以在网页上看到图1-1所示的界面,并开始与模型对话。
图1-1 基于Gradio启动ChatGLM3-6B
除了上面的方式外,还可以通过下面的命令,启动一个基于Streamlit的网页版示例。
streamlit run web_demo2.py
模型启动成功后,您可以在网页上看到图1-2显示的界面。您可以在左边的区域调整模型的参数,也可以在中间的区域和ChatGLM3-6B进行自由对话。
图1-2 基于Streamlit启动ChatGLM3-6B
命令行示例
运行下面代码,程序会在命令行中进行交互式的对话,在命令行中输入指示并回车即可生成回复,输入clear可以清空对话历史,输入stop终止程序。
python cli_demo.py
模型启动成功后,您可以在命令行看到如图1-3所示的界面。
图1-3 基于命令行启动ChatGLM3-6B
二、低成本部署
前面介绍了多种模型加载的方式,包括网页版和命令行版。但是这些方式都需要高性能的GPU,对于普通用户来说,不太方便。因此,下面介绍如何低成本地部署ChatGLM3-6B,让更多用户能够体验它。
2.1 模型量化
模型默认以FP16精度加载,需要约13GB的显存。如果您的GPU显存不足,您可以选择以量化方式加载模型,具体方法如下。
model = AutoModel.from_pretrained("THUDM/chatglm3-6b",trust_remote_code=True).quantize(4)
量化会降低一些模型的性能,但是测试结果表明,ChatGLM3-6B 在 4-比特量化下仍然能够生成自然流畅的对话。
2.2 CPU部署
您也可以在CPU上运行模型,但是推理速度会慢很多。具体方法如下(需要至少32GB 的内存)。
model = AutoModel.from_pretrained("THUDM/chatglm3-6b", trust_remote_code=True).float()
2.3 Mac部署
如果您的Mac使用了Apple Silicon或AMD GPU,您可以使用MPS后端在GPU上运行 ChatGLM3-6B。您需要按照Apple的官方说明安装PyTorch-Nightly(请注意版本号应该是 2.x.x.dev2023xxxx,而不是 2.x.x)。目前MacOS上只支持从本地加载模型。
model = AutoModel.from_pretrained("your local path", trust_remote_code=True).to('mps')
加载半精度的 ChatGLM3-6B 模型需要约 13GB 的内存。如果您的机器内存较小(比如 16GB 的 MacBook Pro),在内存不足时会使用硬盘上的虚拟内存,这会导致推理速度大幅降低。
2.4 多卡部署
如果您有多张GPU,但是每张GPU的显存都不够加载完整的模型,您可以使用模型并行的方式,将模型分配到多张GPU上。您需要先安装accelerate: pip install accelerate。这样,您就可以在两张GPU上运行模型了。您可以根据您的需要,修改num_gpus参数来指定使用的GPU数量。默认情况下,模型会平均分配到各个GPU上,您也可以通过device_map参数来自定义分配方式。
from utils import load_model_on_gpus
model = load_model_on_gpus("THUDM/chatglm3-6b", num_gpus=2)
三、构建自己的大模型
在了解了如何部署模型的方法后,接下来使用自己的数据,对大模型进行微调,赋予它新的能力。
以广告词生成为例,下面介绍如何对大模型进行微调,让它生成更符合要求的广告词。由于ChatGLM3-6B的微调代码尚未开源,因此无法直接使用它,但是可以参考ChatGLM2-6B和ChatGLM-6B的微调代码,只需修改相应的模型路径和参数即可。
在微调之前,先来看看ChatGLM3-6B在没有微调的情况下,生成广告词的效果,如图3-1所示。从图中可以看出,生成的广告词过长,不够简洁,而且结尾都是“快来抢购这款…,让您的时尚之路更加精彩!”,格式单一,缺乏创意。为了改善这一问题,接下来选择ADGEN数据集,对模型进行微调。
图3-1 ChatGLM3-6B根据输入生成广告词
3.1 数据准备
首先下载ADGEN数据集,这是一个用于生成广告文案的数据集。它的任务是根据输入的商品信息(content)生成一段吸引人的广告词(summary)。您可以从Google Drive或者Tsinghua Cloud下载预处理好的ADGEN数据集,并将解压后的AdvertiseGen文件夹放到当前目录下。把AdvertiseGen文件夹里的数据分成训练集和验证集,分别保存为train.json和dev.json文件,数据的格式如图3-2所示。
图3-2 广告词数据集数据格式
例如,输入“类型#上衣版型#宽松版型#显瘦图案#线条衣样式#衬衫衣袖型#泡泡袖衣款式#抽绳”,输出为“这件衬衫的款式非常的宽松,利落的线条可以很好的隐藏身材上的小缺点,穿在身上有着很好的显瘦效果。领口装饰了一个可爱的抽绳,漂亮的绳结展现出了十足的个性,配合时尚的泡泡袖型,尽显女性甜美可爱的气息。”
3.2 有监督微调
如果想有监督微调ChatGLM3-6B,您需要自己写一套代码,因为它的微调代码还没有公开。不过,我们也可以借鉴ChatGLM2-6B的微调代码,它已经开源了,只需要调整一些细节就行。您可以先从网上下载ChatGLM2-6B的代码。
下载好ChatGLM2-6B的代码后,需要把有监督微调的代码文件复制到ChatGLM3-6B的文件夹里。然后,把前面准备好的数据集也复制到ChatGLM3-6B的有监督微调文件夹里。
cp -r ChatGLM2-6B/ptuning ChatGLM3-6B/
cp –r AdvertiseGen ChatGLM3-6B/ptuning/
要进行全参数微调,您需要先安装deepspeed,还需要安装一些有监督微调需要的包。
pip install deepspeed
cd ptuning
pip install rouge_chinese nltk jieba datasets
准备好微调代码的环境后,还要修改一些微调代码的参数。
vim ds_train_finetune.sh
LR=1e-5
MASTER_PORT=$(shuf -n 1 -i 10000-65535)
deepspeed --num_gpus=8 --master_port $MASTER_PORT main.py \
--deepspeed deepspeed.json \
--do_train \
--preprocessing_num_workers 32 \
--train_file AdvertiseGen/train.json \
--test_file AdvertiseGen/dev.json \
--prompt_column content \
--response_column summary \
--model_name_or_path ../models/chatglm3-6b \
--output_dir output/adgen-chatglm3-6b-ft \
--overwrite_output_dir \
--max_source_length 512 \
--max_target_length 512 \
--per_device_train_batch_size 16 \
--per_device_eval_batch_size 1 \
--gradient_accumulation_steps 1 \
--predict_with_generate \
--logging_steps 10 \
--save_steps 1000 \
--learning_rate $LR \
--fp16
上面代码中的参数含义在表3-1中给出,您可以根据具体的任务和硬件环境进行调整。
参数 | 参数含义 |
---|---|
num_gpus | 使用的GPU数量 |
deepspeed | deepspeed的配置文件 |
preprocessing_num_workers | 数据预处理的线程数量 |
train_file | 训练数据文件的路径 |
test_file | 测试数据文件的路径 |
prompt_column | 输入列的名称 |
response_column | 输出列的名称 |
model_name_or_path | 模型名称或路径 |
output_dir | 输出模型参数的文件路径 |
max_source_length | 最大输入长度 |
max_target_length | 最大输出长度 |
per_device_train_batch_size | 每个设备的训练批次大小 |
per_device_eval_batch_size | 每个设备的评估批次大小 |
gradient_accumulation_steps | 梯度累计 步数 |
predict_with_generate | 是否使用生成模式进行预测 |
logging_steps | 记录日志的步数 |
save_steps | 保存模型的步数 |
learning_rate | 学习率 |
fp16 | 是否使用半精度浮点数进行训练 |
接下来需要调整main.py文件中的num_train_epoch参数(默认为3),该参数表示训练的轮数。
vim main.py
log_level = training_args.get_process_log_level()
logger.setLevel(log_level)
# datasets.utils.logging.set_verbosity(log_level)
transformers.utils.logging.set_verbosity(log_level)
transformers.utils.logging.enable_default_handler()
transformers.utils.logging.enable_explicit_format()
# Log on each process the small summary:
training_args.num_train_epochs = 1
logger.info(f"Training/evaluation parameters {training_args}")
目前已经完成了训练数据的准备和代码的修改,接下来运行代码来开始微调模型。
bash ds_train_finetune.sh
当运行代码时,会遇到一个错误,提示:ChatGLMTokenizer类没有build_prompt方法。这是因为ChatGLM3-6B的ChatGLMTokenizer类没有实现这个方法。要解决这个问题,您可以参考ChatGLM2-6B中ChatGLMTokenizer类的build_prompt方法,按照相同的逻辑编写代码。
vim ../models/chatglm3-6b/tokenization_chatglm.py
# 在ChatGLMTokenizer类中实现build_prompt方法
def build_prompt(self, query, history=None):
if history is None:
history = []
prompt = ""
for i, (old_query, response) in enumerate(history):
prompt += "[Round {}]\n\n问:{}\n\n答:{}\n\n".format(
i + 1, old_query, response)
prompt += "[Round {}]\n\n问:{}\n\n答:".format(len(history) + 1, query)
return prompt
在Tokenizer类中添加了build_prompt方法的代码后,程序就可以正常运行了。
我们可以使用命令watch -n 1 nvidia-smi来监控GPU的使用情况。这个命令会每分钟刷新一次程序界面,显示GPU的使用率、显存的占用率和功耗等信息。图3-3展示了一个程序界面的截图。从图中可以看出,GPU使用率已经接近100%,显存占用约为57409MiB。这说明还有一些空间可以增加训练的批量大小或者输入输出的长度,以提高训练效率。
图3-3 微调过程中GPU使用情况
模型微调完成后,./output/adgen-chatglm3-6b-ft目录下会生成相应的文件,包含了模型的参数文件和各种配置文件,具体内容如下所示。以pytorch_model开头的文件是模型的参数文件。
tree ./output/adgen-chatglm3-6b-ft
├── all_results.json
├── checkpoint-1000
│ ├── config.json
│ ├── configuration_chatglm.py
│ ├── generation_config.json
│ ├── global_step1000
│ │ ├── mp_rank_00_model_states.pt
│ │ ├── zero_pp_rank_0_mp_rank_00_optim_states.pt
│ │ ├── zero_pp_rank_1_mp_rank_00_optim_states.pt
│ │ ├── zero_pp_rank_2_mp_rank_00_optim_states.pt
│ │ ├── zero_pp_rank_3_mp_rank_00_optim_states.pt
│ │ ├── zero_pp_rank_4_mp_rank_00_optim_states.pt
│ │ ├── zero_pp_rank_5_mp_rank_00_optim_states.pt
│ │ ├── zero_pp_rank_6_mp_rank_00_optim_states.pt
│ │ └── zero_pp_rank_7_mp_rank_00_optim_states.pt
│ ├── ice_text.model
│ ├── latest
│ ├── modeling_chatglm.py
│ ├── pytorch_model-00001-of-00002.bin
│ ├── pytorch_model-00002-of-00002.bin
│ ├── pytorch_model.bin.index.json
│ ├── quantization.py
│ ├── rng_state_0.pth
│ ├── rng_state_1.pth
│ ├── rng_state_2.pth
│ ├── rng_state_3.pth
│ ├── rng_state_4.pth
│ ├── rng_state_5.pth
│ ├── rng_state_6.pth
│ ├── rng_state_7.pth
│ ├── special_tokens_map.json
│ ├── tokenization_chatglm.py
│ ├── tokenizer_config.json
│ ├── trainer_state.json
│ ├── training_args.bin
│ └── zero_to_fp32.py
├── trainer_state.json
└── train_results.json
训练过程中,可以观察到每次迭代的时间,例如:[4:28:37<4:40:51, 6.39s/it],表示每次迭代需要6.39秒。因此,对于12万的数据,我们可以估算出微调所需的总时间为120000/16/8*6.39/3600 ≈ 1.66小时,其中16是批量大小,8是GPU的数量。大约1.66小时后,12万的数据就可以微调完成。
3.3 部署自己的大模型
新模型微调好后,就可以部署起来了。使用Streamlit启动微调后的模型。启动后,您可以看看模型生成的广告词效果,如图3-4所示。可以看出,模型的回答风格比微调前更加丰富多样。
图3-4 微调之后的模型
3.4 灾难遗忘问题
大模型的灾难遗忘是指在连续学习多个任务的过程中,学习新知识会导致模型忘记或破坏之前学习到的旧知识,从而使模型在旧任务上的性能急剧下降。这是一个机器学习领域的重要挑战,尤其是对于大规模语言模型和多模态大语言模型,它们需要在不同的数据集和领域上进行微调或适应。
使用广告数据集ADGEN对模型进行了微调,结果发现模型不仅忘记了之前学会的正常回答,甚至还出现了输出错误的情况。这是因为广告数据集和模型原来的训练数据分布相差太大,引起了模型的“灾难遗忘”现象。图3-5展示了微调后的模型,连简单的问答都无法回答了。
图3-5 微调之后出现了灾难遗忘现象
为了缓解灾难遗忘问题,我们可以使用其他数据来增强模型的泛化能力。例如,可以使用一个包含逻辑推理和问答类的数据集,用于和广告数据集一起进行微调。
比如我们构建的新数据集,它包含了一些逻辑推理和问答类的数据。您需要将这个文件转换成模型可以接受的输入格式。
新的数据集涵盖了数学应用题、选择题、填空题等多种不同类型的数据,比之前的广告数据集ADGEN更加丰富和多样。我们可以将这两个数据集合并在一起,对模型进行重新微调,以提高模型的泛化能力和稳定性。
将新的数据集和广告数据集ADGEN合并后,对模型进行重新训练。训练过程中,程序会定期输出验证集的损失值,反映模型的学习效果。将这些损失值绘制成曲线图,如图3-6所示。从图中可以看出,模型的验证集损失值呈现下降的趋势。在训练了一个完整的轮次后,停止训练,保存模型。
图3-6 训练过程中的验证集损失值
使用Streamlit来启动新训练的模型。模型启动后,下面检验一下新模型是否存在灾难遗忘的问题。如图3-7所示,新模型不仅能够回答正常的问题,还能够生成新的广告词,有效地缓解了灾难遗忘的现象。
图3-7 新训练的模型
新模型不仅能缓解灾难遗忘问题,还能回答更多的问题。例如,对于“亚历克鲍德温的孩子比克林特伊斯特伍德多吗?”这样的问题,旧模型无法给出答案,而新模型则能轻松回答。另外,新模型在其他问题上也有更好的表现,如图3-8所示。
图3-8 新旧模型对比
新模型在数学推理上有显著的优势,它能够正确地列出并解决一些经典的数学问题。例如,鸡兔同笼这个问题,如图3-9所示,旧模型只能得到一个方程,而忽略了另一个方程,导致计算结果出现错误。而新模型则能够得到两个方程,并用消元法求出正确的答案。旧模型不仅在列方程时遗漏了一个条件,而且在推理过程中还存在数值计算的失误,例如,当_x_ = 1, y = 7时,它给出的结果是_x_ + 2_y_ = 14,这显然是不正确的。
图3-9 旧模型回答鸡兔同笼问题
如图3-10所示,新模型的回答非常准确和完整。它不但能够根据题目条件列出两个方程,还能够正确地运用消元法求解方程,并得出正确的答案。新模型在数学应用题上的优异表现,主要得益于我们使用了一个包含大量数学推理题的新数据集进行有监督的微调,这使得模型在这类任务上具有更强的泛化能力。
图3-10 新模型回答鸡兔同笼问题
3.5 程序思维提示——解决复杂数值推理
大模型虽然在语言理解和数学推理等方面有着优异的性能,但是在数值计算方面却显得力不从心。例如,当要计算123*145时,模型往往无法给出正确答案,这是因为四则运算的可能性太多,模型不可能覆盖所有的情况。同样,对于复杂方程的求解,大模型也束手无策,比如四元方程。图3-11展示了大模型在这两个问题上的错误答案。
图3-11 模型无法正确处理数值计算
论文Program of Thoughts Prompting: Disentangling Computation from Reasoning for Numerical Reasoning Tasks针对数值计算的难题,提出了一种创新的方法,即思维程序提示(Program of Thoughts Prompting, PoT)。思维程序提示的核心思想是,通过语言模型生成一个能够反映推理逻辑的程序,然后将程序中的计算部分交由外部的计算机执行,实现计算和推理的分离。思维程序提示的优势在于,它既能利用语言模型的强大能力,生成正确和完备的程序来描述复杂的推理,又能将计算交给专业的程序解释器来完成,避免了语言模型在计算上的误差。
接下来参考思维程序提示的方法,来解决四则运算和解方程的问题。使用程序代码来代替数据中的四则运算部分,用python的sympy库来处理解方程的部分。我们制定了一些指令的格式,然后用GPT-4来生成符合这些格式的回答。图3-12展示了设计的几种思维程序提示指令,涵盖了纯四则运算、数学应用题中的四则运算和解方程。
图3-12 构建思维程序提示
根据图3-12的思维程序提示,用GPT-4(确保答案的正确性)来生成相应格式的答案。图3-13展示了新构建的语料格式,可以看出,四则运算部分的结果用中间变量代替,解方程部分用python的sympy函数直接求解。对于没有四则运算和解方程的样本,保持原来的格式不变。为了明确哪些部分需要用程序解释器执行,哪些部分不需要,用"<<“和”>>“来标记,”<<“表示程序的起始,”>>"表示程序的结束。
图3-13 基于思维程序提示构建的新数据
用准备好的新数据对模型进行有监督微调。图3-14展示了训练过程中验证集的损失值变化,验证集损失值呈现下降趋势,最终保存了迭代1000次的模型。
图3-14 模型训练过程验证集的损失值
用Streamlit启动微调后的模型,测试其效果,选取之前的两道数学题作为输入,一道是123*145的计算,一道是四元方程的求解。图3-15显示了模型的输出结果,可以看出,模型的输出格式符合思维程序提示的要求,四则运算部分用中间变量表示,解方程部分用python的sympy函数直接求解。
图3-15 新模型的输出格式为思维程序
为了得到图3-15中的程序代码的输出结果,需要用python解释器来运行它们,解析代码的方法如下所示。
import json
import numpy as np
import pandas as pd
from scipy.optimize import minimize
import sympy
import re
from tqdm import tqdm
import math
import inspect
import inspect
# 解析函数
def parse_pot(inputs):
s = re.findall(r'<<(.*?)>>', inputs, re.DOTALL)
index = 0
for k in s:
if "func" in k:
var = k.split("=", 1)
try:
var[1] = var[1].strip(" ")
exec(var[1], globals())
ans = func()
except:
if 'sympy' in var[1]:
var[1] = var[1].replace('res[x]', 'res[0][0]')
var[1] = var[1].replace('res[y]', 'res[0][1]')
exec(var[1], globals())
ans = func()
var_list = [c.strip(" ") for c in var[0].split(",")]
if len(var_list) == 1:
ans = [ans]
for i in range(len(ans)):
try:
ans[i] = float(ans[i])
if abs(ans[i] - int(ans[i])) < 1e-10:
ans[i] = str(int(ans[i]))
except:
pass
inputs = inputs.replace("<<"+k+">>", "")
for i in range(len(var_list)):
inputs = inputs.replace(var_list[i], str(ans[i]))
index += 1
for c in range(index, len(s)):
for i in range(len(var_list)):
s[c] = s[c].replace(var_list[i], str(ans[i]))
else:
var = k.replace(" ", "").split("=")
var[1] = var[1].replace("eval", "")
ans = eval(var[1])
ans = float(ans)
if abs(ans - int(ans)) < 1e-10:
ans = str(int(ans))
inputs = inputs.replace("<<"+k+">>", "").replace(var[0], str(ans))
index += 1
for c in range(index, len(s)):
s[c] = s[c].replace(var[0], str(ans))
return inputs
把上面的代码写入web_demo2.py文件,运行streamlit run web_demo2.py,就可以启动新模型,它会在输出结果之前用解析代码运行程序代码。图3-16展示了解析后的效果,可以看出,无论是简单的数值计算,还是复杂的解方程,模型都能给出正确的答案。而且,即使是涉及复杂运算的数学应用题,模型也能通过解析程序得到正确的答案。
图3-16 新模型答案解析后的输出
除了四则运算和解方程,还可以增加其它程序功能,如计算时间日期、求函数极值等。此外,除了程序代码,还可以使用第三方插件,如发送邮件、绘制图表等功能。大模型作为一个智能体,能够理解人类的意图,选择最有效的解决方案,而我们只需根据需求,对大模型进行有监督微调,就能开发出更符合预期的私有大模型。
总结
如今大模型百花齐放,关于大模型的文章也非常多,但是介绍如何从0开始构建自己的大模型的介绍比较少,本文系统性地介绍了如何选择合适的基座模型,以及如何使用自己的数据微调大模型。
AI大模型学习福利
作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
2024最新版CSDN大礼包:《AGI大模型学习资源包》免费分享
一、全套AGI大模型学习路线
AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
2024最新版CSDN大礼包:《AGI大模型学习资源包》免费分享
二、640套AI大模型报告合集
这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
2024最新版CSDN大礼包:《AGI大模型学习资源包》免费分享
三、AI大模型经典PDF籍
随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
2024最新版CSDN大礼包:《AGI大模型学习资源包》免费分享
四、AI大模型商业化落地方案
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
2024最新版CSDN大礼包:《AGI大模型学习资源包》免费分享
作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量。
更多推荐
所有评论(0)