AI 大模型系统实战

AI 大模型是什么?

维基百科对基础模型的定义是这样的,基础模型是一种大型机器学习模型,通常在大量数据上进行大规模训练(通过自监督学习或半监督学习),以使它可以适应各类下游任务。因此,它需要兼顾参数量大(大型模型),训练数据量大(大量数据大规模训练)和迁移学习能力强(适应多种下游任务)几点才能够叫做基础模型,而不只是参数量大,就能够叫做基础模型,我们在甄别时需要特别注意。

另一个重要的定义就是 AIGC,目前工业界普遍将 AIGC(Artificial Intelligence Generated Content)称为生成式人工智能。

所谓“涌现”,指的是在大模型领域,当模型突破某个规模时,性能显著提升,表现出让人惊艳、意想不到的能力。

所谓思维链(Chain-of-thought,CoT)指的是通过一系列有逻辑关系的思考步骤,形成一个完整的思考,进而得出答案的过程。

大模型的“大”是一个相对概念,是一个持续的过程。更大规模的训练数据需要模型具备更强的记忆、理解和表达能力。而为了拥有更强的记忆、理解和表达能力,模型则需要更大的参数量,也就是更大的模型。

生成式 AI 大模型的兴起

不仅仅是由于模型规模变大,而是多个因素相互作用形成的。

首先,在近年的技术发展中,大型语言模型,特别是以 GPT 3.0 为代表的大模型,展现出了出色的涌现、思维链和上下文学习的能力,不再停留在“人工智障”的阶段,极大地提升了自然语言理解和生成的能力,然而,这只是其中的一个必要条件。

第二个必要条件是跨模态建模能力的发展。这让同一个模型能像人类一样同时理解和处理 Excel、PPT、PDF、图像和视频等多种形式的数据。加持了这样的能力,算法生成的信息量从此发生质变,生成式人工智能发挥作用的舞台就更多了。

第三个必要条件是生成式模型的交互方式。生成式 AI 产品巧妙地利用了人类的惰性,通过新的交互方式,大大提高了产品的渗透率。这使得人们不断地使用 ChatGPT,并逐渐产生了依赖。这也成为了当前 AI 大模型产业,迅速发展的关键点。

然而,所有这些前提条件的实现,都依赖于存储和计算能力的持续发展,“孩子”身体的发育,使模型能够容纳和记忆更大规模的数据。不过,以上只是生成式 AI 大模型兴起的一些必要条件,但其全面走红还涉及到资本和产业发展的需求等多个因素的综合效果。

任务规划(Planning)

这种方法可以让 LLM 对自己的想法进行调整和反思,最经典的方法是 ReAct,他有三个概念:

Thought:表示让大语言模型思考,目前需要做哪些行为,行为的对象是谁,它要采取的行为是不是合理的。

Act:也就是针对目标对象,执行具体的动作,比如调用 API 这样的动作,然后收集环境反馈的信息。

Obs:它代表把外界观察的反馈信息,同步给大语言模型,协助它做出进一步的分析或者决策。

我们可以用这种方法来启发 LLM 工作,比如让它帮你制定工作方案,并持续向它提问,例如:你的执行步骤有哪些潜在隐患和风险、有哪些方法可以降低风险、能否帮助我制定一些安全风险预案等等问题,以确保它生成的内容安全可靠。在这个过程中,你要尽量唤醒 LLM 的相关知识,生成合理的计划,此时思维链技术(CoT)就非常重要了,它可以让 LLM 将任务分解为可解释的步骤。

记忆唤醒(Memory)

无论是在制定计划、使用工具或执行任务的过程中,LLM 都需要外部信息的帮助来辅助进行思考。为了更好地让 LLM 拥有记忆力,我们不妨先参考一下人类是如何记忆的。在神经科学研究中,人类的记忆可分为感觉记忆、短期记忆和长期记忆三种类型。

感觉记忆,是人体接收到外部信号以后,瞬间保留的视觉、听觉、触觉的记忆片段,在 AI 系统中类似于高维嵌入表示,也就是我们常说的 “Embedding”。

短期记忆,是你当前意识中的信息,在 LLM 中类似于提示词(Prompt)中的所有信息。

