MySQL数据库笔记——多版本并发控制MVCC
大家好,这里是Good Note,关注 公主号:Goodnote,本文详细介绍MySQL的并发控制:多版本并发控制MVCC。
文章目录
- 背景介绍
- 数据库并发控制——锁机制
- 悲观锁和乐观锁
- 悲观锁
- 乐观锁
- 数据库并发控制——MVCC 的引入
- MVCC 和锁机制的对比
- MySQL 的多版本并发控制 (MVCC)
- 快照读和当前读
- 快照读和当前读的对比
- 隐藏的系统列
- Undo Log(回滚日志)
- Read View(读视图)
- 可见性算法(Visibility Algorithm)
- MVCC 支持的事务隔离级别
- 整体工作流程
- 总结
- MVCC 的优点
- MVCC 的局限性
- 示例:MVCC 的快照读
- 历史文章
背景介绍
许多人认为 MVCC(Multi-Version Concurrency Control,多版本并发控制) 是一种乐观锁的实现方式,我们先来了解一下什么是乐观锁和悲观锁。
数据库并发控制——锁机制
在数据库系统中,并发控制是保证多个事务在并发执行时数据一致性的核心技术。传统的并发控制方法是使用 锁,它是一种直接而有效的解决方案。
- 锁的分类:
- DQL(Data Query Language,数据查询语言):查询数据(如
SELECT
)时使用 读锁。 - DML(Data Manipulation Language,数据操作语言):对数据进行增、删、改操作(如
INSERT
、DELETE
、UPDATE
)时使用 写锁。 - DDL(Data Definition Language,数据库定义语言):定义和修改表结构(如
CREATE TABLE
、DROP TABLE
)时,通常会使用 元数据锁。
- DQL(Data Query Language,数据查询语言):查询数据(如
悲观锁和乐观锁
悲观锁
- 概念:
悲观锁假定会发生并发冲突,因此在对资源进行操作之前,会先加锁,确保其他事务无法同时访问该资源。 - 特点:
- 需要加锁,锁定资源后,其他线程对该资源的操作会被阻塞。
- 开销较大,可能导致性能下降。
- 应用场景:
- 适用于并发冲突频繁的场景。
- 例子:
数据库中的 行级锁 或 Java 中的synchronized
关键字。
乐观锁
- 概念:
乐观锁假定不会发生并发冲突,因此不加锁,而是在更新数据时,通过比较版本号或条件检查来保证操作的正确性。 - 特点:
- 不加锁,操作更轻量级。
- 需要在操作完成后检查是否发生冲突。
- 应用场景:
- 适用于并发冲突较少的场景。
- 实现方式:
- 版本号机制:每次修改数据时,更新版本号。更新操作成功的前提是版本号没有变化。
- CAS(Compare And Swap):通过原子性比较和更新操作实现乐观锁。
数据库并发控制——MVCC 的引入
许多人认为 MVCC(Multi-Version Concurrency Control,多版本并发控制) 是一种乐观锁的实现方式,但 MVCC 的核心在于通过 版本控制和可见性算法 来实现数据库的并发控制。InnoDB 的 MVCC 通过隐藏字段、Undo Log 和 Read View 协同工作,实现了高效的多版本并发控制:
-
隐藏字段:
- 提供版本控制信息,判断事务的可见性。
-
Undo Log:
- 保存数据的历史版本,支持事务回滚和快照读。
-
Read View:
- 在事务启动时生成的元数据,用于确定哪些数据版本对事务可见。
MVCC 和锁机制的对比
特性 | 锁(悲观锁/乐观锁) | MVCC |
---|---|---|
加锁开销 | 悲观锁需要加锁,开销较大;乐观锁无需加锁 | 不加锁,依赖多版本数据 |
并发性能 | 读写互斥,可能导致线程阻塞 | 读写分离,读操作不阻塞写 |
实现方式 | 直接加锁或通过版本号/CAS 判断 | 通过 Undo Log 和事务视图维护多版本 |
适用场景 | 并发冲突频繁的场景(悲观锁) | 读多写少的场景,且冲突较少 |
优缺点 | 加锁开销大,读写冲突会阻塞 | 空间开销较大,但读性能更优 |
MySQL 的多版本并发控制 (MVCC)
多版本并发控制 (MVCC, Multi-Version Concurrency Control) 是 MySQL 用于实现事务隔离的一种机制,主要应用于 InnoDB 存储引擎。通过 MVCC,MySQL 可以在高并发环境下实现 读写并行,同时减少锁的使用,提高性能。
快照读和当前读
-
快照读(Snapshot Read):
- 读取的是数据的快照版本(历史版本),即事务开始时的数据状态,而不是最新的。
- 常见的
SELECT
语句都是快照读,除非显式使用加锁查询。
-
当前读(Current Read):
- 读取的是最新版本的数据,并且会对读取的数据加锁以确保一致性。
- 常见的当前读操作包括:
SELECT ... FOR UPDATE
SELECT ... LOCK IN SHARE MODE
UPDATE
DELETE
INSERT
快照读和当前读的对比
操作类型 | 快照读(Snapshot Read) | 当前读(Current Read) |
---|---|---|
使用场景 | 普通 SELECT 查询 | 加锁查询(SELECT ... FOR UPDATE 等) |
是否加锁 | 不加锁 | 加锁 |
数据版本 | 读取快照版本,使用 Undo Log | 读取当前版本,可能会阻塞 |
是否支持 MVCC | 支持 | 支持,但需要额外的锁操作 |
隐藏的系统列
InnoDB 存储引擎会为每一行记录添加了以下 三个隐藏的系统列,用于实现 MVCC:
isDelete | DB_TRX_ID | DB_ROLL_PTR | RowID(可选) | id | name | password |
---|---|---|---|---|---|---|
是否删除 | 事务 ID | 回滚指针 | 隐藏的自增 ID。如果表未指定主键,系统会自建 | id | name | password |
字段名 | 含义 |
---|---|
isDelete | 标记该记录是否被逻辑删除,删除标志不是单独的字段,而是存储在记录头信息中,用户不可见。 |
DB_TRX_ID | 记录每行数据最近一次修改(插入/更新)所对应的事务 ID(Read View中的事务ID)。 |
DB_ROLL_PTR | 回滚指针,指向该记录的 undo log 日志,保存行的历史版本。 |
Undo Log(回滚日志)
Undo Log 是 InnoDB 存储引擎用于实现事务回滚、快照读(MVCC)的重要机制之一。它记录数据修改前的旧版本,并通过回滚指针(DB_ROLL_PTR
)形成一条 Undo 日志链。
-
功能:
- 事务回滚:
- 当事务未提交或被回滚时,Undo Log 提供修改前的数据,用于恢复到原始状态,撤销未提交事务对数据库的影响。
- 多版本控制(MVCC):
- Undo Log 保存了数据的历史版本,通过回滚指针(
DB_ROLL_PTR
),其他事务可以通过 Undo Log 获取旧版本数据。
- Undo Log 保存了数据的历史版本,通过回滚指针(
- 事务回滚:
-
Undo Log 的特性:
- 逻辑日志:
- 记录逻辑上的操作。例如:
- 删除一条记录时,Undo Log 会记录一个对应的“插入操作”。
- 更新一条记录时,Undo Log 会记录一个对应的“反向更新操作”。
- 记录逻辑上的操作。例如:
- 存储位置:
- Undo Log 存储在 回滚段 中。
- 逻辑日志:
-
Undo Log 的分类:
- Insert Undo Log:
- 记录事务插入数据时的日志。
- 特点:事务提交后即可丢弃,因为没有其他事务需要访问它。
- Update Undo Log:
- 记录事务更新或删除数据时的日志。
- 特点:事务提交后,仍需保留以支持快照读,只有当没有比该日志更早的
Read View
存在时,才能删除。
- Insert Undo Log:
-
问题与优化:
- 长事务可能导致 Undo Log 无法及时清理,因为较早的
Read View
仍然需要访问旧版本数据。这会导致存储空间占用过大,建议避免长时间未提交的事务。
- 长事务可能导致 Undo Log 无法及时清理,因为较早的
Read View(读视图)
Read View 是事务在执行快照读(Snapshot Read)时生成的一种快照机制,用于判断当前事务对哪些数据版本可见。
-
功能:
- Read View 确保事务在快照读时能够看到一致性的数据。
- 通过可见性算法(Visibility Algorithm)判断某个数据版本是否对当前事务可见。
-
Read View 的组成:
alive_trx_list
:- 当前系统中活跃的事务 ID 列表,包含所有未提交事务的 ID。
up_limit_id
:alive_trx_list
中的最小事务 ID。
low_limit_id
:- 系统当前分配的最大事务 ID 加 1。
可见性算法(Visibility Algorithm)
在生成 Read View 后,InnoDB 通过以下步骤判断数据版本(DB_TRX_ID
)是否对当前事务可见, MVCC 的可重复读(Repeatable Read)隔离级别判断如下:
-
判断是否早于活跃事务的最小 ID:
- 如果
DB_TRX_ID < up_limit_id
,表明该版本在生成 Read View 前已提交,对当前事务可见。
- 如果
-
判断是否晚于最新事务的最大 ID:
- 如果
DB_TRX_ID >= low_limit_id
,表明该版本在生成 Read View 后才生成,对当前事务不可见。
- 如果
-
判断是否属于活跃事务:
- 如果
DB_TRX_ID
在alive_trx_list
中,说明生成 Read View 时该事务仍未提交,因此该版本对当前事务不可见。
- 如果
-
通过回滚指针查找可见版本:
- 如果数据版本不可见且
ROLL_PTR
不为空,则通过ROLL_PTR
指向的 Undo Log 查找更早的版本,重复上述判断,直到找到可见的版本。
- 如果数据版本不可见且
MVCC 支持的事务隔离级别
1. 读未提交(Read Uncommitted)
-
Read View:
- 不使用 Read View。
- 读取数据时直接读取最新版本,无论数据是否由其他事务提交。
-
可见性规则:
- 所有事务的最新修改版本对当前事务可见。
- 即使其他事务未提交的数据,也可以被读取(会发生脏读)。
-
特点:
- 无需 Undo Log,也不使用
alive_trx_list
等 Read View 属性。
- 无需 Undo Log,也不使用
2. 读已提交(Read Committed)
-
Read View:
- 每次查询都会生成新的 Read View,因此每次查询的结果可能不同。
- Read View 只在当前查询的上下文中生效,不跨查询复用。
-
可见性规则:
- 如果
DB_TRX_ID
小于up_limit_id
(即数据版本在当前查询的 Read View 生成之前已提交),则该版本对当前事务可见。 - 如果
DB_TRX_ID
在活跃事务列表中,说明该版本由未提交事务生成,对当前事务不可见。
- 如果
-
特点:
- 数据版本的可见性随着每次查询变化。
- 防止脏读,但可能发生不可重复读。
3. 可重复读(Repeatable Read)
-
Read View:
- 事务开始时生成一次 Read View,整个事务期间使用同一个快照,确保读取结果一致。
- 该 Read View 的属性(
up_limit_id
、low_limit_id
和alive_trx_list
)在事务期间不会变化。
-
可见性规则:
- 如果
DB_TRX_ID < up_limit_id
,说明数据版本在事务开始前已提交,对当前事务可见。 - 如果
DB_TRX_ID >= low_limit_id
,说明数据版本在事务开始后生成,对当前事务不可见。 - 如果
DB_TRX_ID
在alive_trx_list
中,说明数据版本由未提交的事务生成,对当前事务不可见。
- 如果
-
特点:
- 读操作始终基于事务开始时生成的 Read View。
- 防止脏读和不可重复读,但可能发生幻读。
4. 串行化(Serializable)
-
Read View:
- 不使用 Read View。
- 通过加锁(如共享锁、排他锁)实现事务隔离。
-
可见性规则:
- 每次读取时都会加锁,确保当前读操作的可见性。
- 因为加锁阻塞了其他事务的修改或读取,因此不存在不可见的问题。
-
特点:
- 防止脏读、不可重复读和幻读。
- 并发性能较低,但数据一致性最高。
整体工作流程
-
事务修改数据时:
- 写入 Undo Log,保存旧版本数据。
- 更新
DB_TRX_ID
和DB_ROLL_PTR
。
-
事务执行快照读时:
- 生成 Read View,记录当前系统中活跃事务列表。
- 判断数据版本是否可见:
- 若不可见,使用
DB_ROLL_PTR
查找历史版本。
- 若不可见,使用
-
事务提交时:
- Insert Undo Log 可直接删除。
- Update Undo Log 保留,用于支持其他事务的快照读。
-
事务回滚时:
- 通过 Undo Log 恢复旧版本数据,撤销事务的影响。
总结
-
MVCC 是 InnoDB 存储引擎中实现事务隔离和提高并发性能的关键机制。
-
通过维护多个数据版本和 Undo Log,实现快照读和当前读,避免了大量加锁操作。
-
Undo Log:
- 是 MVCC 的基础,记录旧版本数据,支持事务回滚和快照读。
- 分类为 Insert Undo Log 和 Update Undo Log。
-
Read View:
- 确保快照读的隔离性,通过可见性算法判断数据版本是否可见。
- 隔离级别的不同会影响 Read View 的生成时机。
-
两者配合:
- Undo Log 提供数据的历史版本,Read View 判断哪些版本对当前事务可见,共同实现事务的并发控制和一致性。
MVCC 的优点
-
提高并发性能:
- 快照读不需要加锁,避免了读写之间的冲突。
-
减少锁开销:
- 大量读操作可以通过读取历史版本完成,无需加锁,提高效率。
-
支持事务隔离:
- MVCC 能够在不同的隔离级别下提供一致的数据读取。
MVCC 的局限性
-
占用存储空间:
- Undo Log 的存在会增加存储开销,特别是长事务会导致 Undo Log 增长。
-
长事务的性能问题:
- 长事务可能会导致 Undo Log 不能被及时清理,增加性能开销。
-
仅适用于读写混合场景:
- 如果事务中大量是写操作,MVCC 的优势会减弱,因为写操作仍需加锁。
示例:MVCC 的快照读
1. 表结构
CREATE TABLE orders (id INT AUTO_INCREMENT PRIMARY KEY,status VARCHAR(20)
);
2. 插入数据
INSERT INTO orders (status) VALUES ('pending'), ('shipped'), ('delivered');
3. 启动事务并模拟并发查询
事务 A:
START TRANSACTION;
SELECT * FROM orders; -- 快照读,读取事务开始时的版本
UPDATE orders SET status = 'cancelled' WHERE id = 1; -- 当前读,修改最新版本
事务 B:
START TRANSACTION;
SELECT * FROM orders WHERE id = 1; -- 读取事务 A 修改前的快照版本
结果:
- 事务 A 在事务 B 提交之前,可以看到修改后的状态。
- 事务 B 在事务 A 提交之前,读取的是修改前的状态。
历史文章
- MySQL数据库笔记——数据库三范式
- MySQL数据库笔记——存储引擎(InnoDB、MyISAM、MEMORY、ARCHIVE)
- MySQL数据库笔记——常见的几种锁分类
- MySQL数据库笔记——索引介绍
- MySQL数据库笔记——事务介绍
- MySQL数据库笔记——索引结构之B+树
- MySQL数据库笔记——索引潜规则(回表查询、索引覆盖、索引下推)
- MySQL数据库笔记——索引潜规则(最左前缀原则)
- MySQL数据库笔记——常见慢查询优化方式
- MySQL数据库笔记——日志介绍
相关文章:

MySQL数据库笔记——多版本并发控制MVCC
大家好,这里是Good Note,关注 公主号:Goodnote,本文详细介绍MySQL的并发控制:多版本并发控制MVCC。 文章目录 背景介绍数据库并发控制——锁机制悲观锁和乐观锁悲观锁乐观锁 数据库并发控制——MVCC 的引入MVCC 和锁机…...

【0x0037】HCI_Write_Link_Supervision_Timeout命令详解
目录 一、命令概述 二、命令格式及参数说明 2.1. HCI_Write_Link_Supervision_Timeout 命令格式 2.2. Handle 2.3. Link_Supervision_Timeout 三、生成事件及参数 3.1. HCI_Command_Complete 事件 3.2. Status 3.3. Handle 四、命令执行流程 4.1. 命令准备阶段 4.…...

Linux下如何进行内存泄漏分析
前言 正文 一、环境的安装 1、tar –xf valgrind-3.17.0.tar.bz2 2、cd valgrind-3.17.0 3、./configure // 运行配置脚本生成makefile文件,可以--help查看配置项,自行按需配置,比如修改编译工具、修改安装路径等 4、make 5、make…...

Colyseus Metadata 详解
Colyseus Metadata 详解 Colyseus 是一个专注于实时多人在线游戏和应用的框架,它的 metadata 功能为每个房间提供了一个灵活且有用的机制,用来存储和共享与房间相关的非实时信息。这些信息可以用来描述房间、标记房间状态、或提供额外的房间配置选项。 …...

C语言day5:shell脚本
一、练习题1 定义一个find函数,查找ubuntu和root的gid并使用变量接收结果 二、练习题2 定义一个数组,写一个函数完成对数组的冒泡排序 三、练习题3 使用break求1-100中的质数(质数:只能被1和它本身整除,如:…...

微记录-Linux字符设备的write函数如何避免文件系统重复调用?
背景 linux字符设备的fops实现read write的时候,尤其是write,因为会指定写入的总长度,那么如果如果驱动中单次write最大个数小于需求len的时候,文件系统就会多次调用到write。他是根据wirte函数的返回值来判断的。如果返回值不是…...

本地调试自定义Maven Plugin步骤
添加自定义插件到dependencies 找到对应依赖的类,打上断点。 debug运行插件。...

二、github基础
Github基础 备用github.com网站一、用户界面-Overview(概览)1用户信息2 导航栏3 热门仓库4 贡献设置5贡献活动6搜索和筛选7自定义收藏8贡献统计9最近活动10其他链接 二、用户界面-Repositories(仓库)1 libusb_stm322 savedata3 Fi…...

如何在 Vue 2 中使用 Swiper 5.4.5 处理静态与后端数据不能切换问题
一、文章大纲 1.前言 介绍 Swiper 作为一款强大的轮播组件,常用于处理图片、文章、商品等内容的滑动展示。 在 Vue.js 项目中集成 Swiper,尤其是在 Vue 2 中使用,常见的两种数据来源:静态数据与后端数据。 在 Vue 2 项目中集成 Swiper 5.4.5 2.如何通过 npm 安装 Swiper…...

request.getSession().getAttribute(Constants.ADMIN_ID)
你提出了一个非常好的问题! 确实,使用 request.getSession().getAttribute(Constants.ADMIN_ID) 也能从 Session 中获取属性,那么 SessionAttribute 注解和这种方式到底有什么区别呢? request.getSession().getAttribute(Constan…...

线性回归模型的构建与训练
1.基本的导入与配置 # To support both python 2 and python 3 from __future__ import division, print_function, unicode_literals# Common imports import numpy as np import pandas as pd import os# to make this notebooks output stable across runs np.random.seed(4…...

【JavaWeb后端学习笔记】MySQL的常用函数(字符串函数,数值函数,日期函数,流程函数)
MySQL函数 1、字符串函数2、数值函数3、日期函数4、流程函数 1、字符串函数 函数说明concat(s1, s2, …, sn)字符串拼接,将 s1, s2, …, sn 拼接成一个字符串lower(str)将字符串 str 全部转为小写upper(str)将字符串 str 全部转为大写lpad(str, n, pad)左填充&…...

【推送】主流的服务端推送技术的对比
推送技术的对比 以下是主流的服务端推送技术的对比表格,涵盖WebSocket、Server-Sent Events (SSE)、Long Polling、HTTP/2 Push和Comet: 特性WebSocketServer-Sent Events (SSE)Long PollingHTTP/2 PushComet通信方向双向单向(服务器到客户…...

直观解读 JuiceFS 的数据和元数据设计(一)
大家读完觉得有意义和帮助记得关注和点赞!!! 1 JuiceFS 高层架构与组件2 搭建极简 JuiceFS 集群 2.1 搭建元数据集群2.2 搭建对象存储(MinIO) 2.2.1 启动 MinIO server2.2.2 创建 bucket2.3 下载 juicefs 客户端2.4 创…...

nginx配置文件没有语法颜色
第一种办法: nginx-1.26.2这个目录是通过解压 nginx-1.26.2.tar.gz,nginx官网下的 将这四个目录复制到/usr/share/vim/vimfiles/目录下 cp -ar ./* /usr/share/vim/vimfiles/ 再次进入nginx配置文件可以看到已经有颜色了 第二种方法: …...

PCB层叠结构设计
PCB层叠结构设计 层叠结构设计不合理完整性相关案例:在构成回流路径时,由于反焊盘的存在,使高速信号回流路径增长,造成信号回流路径阻抗不连续,对信号质量造成影响。 PCB层叠结构实物:由Core 和 Prepreg&a…...

电子应用设计方案83:智能 AI 打印机系统设计
智能 AI 打印机系统设计 一、引言 智能 AI 打印机系统旨在提供更高效、便捷和个性化的打印服务,融合了人工智能技术,以满足不断变化的用户需求。 二、系统概述 1. 系统目标 - 实现自动纸张检测、调整打印参数,适应不同纸张类型和尺寸。 - 具…...

windows安装rsync Shell语句使用rsync
sh脚本里使用 rsync功能,需要提前布置rsync环境 第一步,下载 libxxhash-0.8.2-1-x86_64.pkg.tar 下载压缩包地址 Index of /msys/x86_64/https://repo.msys2.org/msys/x86_64/ 下载对应版本,没特殊需求下载最高版本就行了 解压缩压缩包 …...

Django 模型
Django 模型 Django 模型是 Django 框架的核心组件之一,它用于定义应用程序的数据结构。在 Django 中,模型是 Python 类,通常继承自 django.db.models.Model。每个模型类代表数据库中的一个表,模型类的属性对应表中的字段。 1. 创建模型 创建 Django 模型非常简单。首先…...

CentOS — 压缩解压
文章目录 一、tar二、zip、unzip三、gzip、gunzip四、bzip2、bunzip2 一、tar 文件格式:.tar 压缩格式:tar [-参数] *.tar 目录|文件 解压格式:tar [-参数] *.tar [-C 目标目录] 参数 -c:create,创建,创…...

OpenGL变换矩阵和输入控制
在前面的文章当中我们已经成功播放了动画,让我们的角色动了起来,这一切变得比较有意思了起来。不过我们发现,角色虽然说是动了起来,不过只是在不停地原地踏步而已,而且我们也没有办法通过键盘来控制这个角色来进行移动…...

LCS最长公共子序列C++实现
算法思路:动态规划 版本1:只输出公共长度 #include <iostream> #include <string> using namespace std;int c[1000][1000]; //c[i][j]用来存储 Xi到Yj的最长公共子序列长度 void MaxLength(int m, int n, string x, string y) { //m&#x…...

深入刨析数据结构之排序(上)
目录 1.内部排序 1.1概述 1.2插入排序 1.2.1其他插入排序 1.2.1.1 折半插入排序 1.2.1.2 2-路插入排序 1.3希尔排序 1.4快速排序 1.4.1起泡排序 1.4.2快速排序 1.4.2.1hoare版本 1.4.2.2挖坑版本 1.4.2.3前后指针版本 1.4.2.4优化版本 1.4.2.4.1小区间插入排序优…...

【无重复字符的最长子串】
一、题目 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串的长度。示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2: 输入: s "bbbbb" 输出: 1 解释: …...

Vue3+Element Plus的表格分页实战
Element Plus 是一个基于 Vue 3 的现代化 UI 组件库,旨在帮助开发者快速构建美观且功能丰富的 Web 应用程序。它提供了大量的 UI 组件,如按钮、表单、表格、弹出框、标签页、树形控件等,涵盖了 Web 应用开发中常见的大多数场景。本文通过一个实例来说明vue3+elementplus查询…...

vue项目搭建规范
项目搭建规范 一. 代码规范1.1. 集成editorconfig配置1.2. 使用prettier工具1.3. 使用ESLint检测1.4. git Husky和eslint1.5. git commit规范1.5.1. 代码提交风格1.5.2. 代码提交验证 二. 第三方库集成2.1. vue.config.js配置2.2. vue-router集成2.3. vuex集成2.4. element-plu…...

Mac iTerm2集成DeepSeek AI
1. 去deepseek官网申请api key,DeepSeek 2. 安装iTerm2 AI Plugin插件,https://iterm2.com/ai-plugin.html,插件解压后直接放到和iTerms相同的位置,默认就在/Applications 下 3. 配置iTerm2 4. 重启iTerm2,使用快捷键呼出AI对话…...

检索增强生成(RAG)
检索增强生成(Retrieval-Augmented Generation, RAG)是一种结合了检索机制和生成模型的先进技术,旨在提高自然语言处理系统的准确性和上下文相关性。本文将详细介绍如何从零开始构建一个RAG系统,包括数据处理、检索、生成以及部署…...

【第二部分--Python之基础】03 容器类型的数据
Python内置的数据类型如序列(列表、元组等)、集合和字典等可以容纳多项数据,我们称它们为容器类型的数据。 序列 序列(sequence)是一种可迭代的、元素有序的容器类型的数据。 序列包括列表(listÿ…...

【人工智能机器学习基础篇】——深入详解深度学习之复杂网络结构:卷积神经网络(CNN)、循环神经网络(RNN)、生成对抗网络(GAN)等概念及原理
深入详解深度学习之复杂网络结构:卷积神经网络(CNN)、循环神经网络(RNN)、生成对抗网络(GAN) 深度学习作为人工智能的重要分支,通过复杂的网络结构实现对数据的高级抽象和理解。本文…...