Ollama接口系统详解

Ollama接口系统详解

  • 1. Ollama接口的访问方式
    • 1.1 GET方法访问
    • 1.2 POST方法访问
  • 2. 模型管理
    • 2.1 创建模型
      • 2.1.1上传模型
      • 2.1.2 用Modelfile创建模型
    • 2.2 列举已创建模型
    • 2.3 列举当前运行模型
    • 2.4 展示模型详情
    • 2.5 删除模型
  • 3. 模型推理
    • 3.1 流式接口
    • 3.2 非流式接口
    • 3.3 系统指令覆盖
    • 3.4 传入上下文
    • 3.5 生成可复现回答
  • 4. 文本嵌入
  • 参考链接

Ollama是一个专为本地机器设计的开源框架,旨在简化大型语言模型(LLM)的部署和运行过程。它提供了一套工具和命令,使用户能够轻松地下载、管理和运行各种语言模型,包括LLaMA、LLaVA等流行模型。Ollama通过优化设置和配置细节,如GPU使用情况,提高了模型运行的效率,并且其代码简洁明了,运行时占用资源少,使得在本地高效地运行大型语言模型成为可能。

Ollama支持Mac、Linux以及Windows(预览版)平台,并提供了Docker镜像,方便用户在不同操作系统环境下部署和使用。

Ollama支持通过Ollama原生接口和OpenAI兼容接口两种方式调用,本文将对Ollama原生接口做详细介绍

这里假设我们已经完成Ollama程序的安装,并且有一个llama3.1的模型,在本地的11414端口能够通过接口访问。具体步骤可以参考:

Ollama本地部署自定义大模型

Ollama支持命令行和接口的方式管理模型以及推理,因此如果已经通过命令行创建了模型,并且只对用接口进行推理感兴趣,可以直接跳到3. 模型推理部分。

1. Ollama接口的访问方式

Ollama提供的接口需要使用HTTP的GET或POST方法访问,具体是用什么类型取决于具体接口。

这里介绍两种访问Ollama接口的工具,第一种是使用Python的requests库,第二种是用curl命令。用curl命令更简短,因此本文后续大多数情况下以curl命令为例。

1.1 GET方法访问

以用GET请求访问/api/tags为例。

(1)requests库

import requestsurl = 'http://127.0.0.1:11434/api/tags'
resp = requests.get(url)print(resp.text)

其中127.0.0.1代表本机,11434是Ollama默认端口,url是完整地址。resp.text代表将返回的内容,字符串类型。

(2)curl命令

curl http://127.0.0.1:11434/api/tags

1.2 POST方法访问

以用POST请求访问/api/generate为例。

这里假设已经创建好一个名为llama3.1的模型,同时不使用流返回。

(1)requests库

import requestsurl = 'http://localhost:11434/api/generate'
data = {'prompt': '你是谁?','model': 'llama3.1','stream': False
}resp = requests.post(url, json=data)
print(resp.text)

(2)curl命令

curl命令-d参数后面跟要传入的参数,同时-d也会默认发送POST请求。

curl http://localhost:11434/api/generate -d '{"model": "llama3.1","prompt": "你是谁?","stream": false
}'

2. 模型管理

2.1 创建模型

用接口创建模型需要2步:(1)上传模型,(2)用Modelfile创建模型。

2.1.1上传模型

这里假设我们有一个模型ggml-model-Q4_K_M.gguf,位于/home/aa/bb文件夹中。

首先我们需要计算该模型的sha256签名,Ollama用该签名来确保上传的模型和原模型的一致性:

XX@YY:~$ sha256sum /home/aa/bb/ggml-model-Q4_K_M.gguf
4fd4066c43347d388c43abdf8a27ea093b83932b10c741574e10a67c6d48e0b0  /home/aa/bb/ggml-model-Q4_K_M.gguf

接下来我们可以用以下命令来上传模型,注意把后面的sha256签名换成刚才求得的数值:

curl -T /home/aa/bb/ggml-model-Q4_K_M.gguf -X POST http://localhost:11434/api/blobs/sha256:4fd4066c43347d388c43abdf8a27ea093b83932b10c741574e10a67c6d48e0b0