长期记忆,包含了你能回忆的所有信息,在 LLM 中类似于外部向量存储。

驾驭工具(Tools)

要让 LLM 学会使用工具,首先需要让它认识工具,比如 TALM、Toolformer 和 Gorilla 等方法让 LLM 学会理解 API 的调用注释,这是 Plugin 和 Function 等功能的基础。下图展示了 Gorilla 教会 LLM 使用 API 的全过程。

首先,我们使用大量 API 调用代码和文档作为语料,训练一个可以理解 API 的大语言模型。

然后,AI 系统还将对这些 API 进行向量化操作,将它们存储在向量数据库中作为外部记忆。

随后,当用户发起请求时候,AI 系统会从外部记忆中,获取跟请求相关的 API 交给 LLM。

最后,LLM 组合串联这些 API 形成代码,并执行代码,完成 API 的调用,生成执行结果。

链式调用黏合剂(Langchain)

首先,我们来为你的原型系统搭建一个“调度中心”。这个调度中心将帮助大语言模型(LLM)连接到我们之前学到的各种生态组件,如计划组件、记忆组件和工具组件等等。目前最主流的做法是采用链式调用。链式调用可以让你的编码更高效,只需少量代码,就能让用户、LLM 和组件之间进行复杂的互动。

为了让大语言模型能够实现与人类友好的多轮对话,我们需要额外引入两个组件。第一个是 ConversationBufferMemory,它将帮助 LLM 记录我们的对话过程。第二个是 ConversationChain,它会帮我们管理整个会话过程,通过调取 BufferMemory 中的对话信息,让无状态的 LLM 了解我们的对话上下文。同时,ConversationChain 还会通过补充一些“提示语”,确保 LLM 知道它在与人类进行交流。

from langchain.llms import OpenAI
from langchain.chains import ConversationChain
from langchain.memory import ConversationBufferMemory

import os
os.environ["OPENAI_API_KEY"] = '...'

llm = OpenAI(temperature=0)
mem = ConversationBufferMemory()

# Here it is by default set to "AI"
conversation = ConversationChain(llm=llm, verbose=True, memory=mem)

conversation.predict(input="Hi there!")

零代码快速搭建(Flowise)

在学习更高级的用法之前,先给你一个学习加速包,让你“无痛”地进行下面的过程。这个加速包叫做 Flowise,用于零代码搭建 LLM 应用平台。通过使用它,你可以在一分钟内搭建起刚才的应用。

领域知识库(Embedding & 向量检索引擎)

这类模型有两个标准动作。第一是让 LLM 做好考前“冲刺训练”也就是领域微调,它的训练成本较高,我们会在第四章中讲解这个方法。第二是为模型增加外部记忆,在提示词中引入一些领域知识,帮助模型提升回答质量。先使用第二种方法:具体制作步骤是这样的。

对团队的技术文档进行切片,生成语义向量(Embedding),存入向量数据库作为外部记忆。

根据同事所提问题中的内容,检索向量数据库,获取技术文档的内容片段。

把文档片段和同事的问题一并交给大语言模型(LLM),让它理解文档内容,并针对问题形成恰当回答,返回给同事。

接下来,我们继续使用 Flowise 实现这个项目,你只需要依次加入以下组件。

1、Folder with Files 组件,负责将相关知识文档上传。

2、Recursive Character Text Splitter 组件,用来给上传的文档内容做断句切片。

3、OpenAI Embeddings 组件负责将断句后的内容切片映射成高维 Embedding。

4、In-Memory Vector Store 组件用来将 Embedding 存入数据库中,供给 LLM 作为外部记忆。

5、Conversational Retrieval QA Chain  组件则会根据问题,获得外部知识,在 LLM 思考形成回答后返回给用户问题答案。

自主可控 LLM 底座(LocalAI)

OpenAI API 的开源替代方案——LocalAI,它可以将唾手可得的开源 LLM,封装成 OpenAI API 相同的接口形式,为你的应用提供服务。下面我们开始搭建这个底座,首先执行以下指令,部署 LocalAI 的代码:

$ git clone https://github.com/go-skynet/LocalAI
$ cd LocalAI