上传后实际上在模型存储模型的目录(我这里是/usr/share/ollama/.ollama/models/blobs)中添加了对应的blob文件,文件名为"sha256-"+sha256签名值,例如上面的模型上传完成后会生成一个名为sha256-4fd4066c43347d388c43abdf8a27ea093b83932b10c741574e10a67c6d48e0b0的blob文件。

2.1.2 用Modelfile创建模型

用Modelfile创建模型可以传入的参数如下,官方建议用modelfile而不是path这一参数:

  • name 模型名,必填项。
  • modelfile 对应单机所用的Modelfile中的内容,可选项。
  • stream 是否使用流传输,可选项。为false的话会等待创建完模型后再一并返回结果,反之会返回一串连续的结果。
  • path Model对应的路径,可选项。

以下是一个用接口创建模型的示例:

curl http://localhost:11434/api/create -d '{"name": "test1","stream": false,"modelfile": "FROM /usr/share/ollama/.ollama/models/blobs/sha256-4fd4066c43347d388c43abdf8a27ea093b83932b10c741574e10a67c6d48e0b0"}'{"status":"success"}

对于modelfile的额外说明:在实际调用接口时,事实上我们可以传入很多参数来覆盖创建模型时Modelfile里面设置的内容,比如TEMPLATE、SYSTEM、PARAMETER等,因此这里必需要有的其实只有模型名和FROM参数。此外,modelfile里FROM的后面的地址实际上是在Ollama运行的服务器中存储的blob文件地址,而不是和之前Modelfile中一样的gguf文件地址。

2.2 列举已创建模型

列举已创建模型可以通过GET方法调用/api/tags来实现,例如:

xx@yy:~$ curl http://localhost:11434/api/tags
{"models":[{"name":"test1:latest","model":"test1:latest","modified_at":"2024-08-02T19:48:30.169074243+08:00","size":4920734545,"digest":"8c4c8d7fb040f8c385b235701123120e0dc1388b206d0b3efee94f9b5fff04e1","details":{"parent_model":"","format":"gguf","family":"llama","families":["llama"],"parameter_size":"8.0B","quantization_level":"Q4_K_M"}}]}

2.3 列举当前运行模型

列举当前运行模型可以通过GET方法调用/api/ps来实现,例如:

xx@yy:~$ curl http://localhost:11434/api/ps
{"models":[{"name":"llama3.1:latest","model":"llama3.1:latest","size":9126135808,"digest":"0533a2c19bc715df77713aa293c92b19aab5c3a19a8ec175c9681557f5f56b51","details":{"parent_model":"","format":"gguf","family":"llama","families":["llama"],"parameter_size":"8.0B","quantization_level":"Q8_0"},"expires_at":"2024-08-04T09:38:03.925108804+08:00","size_vram":9126135808}]}

2.4 展示模型详情

展示模型详情可以通过POST方法调用/api/show接口实现,其参数如下:

  • name 模型名,必填项。
  • verbose 是否输出超详细信息,可选项。
xx@yy:~$ curl http://localhost:11434/api/show -d '{"name": "llama3.1","verbose":true 
}'{"modelfile":"# Modelfile generated by \"ollama show\"\n# To build a new Modelfile based on this, replace FROM with:\n# FROM llama3.1:latest\n\nFROM /usr/share/ollama/.ollama/models/blobs/sha256-dcd637c360d411e6c842285a7625cb0476bbb5646f997bb28a9cb6420feb9bf8\nTEMPLATE \"\n |begin_of_text|\u003e |start_header_id|\u003esystem |end_header_id|\u003e\n\n{{.System}} |eot_id|\u003e |start_header_id|\u003euser |end_header_id|\u003e\n\n{{ .Prompt }} |eot_id|\u003e |start_header_id|\u003eassistant |end_header_id|\u003e\n\"\nSYSTEM \"\n你是西游记中的猪八戒,此时你还没有被贬下凡间,你还是骄傲的天蓬元帅。\n\"\nPARAMETER top_p 1\nPARAMETER stop  |begin_of_text|\u003e\nPARAMETER temperature 1\nPARAMETER top_k 100\n","parameters":"stop                           \" |begin_of_text|\u003e\"\ntemperature                    1\ntop_k                          100\ntop_p                          1","template":"\n |begin_of_text|\u003e |start_header_id|\u003esystem |end_header_id|\u003e\n\n{{.System}} |eot_id|\u003e |start_header_id|\u003euser |end_header_id|\u003e\n\n{{ .Prompt }} |eot_id|\u003e |start_header_id|\u003eassistant |end_header_id|\u003e\n","system":"\n你是西游记中的猪八戒,此时你还没有被贬下凡间,你还是骄傲的天蓬元帅。\n","details":{"parent_model":"","format":"gguf","family":"llama","families":["llama"],"parameter_size":"8.0B","quantization_level":"Q8_0"}}

2.5 删除模型

删除模型可以通过DELETE方法调用/api/delete接口实现,唯一需要传入的参数就是模型名,例如:

xx@yy:~$ curl -X DELETE http://localhost:11434/api/delete -d '{"name": "llama3.1"}'

3. 模型推理

ollama中的原生模型推理(不含OpenAI兼容)方式通过两个接口实现,一个是/api/generate,另一个是/api/chat。两者区别在于,使用前者需要提供完整的Prompt字符串,而使用后者实际上只需要提供类似{"role": "user", "content": "why is the sky blue?"}这样的输入,而真正输入大模型的Prompt由ollama自动生成,简而言之,前者自由度和灵活性更高,后者易用性更好。本文主要描述后一种接口。

调用方式:POST 请求 /api/chat

传入参数:

  • model: (必须) 使用的模型名
  • messages: 要传给大模型的对话内容,可以包含历史数据作为大模型的上下文参考,格式为message对象组成的列表

message对象包含以下字段:

  • role: 这一段话是谁说的,值可以是system(系统指令), user(用户指令)或 assistant(大模型历史回答)
  • content: 这一段话(这条消息)的具体内容
  • images (可选): 消息中提到的图片的列表,图片由base64编码表示 (用于多模态模型例如llava)

高级参数 (可选):

  • format: 指定返回的结果的格式。目前只支持json。
  • options: Modelfile中指定过的模型参数,如果提供,将会覆盖Modelfile中的配置,例如temperature。
  • stream: 如果为false 将会等模型将所有结果都输出再打包返回,默认为流式返回(生成一个Token返回一个Token)。
  • keep_alive: 模型在显存(内存)中保持多久,超过该时间模型将会被自动卸载,默认5分钟。

3.1 流式接口

ollama的接口默认流式返回结果,比如可以通过以下语句调用ollama接口获得结果:

curl http://localhost:11434/api/chat -d '{"model": "llama3.1","messages": [{"role": "user","content": "why is the sky blue?"}]
}'

之后会返回一串结果,例如:

{"model":"llama3.1","created_at":"2024-08-31T08:03:16.373065214Z","message":{"role":"assistant","content":"The"},"done":false}
{"model":"llama3.1","created_at":"2024-08-31T08:03:16.37308353Z","message":{"role":"assistant","content":" color"},"done":false}
{"model":"llama3.1","created_at":"2024-08-31T08:03:16.375438802Z","message":{"role":"assistant","content":" of"},"done":false}
......
{"model":"llama3.1","created_at":"2024-08-31T08:03:19.810821385Z","message":{"role":"assistant","content":""},"done_reason":"stop","done":true,"total_duration":10058701840,"load_duration":6568750876,"prompt_eval_count":17,"prompt_eval_duration":22186000,"eval_count":260,"eval_duration":3460578000}

可以看到,除最后一条数据外,每一条数据都返回了最终结果中一个Token对应的单词,在最后一条数据中给出结果统计,包括结束原因(是回答完成还是达到最大Token数)以及各项统计(总共耗时、各项耗时等),形式如下:

{"model": "llama3.1","created_at": "2024-08-31T08:03:19.810821385Z","message": {"role": "assistant","content": ""},"done_reason": "stop","done": true,"total_duration": 10058701840,"load_duration": 6568750876,"prompt_eval_count": 17,"prompt_eval_duration": 22186000,"eval_count": 260,"eval_duration": 3460578000
}

3.2 非流式接口