更高、更快、更强(Llama)

其实你可以使用“更大”的模型来提升效果,比如 Meta 开源的 Llama 系列模型。Llama 是 Meta AI 公司于 2023 年 2 月发布的大型语言模型系列,Llama-2 已经非常接近 GPT-3.5 的水平,而且可以免费商用。

首先,如下面的代码所示,我们去 HuggingFace 下载 Llama-2 最新的 ggml 版本。这里我们使用 7B 通用版本来进行演示。

$ wget -c "https://huggingface.co/TheBloke/Llama-2-7B-chat-GGML/resolve/main/llama-2-7b-chat.ggmlv3.q4_0.bin" ./models

下载了模型之后,我们根据以下指令,启动 LocalAI 来快速测试一下模型,确保模型文件没有问题。

$ docker-compose up -d
$ curl -v  http://localhost:8080/v1/models
{"object":"list","data":[{"id":"llama-2-7b-chat.ggmlv3.q4_0.bin","object":"model"}]}

最后,我们回到 Flowise 的界面,将模型名称修改为 llama-2-7b-chat.ggmlv3.q4_0.bin。再次测试聊天机器人,它是不是变得更加聪明了?如果需要更大的模型,你可以按需下载。Local AI 已经在底层支持了 llama.cpp,所以 ggml 格式的模型基本都可以适配。你还可以尝试常用的量化方法,但要注意你的 GPU 是否支持。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/782452.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数学系C++ 类与对象 STL(九)

目录 目录 面向对象:py,c艹,Java都是,但c是面向过程 特征: 对象 内敛成员函数【是啥】: 构造函数和析构函数 构造函数 复制构造函数/拷贝构造函数: 【……】 实参与形参的传递方式:值…

【Java】了解异常

初始异常 我们平时应该已经接触过一些 “异常” 了,这里列举一些例子。 算术异常: 数组下标越界异常: 访问空指针异常: 所谓异常指的就是程序在 运行时 出现错误时通知调用者的一种机制。 异常的基本用法 捕获异常 try{ 有可能…

知识的向量表示

1、one-hot表示,空间太大 2、bag词袋模型,无法表示词的语义 3、词的语义由什么决定?词由他的上下文决定?分布式语义 4、CBow,通过前面几个词和后面几个词,预测中间几个词 5、skip-gram,通过…

【Python】已解决:(MongoDB安装报错)‘mongo’ 不是内部或外部命令,也不是可运行的程序

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例及解决方案五、注意事项 已解决:(MongoDB安装报错)‘mongo’ 不是内部或外部命令,也不是可运行的程序 一、分析问题背景 在安装和配置MongoDB时,有…

数据库逆向工程工具reverse_sql

reverse_sql 是一个用于解析和转换 MySQL 二进制日志(binlog)的工具。它可以将二进制日志文件中记录的数据库更改操作(如插入、更新、删除)转换为反向的 SQL 语句,以便对系统或人为产生的误操作进行数据回滚和恢复。 *…

Python28-9 XGBoost算法

XGBoost(eXtreme Gradient Boosting,其正确拼写应该是 "Extreme Gradient Boosting",而XGBoost 的作者在命名时故意使用了不规范的拼写,将“eXtreme”中的“X”大写,以突出其极限性能和效率)是一…

【open3d专栏】利用PCA计算狭长点云的主方向

在点云处理中,PCA通常用于识别数据集中的主要方向,从而帮助理解数据的几何结构。 使用工具:python,open3d库 目的:计算狭长型点云的主方向 # -*- coding: utf-8 -*- """ Created on Sun Jul 7 11:50…

SpringMVC源码解析(一):web容器启动流程

SpringMVC源码系列文章 SpringMVC源码解析(一):web容器启动流程 目录 一、SpringMVC全注解配置1、pom文件2、web容器初始化类(代替web.xml)3、SpringMVC配置类(代替springmvc.xml)4、测试Controller 二、SpringServletContainerInitializer1、web容器初始化入口2、…

RNN 交叉熵

RNN善于处理时序 序列数据 简单RNN 展开就是 LSTM 遗忘门f_t决定上期记忆保留多少 隐藏层 在神经网络中,隐藏层指的是除了输入层和输出层之外的层,它们的输出不会直接用于网络的最终输出,而是作为中间步骤用于提取和转换数据。因此&#x…

LabVIEW光谱测试系统

在现代光通信系统中,光谱分析是不可或缺的工具。开发了一种基于LabVIEW的高分辨率光谱测试系统,通过对可调谐激光器、可编程光滤波器和数据采集系统的控制,实现了高效、高精度的光谱测量。 项目背景 随着光通信技术的迅速发展,对…

Filter和Listener

1. Filter 过滤器 1 过滤器简介 Filter过滤器是JavaWeb的三大组件(Servlet程序、Listener监听器、Filter过滤器)之一 Filter作用:拦截请求、过滤响应 是javaee的规范也是接口 拦截请求常见的应用有 权限检查日记操作事务管理 2 Filter …

刷题之多数元素(leetcode)

多数元素 哈希表解法&#xff1a; class Solution { public:/*int majorityElement(vector<int>& nums) {//map记录元素出现的次数&#xff0c;遍历map&#xff0c;求出出现次数最多的元素unordered_map<int,int>map;for(int i0;i<nums.size();i){map[nu…

详解Java垃圾回收(GC)机制

一、为什么需要垃圾回收 如果不进行垃圾回收&#xff0c;内存迟早都会被消耗空&#xff0c;因为我们在不断的分配内存空间而不进行回收。除非内存无限大&#xff0c;我们可以任性的分配而不回收&#xff0c;但是事实并非如此。所以&#xff0c;垃圾回收是必须的。 二、哪些内…

flutter环境安装(Mac+vscode)

以前据说flutter跨平台开发app很牛逼&#xff0c;最近突然想到这个东西&#xff0c;于是想体验一下flutter的开发流程&#xff0c;看看能否适合做独立开发。 我用的是mac&#xff0c;手机也是ios&#xff0c;就开始着手部署mac下的开发环境了。 开发后台的时候&#xff0c;一…

Vine: 一种全新定义 Vue 函数式组件的解决方案

7月6日的 vue confg 大会上 ShenQingchuan 大佬介绍了他的 Vue Vine 项目&#xff0c; 一种全新定义 Vue 函数式组件的解决方案。 和 React 的函数式组件有异曲同工之妙&#xff0c;写起来直接起飞了。 让我们来快速体验一下 vine&#xff0c; 看看到底给我们带来了哪些惊喜吧…

AI周报(6.30-7.6)

AI应用-AI控制F16战机与人类飞行员狗斗 2024年美国国防部领导下的国防部高级研究计划局&#xff08;DARPA&#xff09;宣布&#xff0c;世界上首次人工智能&#xff08;AI&#xff09;驾驶的战斗机与人类驾驶的战斗机之间的空战&#xff0c;于去年秋季在加利福尼亚州爱德华兹空…

基于CentOS Stream 9平台搭建RabbitMQ3.13.4以及开机自启

1. erlang与RabbitMQ对应版本参考&#xff1a;https://www.rabbitmq.com/which-erlang.html 2. 安装erlang 官网&#xff1a;https://www.erlang.org/downloads GitHub: https://github.com/rabbitmq/erlang-rpm/releases 2.1 安装依赖&#xff1a; yum -y install gcc glib…

【LeetCode】螺旋矩阵

目录 一、题目二、解法完整代码 一、题目 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5] 示例 2&…

zdppy + vue3 + antd 实现一个表格编辑行,批量删除功能

编辑单元格和多选的功能 首先是编辑单元格的功能&#xff0c;点击编辑按钮&#xff0c;可以直接在表格中队内容进行编辑&#xff0c;点击保存以后能够同步到数据库。 其次是多选的功能&#xff0c;点击每行前面的多选框按钮&#xff0c;我们可以选中多行。 完整后端代码&am…

axios和Mybatis

除了get和post方法还有其他的方法&#xff1a; 发送 PUT 请求 发送 PUT 请求通常用于更新服务器上的资源。 const updateData {title: foo updated,body: bar updated,userId: 1 };axios.put(https://jsonplaceholder.typicode.com/posts/1, updateData).then(function (res…