和流式接口不同,非流式接口会等模型输出完整结果后再把结果和统计数据统一打包返回。使用非流式接口只要在传入的数据中加入"stream": false即可,例如:

curl http://localhost:11434/api/chat -d '{"model": "llama3.1","messages": [{"role": "user","content": "why is the sky blue?"}],"stream": false
}'

其结果如下:

{"model": "llama3.1","created_at": "2024-08-31T08:16:54.428852236Z","message": {"role": "assistant","content": "The sky appears blue during the day due to a phenomenon called Rayleigh scattering. Here's what happens:\n\n1. **Sunlight enters Earth's atmosphere**: When sunlight from the sun enters our atmosphere, it encounters tiny molecules of gases such as nitrogen (N2) and oxygen (O2).\n2. **Scattering occurs**: These gas molecules scatter the light in all directions. However, they scatter shorter (blue) wavelengths more than longer (red) wavelengths.\n3. **Blue light is dispersed**: As a result, the blue light is scattered in all directions by the tiny molecules of gases in the atmosphere.\n4. **Our eyes see the blue**: When we look at the sky on a clear day, our eyes are seeing the blue light that has been scattered in all directions.\n\nThe same effect occurs with red light, but it's scattered less than blue light and is more easily absorbed by the Earth's surface, which is why the sky doesn't appear red. The combination of these effects gives us the blue color we see in the sky.\n\nHere are a few additional factors that affect the color of the sky:\n\n* **Dust particles**: Tiny dust particles in the atmosphere can scatter light and give the sky a hazy or brownish appearance.\n* **Clouds**: Water droplets or ice crystals in clouds can reflect sunlight and change the apparent color of the sky.\n* **Atmospheric pollution**: Air pollutants like nitrogen dioxide (NO2) can contribute to a yellowish-brown haze, especially near urban areas.\n\nIn summary, the blue color of the sky is primarily due to the scattering of light by tiny molecules in the atmosphere."},"done_reason": "stop","done": true,"total_duration": 6253269565,"load_duration": 1893592816,"prompt_eval_count": 17,"prompt_eval_duration": 21881000,"eval_count": 333,"eval_duration": 4293667000
}

3.3 系统指令覆盖

可以通过在messages中加入角色为system的信息来覆盖系统指令,例如:

curl http://localhost:11434/api/chat -d '{"model": "llama3.1","messages": [{"role": "system","content": "You are a warm-hearted assistant, and you only speak Chinese."},{"role": "user","content": "why is the sky blue?"}],"stream": false
}'

结果为:

{"model": "llama3.1","created_at": "2024-08-31T08:44:27.415020765Z","message": {"role": "assistant","content": "空气中的微小颗粒会散射光线,天空呈现蓝色颜色的原因。"},"done_reason": "stop","done": true,"total_duration": 511746253,"load_duration": 23891224,"prompt_eval_count": 34,"prompt_eval_duration": 19423000,"eval_count": 25,"eval_duration": 338212000
}

可以看到,回答变为了中文。

3.4 传入上下文

可以在messages中加入历史回答作为大模型的上下文,例如:

第一轮提问:

curl http://localhost:11434/api/chat -d '{"model": "llama3.1","messages": [{"role": "system","content": "You are a warm-hearted assistant, and you only speak Chinese."},{"role": "user","content": "李华去公园玩把腿摔断了,被送到医院了。腿摔断一般要多长时间好?"}],"stream": false
}'

第一轮回答:

{"model": "llama3.1","created_at": "2024-08-31T09:01:27.937888684Z","message": {"role": "assistant","content": "腿摔断的恢复时间不一,通常需要几个月才能基本康复。\n\n如果是轻微的骨折,一般可以在1-2个月内恢复,主要需要注意休息和康复锻炼。"},"done_reason": "stop","done": true,"total_duration": 887862128,"load_duration": 14382137,"prompt_eval_count": 57,"prompt_eval_duration": 30081000,"eval_count": 54,"eval_duration": 710430000
}

第二轮提问:

curl http://localhost:11434/api/chat -d '{"model": "llama3.1","messages": [{"role": "system","content": "You are a warm-hearted assistant, and you only speak Chinese."},{"role": "user","content": "李华去公园玩把腿摔断了,被送到医院了。腿摔断一般要多长时间好?"},{"role": "assistant","content": "腿摔断的恢复时间不一,通常需要几个月才能基本康复。\n\n如果是轻微的骨折,一般可以在1-2个月内恢复,主要需要注意休息和康复锻炼。"},{"role": "user","content": "李华为啥去医院了?"}],"stream": false
}'

第二轮回答:

{"model": "llama3.1","created_at": "2024-08-31T09:03:49.501696972Z","message": {"role": "assistant","content": "李华摔断腿了,被送到医院!"},"done_reason": "stop","done": true,"total_duration": 492796943,"load_duration": 14238622,"prompt_eval_count": 129,"prompt_eval_duration": 66976000,"eval_count": 13,"eval_duration": 173253000
}

可以看到,大模型能够参考历史信息。

3.5 生成可复现回答

ollama将会对生成的logits进行随机采样以决定下一个Token选哪个,因此影响采样的因素包括temperaturetop_ktop_p以及随机数种子,因此保持以上参数不变可以确保相同输入能够得到相同输出,例如:

curl http://localhost:11434/api/chat -d '{"model": "llama3.1","messages": [{"role": "user","content": "Hello!"}],"options": {"seed": 101,"temperature": 12.3,"top_p":0.85,"top_k":20},"stream": false
}'

4. 文本嵌入

ollama支持调用文本嵌入模型生成文本嵌入,接口调用格式为:POST /api/embeddings

例如:

curl http://localhost:11434/api/embeddings -d '{"model": "nomic-embed-text","prompt": "Here is an article about llamas..."
}'

将会返回文本的嵌入向量,其维度与所选模型相关,返回太长就不写了。

寻找嵌入模型可以通过ollama官网搜索“Embedding”,里面带zh应该对中文支持比较好。

参考链接

  1. github.com/ollama/ollama/blob/main/docs/api.md
  2. curl 命令详解(超详细)_curl -d-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

015 品牌关联分类

文章目录 后端CategoryBrandEntity.javaCategoryBrandController.javaCategoryBrandServiceImpl.javaCategoryServiceImpl.javaBrandServiceImpl.java删除 npm install pubsub-jsnpm install --save pubsub-js这个错误是由于在尝试安装 pubsub-js 时,npm 发现了项目…

计算机毕业设计 基于Python的荣誉证书管理系统的设计与实现 Python毕业设计 Python毕业设计选题 Django框架 Vue【附源码+安装调试】

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

【自动驾驶】UniAD代码解析

1.参考 论文:https://arxiv.org/pdf/2212.10156 代码:https://github.com/OpenDriveLab/UniAD 2.环境配置 docs/INSTALL.md (1)虚拟conda环境 conda create -n uniad python3.8 -y conda activate uniad (2&#…

哀牢山“禁区”爆改“景区”,双卫星智能终端给驴友多一份保障

在这个国庆假期,以神秘莫测、地势凶险著称的哀牢山走红,一天之内占据了多个微博热搜。但是,哀牢山的美丽背后隐藏着不可小觑的风险。景区方面已发出安全警示,提醒游客勿轻易涉足未知地带和未开发区域,以免发生危险。 …

论文翻译 | Dynamic Prompting: A Unified Framework for Prompt Tuning

摘要 已经证明,在从预训练的基础模型中高效提取知识方面,提示调整(prompt tuning)技术是非常有效的,这些基础模型包括预训练的语言模型(PLMs)、视觉预训练模型以及视觉-语言(V-L&…

【网络协议大花园】应用层 http协议的使用小技巧,用好了都不用加班,效率翻两倍(下篇)

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. 🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人…

HCIP--以太网交换安全(二)

端口安全 一、端口安全概述 1.1、端口安全概述:端口安全是一种网络设备防护措施,通过将接口学习的MAC地址设为安全地址防止非法用户通信。 1.2、端口安全原理: 类型 定义 特点 安全动态MAC地址 使能端口而未是能Stichy MAC功能是转换的…

[运维]6.github 本地powershell登录及设置ssh连接

当我在本地的git hub 进行修改后,需要推送到远程github仓库。 当我运行了git add . git commit -m "ingress-controller image" 以后,运行git push origin main,发现由于网络原因无法连接到远程github仓库。 此时开始设置ssh连…

数组与集合的应用-数组演练

1、获取一维数组最小值 1.1 实例说明 一维数组常用于保存线性数据,例如数据库中的单行数据就可以使用一维数组保存。本实例接收用户在文本框中输入的单行数据,其中数据都是整数数字,以不同数量的空格分割数字,如图1所示。这个先行…

Spring相关知识补充

目录 一、将Bean存储到spring(容器)中 1、使用spring-config的方式将对象存储到spring容器中 2、使用类注解的方式将Bean对象存储到容器中 1️⃣、配置扫描路径(使用注解的方式存对象的前提) 2️⃣、使用五大类注解存储Bean对…

C语言练习

接下来一段时间,博主要参加军训没有时间更新C语言知识点,但博主会每天更新一道C语言的题作为分享。 1.计算并显示整数的差 分析:1.题目并不难,首先我们要知道printf这个库函数,是用来打印数据到屏幕的库函数 2.设置变…

【AI知识点】反向传播(Backpropagation)

反向传播(Backpropagation) 是训练神经网络的核心算法,它通过反向逐层计算损失函数对每个权重的梯度,来反向逐层更新网络的权重,从而最小化损失函数。 一、反向传播的基本概念 1. 前向传播(Forward Propag…

文件丢失一键找回,四大数据恢复免费版工具推荐!

丢失数据的情况虽然不经常出现,但一旦出现都会让人头疼不已,而这时候,要如何恢复丢失的数据呢?一款免费好用的数据恢复工具就派上用场了!接下来就为大家推荐几款好用的数据恢复工具! 福昕数据恢复 直达链…

Redis list 类型

list类型 类型介绍 列表类型 list 相当于 数组或者顺序表 list内部的编码方式更接近于 双端队列 ,支持头插 头删 尾插 尾删。 需要注意的是,Redis的下标支持负数下标。 比如数组大小为5,那么要访问下标为 -2 的值可以理解为访问 5 - 2 3 …

【韩顺平Java笔记】第8章:面向对象编程(中级部分)【272-284】

272. 包基本介绍 272.1 看一个应用场景 272.2 包的三大作用 272.3 包的基本语法 273. 包原理 274. 包快速入门 在不同的包下面创建不同的Dog类 275. 包命名 276. 常用的包 一个包下,包含很多的类,java 中常用的包有: java.lang.* //lang 包是基本包,默认引入&…

农业政策与市场分析:解读当前政策导向下的农业发展趋势

在快速变化的全球经济格局中,农业作为国家稳定发展的基石,其政策走向与市场动态备受瞩目。本文将深入剖析当前的农业政策背景,探讨其对设计的导向作用,以及市场趋势的反馈与影响,为农业可持续发展提供洞见。 1. 政策背…

【大模型理论篇】大模型相关的周边技术分享-关于《NN and DL》的笔记

本文所要介绍的一本书《Neural Networks and Deep Learning》,该书作者Michael Nielsen,Y Combinator Research的研究员,是多年之前自己看的一本基础书籍,很适合入门了解一些关于深度学习的概念知识,当然也包含了一些小…

MyBatis 批量插入方案

MyBatis 批量插入 MyBatis 插入数据的方法有几种: for 循环,每次都重新连接一次数据库,每次只插入一条数据。 在编写 sql 时用 for each 标签,建立一次数据库连接。 使用 MyBatis 的 batchInsert 方法。 下面是方法 1 和 2 的…

三相逆变器中LCL滤波器分析

1.LCL滤波器 传统三相逆变器使用的是L型滤波器,其设计简单,但也存在着一些问题,如在同样的滤波效果下,L型滤波器电感尺寸、重量较大,成本较高,并且随着电感值的增大,其上的电压降增加比较明显&…

【MySQL必知会】事务

目录 🌈前言🌈 📁 事务概念 📁 事务操作 📁 事务提交方式 📁 隔离级别 📁 MVCC 📂 3个隐藏列字段 📂 undo日志 📂 Read View视图 📁 RR和R…