自用提示词02 || Prompt Engineering || RAG数据切分 || 作用:通过LLM将文档切分成chunks

写在前面 :要想做一个比较好RAG系统,我认为还是在数据收集和清洗上下一点功夫。因为要想检索有效 - > 你能提供给模型更有价值的信息。现有chunk的方法有很多,但是我试了很多种(包括一些基于大量规则的),最后发现很难适配多样化的数据集(针对不同来源,比如论文、内部资料)。

基于这个思路,我想的是让LLM本身来切分文档。优点:1.LLM理解能力强,相较于传统设定规则,泛化性更好; 缺点:1.消耗token;2.隐私泄露(但是RAG系统的模型可能也是闭源的,所以问题不是很大); 3.需要自己整理(一个良好的RAG系统的资料库还是需要人来重复审查)

因此,总结了一个用于chunk的提示词。


RAG数据库内容切分规则

核心原则: 每个切分出的"语义块"都应尽可能成为一个能够独立回答特定问题的知识单元。它应该包含足够的上下文,避免过于碎片化,同时也要避免因内容过长而导致信息冗杂、检索不精确。

具体规则如下:

以最小完整语义为单位:

优先根据文档的标题层级(如 ##、#####)进行切分。每个 ##### 标题下的内容通常是一个独立的知识点,适合作为一个基础块。

对于介绍概念(如SFT, RAG, LoRA)的部分,将每个概念的定义、作用和特点作为一个独立的块。

对于对比性内容(如"微调还是RAG?"),将其作为一个整体块,因为其价值在于对比。

保留上下文路径:

每个语义块都应包含其在文档结构中的"路径",例如 二、需求和技术 -> 3. 微调还是RAG?。这有助于在RAG系统中更好地理解块的上下文,或在生成答案时提供来源信息。

步骤化内容独立成块:

在教程部分(如"四、模型微调"),每一个带有编号的步骤(如 1. 准备硬件资源、2. 本机通过 SSH 连接)都是一个独立的操作单元,应切分为一个单独的块。这使得用户可以直接查询某个具体步骤。

代码与解释不分离:

代码片段(如 python、bash、json 代码)必须和其前后的解释性文字、用途说明放在同一个块中。分离的代码块没有上下文,几乎无用。

元数据丰富化:

为每个块添加元数据(Metadata),至少包括:

chunk_id: 唯一标识符。

source: 文档来源(pasted_text_0.txt)。

path: 上下文路径。

title: 该块的核心主题/标题。

keywords: 块内的核心关键词(如 LoRA, FastAPI, 微调, 部署),便于混合检索。


一个例子:

内容语义块切分结果

根据以上规则,我将您提供的文档内容切分如下。每个块都附带了建议的元数据。


Chunk ID: 1
Source: pasted_text_0.txt
Path: 一、简介
Title: 视频内容整体介绍
Keywords: 简介, SFT, RLHF, RAG, LoRA, Llama-Factory, FastAPI
Content:

本期视频主要分为以下五部分:

  1. 需求和技术: 介绍企业对大模型的个性化需求,以及SFT、RLHF、RAG的基本概念、解决的问题和选择方式。并详细介绍微调算法分类、LoRA算法和实现框架。
  2. 整体步骤说明: 演示在Linux系统上微调大模型、部署模型、暴露API给web后端调用,直至前端展示的全过程。
  3. 模型微调: 使用LLama-Factory框架和LoRA算法,对DeepSeek-R1-Distill-Qwen-1.5B基座模型进行微调。
  4. 模型部署和暴露接口: 使用FastAPI框架进行模型部署。
  5. web后端调用: 通过HTTP请求与部署好的模型进行交互。

Chunk ID: 2
Source: pasted_text_0.txt
Path: 二、需求和技术 -> 1. 企业对于大模型的不同类型个性化需求
Title: 企业对大模型的个性化需求及对应技术
Keywords: 个性化需求, 企业知识, SFT, RLHF, RAG, 实时信息
Content:

企业对于大模型的不同类型个性化需求:

  • 提高模型对企业专有信息、特定行业领域知识的理解 : 适用技术 SFT
    • 案例一:希望大模型能更好理解蟹堡王的企业专有知识,如蟹老板的女儿为什么是一头鲸鱼。
    • 案例二:希望大模型能特别精通于汉堡制作,并熟练回答关于汉堡行业的所有问题。
  • 提供个性化和互动性强的服务 : 适用技术 RLHF
    • 案例三:希望大模型能够基于顾客的反馈调整回答方式,比如生成更二次元风格的回答还是更加学术风格的回答。
  • 获取和生成最新的、实时的信息 : 适用技术 RAG
    • 案例四:希望大模型能够实时获取蟹堡王的最新的促销活动信息和每周菜单更新。

Chunk ID: 3
Source: pasted_text_0.txt
Path: 二、需求和技术 -> 2. SFT(有监督微调)、RLHF(强化学习)、RAG(检索增强生成)
Title: SFT(有监督微调)基本概念
Keywords: SFT, Supervised Fine-Tuning, 有监督微调, 预训练模型, 特定领域
Content:
SFT(Supervised Fine-Tuning)有监督微调 : 通过提供人工标注的数据,进一步训练预训练模型,让模型能够更加精准地处理特定领域的任务。除了"有监督微调",还有"无监督微调""自监督微调",当大家提到"微调"时通常是指有监督微调。


Chunk ID: 4
Source: pasted_text_0.txt
Path: 二、需求和技术 -> 2. SFT(有监督微调)、RLHF(强化学习)、RAG(检索增强生成)
Title: RLHF(强化学习)基本概念 (含DPO和PPO)
Keywords: RLHF, 强化学习, DPO, PPO, 人类反馈, 奖励信号
Content:
RLHF(Reinforcement Learning from Human Feedback)强化学习:

  • DPO(Direct Preference Optimization) : 核心思想是通过 人类对比选择(例如:A 选项和 B 选项,哪个更好)直接优化生成模型,使其产生更符合用户需求的结果;调整幅度大。
  • PPO(Proximal Policy Optimization) : 核心思想是通过 奖励信号 (如点赞、点踩)来 渐进式调整模型的行为策略;调整幅度小。

Chunk ID: 5
Source: pasted_text_0.txt
Path: 二、需求和技术 -> 2. SFT(有监督微调)、RLHF(强化学习)、RAG(检索增强生成)
Title: RAG(检索增强生成)基本概念
Keywords: RAG, Retrieval-Augmented Generation, 检索增强生成, 外部信息
Content:
RAG(Retrieval-Augmented Generation)检索增强生成: 将外部信息检索与文本生成结合,帮助模型在生成答案时,实时获取外部信息和最新信息。


Chunk ID: 6
Source: pasted_text_0.txt
Path: 二、需求和技术 -> 3. 微调还是RAG?
Title: 微调与RAG的选择策略
Keywords: 微调, RAG, 选择, 数据量, 动态更新
Content:
微调还是RAG?

  • 微调 :
    • 适合:拥有非常充足的数据。
    • 优点:能够直接提升模型的固有能力;无需依赖外部检索。
  • RAG :
    • 适合:只有非常非常少的数据;动态更新的数据。
    • 缺点:每次回答问题前需耗时检索知识库;回答质量依赖于检索系统的质量。
  • 总结 :
    • 少量企业私有知识:最好微调和 RAG 都做;资源不足时优先 RAG。
    • 会动态更新的知识:RAG。
    • 大量垂直领域知识:微调。

Chunk ID: 7
Source: pasted_text_0.txt
Path: 二、需求和技术 -> 4. SFT(有监督微调)
Title: SFT详解:人工标注数据与预训练模型
Keywords: SFT, 人工标注, 数据格式, 预训练模型, 基座模型
Content:
SFT(有监督微调) : 通过提供人工标注 的数据,进一步训练预训练模型 ,让模型能够更加精准地处理特定领域的任务。

  • 人工标注的数据格式示例 :
    • 分类系统: {"image_path": "path/image1.jpg", "label": "SpongeBobSquarePants"}
    • 对话系统: {"instruction": "请问你是谁", "input": "", "output": "您好,我是蟹堡王的神奇海螺..."}
  • 预训练模型(基座模型): 指已经在大量数据上训练过的模型,也就是我们微调前需要预先下载的开源模型。它具备了较为通用的知识和能力,可以在此基础上进行进一步的微调(fine-tuning)以适应特定的任务或领域。

Chunk ID: 8
Source: pasted_text_0.txt
Path: 二、需求和技术 -> 4. SFT(有监督微调)
Title: 微调算法的分类:全参数微调与部分参数微调
Keywords: 全参数微调, 部分参数微调, LoRA, 过拟合, 计算资源
Content:
微调算法的分类:

  • 全参数微调(Full Fine-Tuning) :
    • 描述:对整个预训练模型进行微调,会更新所有参数。
    • 优点:通常能得到最佳的性能;能够适应不同任务和场景。
    • 缺点:需要较大的计算资源并且容易出现过拟合。
  • 部分参数微调(Partial Fine-Tuning) :
    • 描述:只更新模型的部分参数(例如某些层或模块)。
    • 优点:减少了计算成本;减少过拟合风险;能够以较小的代价获得较好的结果。
    • 缺点:可能无法达到最佳性能。
    • 最著名算法:LoRA

Chunk ID: 9
Source: pasted_text_0.txt
Path: 二、需求和技术 -> 5. LoRA 微调算法
Title: LoRA微调算法详解
Keywords: LoRA, 低秩矩阵分解, 矩阵的秩, Transformer, Attention Is All You Need
Content:
LoRA 微调算法:

  • 论文 : LoRA由Microsoft Research于2021年提出,通过低秩矩阵分解 进行部分参数微调。论文为《LoRA: Low-Rank Adaptation of Large Language Models》。大语言模型开山论文是2017年Google的《Attention Is All You Need》,提出了Transformer架构。
  • 矩阵的"秩" : 指矩阵中线性无关 的行或列的最大数量,反映矩阵所包含的有效信息量
  • 原理: LoRA通过在原模型权重旁边增加两个低秩矩阵(A和B)来模拟权重的更新,训练时只更新这两个小矩阵的参数,从而实现部分参数微调。
  • 权重合并: LoRA训练结束后通常需要将训练得到的低秩矩阵权重与原模型权重进行合并。

Chunk ID: 10
Source: pasted_text_0.txt
Path: 二、需求和技术 -> 6. 微调常见实现框架
Title: 常见的大模型微调实现框架
Keywords: Llama-Factory, transformers.Trainer, DeepSpeed, 微调框架
Content:
微调常见实现框架:

  • Llama-Factory : 由国内北航 开源的低代码大模型训练框架,可以实现零代码微调,简单易学,热度高,建议新手入门。
  • transformers.Trainer : 由 Hugging Face 提供的高层 API ,适用于各种NLP任务的微调,提供标准化的训练流程,适合需要更多定制化 的场景和部署生产
  • DeepSpeed : 由微软 开发的开源深度学习优化库,适合大规模模型训练和分布式训练 ,在预训练和资源密集型训练时用得较多。

Chunk ID: 11
Source: pasted_text_0.txt
Path: 四、模型微调 -> 1. 准备硬件资源、搭建环境
Title: 微调步骤1:准备硬件与环境
Keywords: AutoDL, 云平台, 深度学习环境, anaconda, cuda
Content:
模型微调步骤1:准备硬件资源、搭建环境

  • 在云平台上租用一个实例(如 AutoDL)。
  • 云平台一般会预先配置好常用的深度学习环境,如 anaconda, cuda 等等。

Chunk ID: 12
Source: pasted_text_0.txt
Path: 四、模型微调 -> 2. 本机通过 SSH 连接到远程服务器
Title: 微调步骤2:SSH连接远程服务器
Keywords: SSH, VSCode, Remote-SSH, autodl-tmp
Content:
模型微调步骤2:本机通过 SSH 连接到远程服务器

  • 使用 Visual Studio Code 的 Remote-SSH 插件连接到你租用的服务器。
  • 连接后打开个人数据盘文件夹 /root/autodl-tmp

Chunk ID: 13
Source: pasted_text_0.txt
Path: 四、模型微调 -> 3. LLaMA-Factory 安装部署
Title: 微调步骤3:LLaMA-Factory 安装部署
Keywords: LLaMA-Factory, git clone, conda, pip install
Content:
LLaMA-Factory 安装部署:

  1. 克隆仓库: git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git
  2. 进入目录: cd LLaMA-Factory
  3. (可选)修改conda环境安装路径到数据盘。
  4. 创建conda虚拟环境: conda create -n llama-factory python=3.10 (必须是3.10版本)
  5. 激活环境: conda activate llama-factory
  6. 安装依赖: pip install -e ".[torch,metrics]" (如pip报错,先执行 conda install pip)
  7. 检验安装: llamafactory-cli version

Chunk ID: 14
Source: pasted_text_0.txt
Path: 四、模型微调 -> 4. 启动 LLama-Factory 的可视化微调界面
Title: 微调步骤4:启动LLaMA-Factory WebUI
Keywords: LLaMA-Factory, webui, Gradio
Content:
启动 LLama-Factory 的可视化微调界面 (由 Gradio 驱动)

  • 在激活的 llama-factory conda 环境中,执行以下命令:

    bash 复制代码
    llamafactory-cli webui

Chunk ID: 15
Source: pasted_text_0.txt
Path: 四、模型微调 -> 5. 配置端口转发
Title: 微调步骤5:配置SSH端口转发
Keywords: SSH隧道, 端口转发, AutoDL
Content:
配置端口转发:

  • 为了在本地访问服务器上运行的WebUI,需要设置SSH隧道。

  • 本地电脑 的终端中执行代理命令,将服务器的7860端口映射到本地的7860端口。示例命令如下(需要替换为自己实例的地址和端口):

    bash 复制代码
    ssh -CNg -L 7860:127.0.0.1:7860 root@123.125.240.150 -p 42151

Chunk ID: 16
Source: pasted_text_0.txt
Path: 四、模型微调 -> 6. 从 HuggingFace 上下载基座模型
Title: 微调步骤6:下载HuggingFace基座模型
Keywords: HuggingFace, hf-mirror, huggingface-cli, DeepSeek
Content:
从 HuggingFace 上下载基座模型:

  1. 创建模型存放目录: mkdir Hugging-Face
  2. 修改HuggingFace镜像源以加速下载: export HF_ENDPOINT=https://hf-mirror.com
  3. 修改模型默认下载位置: export HF_HOME=/root/autodl-tmp/Hugging-Face (注意:此为临时环境变量)
  4. 安装下载工具: pip install -U huggingface_hub
  5. 执行下载命令: huggingface-cli download --resume-download deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B
  • 如果已在本地下载模型压缩包,可通过JupyterLab上传或SFTP协议传输到服务器。

Chunk ID: 17
Source: pasted_text_0.txt
Path: 四、模型微调 -> 7. 可视化页面上加载模型测试
Title: 微调步骤7:加载并测试基座模型
Keywords: LLaMA-Factory, 加载模型, snapshots
Content:
可视化页面上加载模型测试,检验是否加载成功:

  • 在LLaMA-Factory的WebUI中,加载模型时填写的路径需要是模型文件夹内部的特定快照哈希值路径,而不是整个模型文件夹的路径。
  • 示例路径: /root/autodl-tmp/Hugging-Face/hub/models--deepseek-ai--DeepSeek-R1-Distill-Qwen-1.5B/snapshots/530ca3e1ad39d440e182c2e4317aa40f012512fa

Chunk ID: 18
Source: pasted_text_0.txt
Path: 四、模型微调 -> 8. 准备用于训练的数据集
Title: 微调步骤8:准备训练数据集
Keywords: 数据集, json, instruction, output, dataset_info.json
Content:
准备用于训练的数据集,并添加到指定位置:

  1. 按照instruction-input-output格式准备用于微调的数据集 magic_conch.json

    json 复制代码
    [
      {
        "instruction": "请问你是谁",
        "input": "",
        "output": "您好,我是蟹堡王的神奇海螺..."
      }
    ]
  2. 修改 LLaMA-Factory/data/ 目录下的 dataset_info.json 文件,添加自定义数据集的描述。

    json 复制代码
    "magic_conch": {
      "file_name": "magic_conch.json"
    }
  3. 将数据集文件 magic_conch.json 放到 LLaMA-Factory/data/ 目录下。


Chunk ID: 19
Source: pasted_text_0.txt
Path: 四、模型微调 -> 9. 在页面上进行微调的相关设置
Title: 微调步骤9:配置训练参数并开始微调
Keywords: 学习率, 训练轮数, 截断长度, 批处理大小, 梯度累积, 损失曲线
Content:
在页面上进行微调的相关设置,开始微调:

  1. 选择微调算法: Lora
  2. 添加数据集: magic_conch
  3. 修改训练参数 :
    • 学习率 (Learning Rate): 权重更新的幅度。
    • 训练轮数 (Epochs): 决定模型学习次数,防止欠拟合或过拟合。
    • 最大梯度范数 (Max Gradient Norm): 防止梯度爆炸。
    • 截断长度 (Truncation Length): 处理长文本时截断的最大长度,避免内存溢出。
    • 批处理大小 (Batch Size): 每次送入模型训练的数据量。
    • 梯度累积 (Gradient Accumulation): 累积多个小批次的梯度后再一次性更新参数。
    • 验证集比例 (Validation Set Proportion): 用于评估模型训练效果的数据比例。
  4. 启动训练 : 可在页面点击启动,或复制命令到终端使用 nohup 后台执行。
  5. 监控训练: 观察损失曲线,尽可能将损失降到最低。如损失降低太慢可尝试增大学习率;如训练结束损失仍下降可增大训练轮数。

Chunk ID: 20
Source: pasted_text_0.txt
Path: 四、模型微调 -> 10. 微调结束,评估微调效果
Title: 微调步骤10:评估微调效果
Keywords: 评估, 损失曲线, 检查点, checkpoint, 数据增强
Content:
微调结束,评估微调效果:

  • 评估方法: 观察最终损失值和损失曲线变化;在交互页面通过对话测试效果。
  • 检查点 (Checkpoint): 保存了训练过程中的模型状态,对LoRA来说,即训练得到的A和B两个低秩矩阵的权重。
  • 效果不理想的优化方向 :
    • 使用更强的预训练模型。
    • 增加数据量。
    • 优化数据质量(数据清洗、数据增强)。
    • 调整训练参数(学习率、训练轮数等)。

Chunk ID: 21
Source: pasted_text_0.txt
Path: 四、模型微调 -> 11. 导出合并后的模型
Title: 微调步骤11:导出并合并LoRA模型
Keywords: 导出模型, 合并权重, LoRA
Content:
导出合并后的模型:

  • 为什么要合并: LoRA训练只得到低秩矩阵(适配器),不直接修改原模型权重。合并步骤将LoRA权重与原始模型权重融合,生成一个可直接部署的完整模型。
  • 操作 :
    1. 创建用于存放导出模型的目录: mkdir -p Models/deepseek-r1-1.5b-merged
    2. 在LLaMA-Factory页面的"导出模型"选项卡中,配置好导出路径,执行导出。

Chunk ID: 22
Source: pasted_text_0.txt
Path: 五、模型部署和暴露接口 -> 1. 创建新的 conda 虚拟环境用于部署模型
Title: 部署步骤1:创建部署环境
Keywords: conda, fastapi, uvicorn, transformers, pytorch
Content:
创建新的 conda 虚拟环境用于部署模型:

  1. 创建环境: conda create -n fastApi python=3.10

  2. 激活环境: conda activate fastApi

  3. 安装依赖:

    bash 复制代码
    conda install -c conda-forge fastapi uvicorn transformers pytorch
    pip install safetensors sentencepiece protobuf

Chunk ID: 23
Source: pasted_text_0.txt
Path: 五、模型部署和暴露接口 -> 2. 通过 FastAPI 部署模型并暴露 HTTP 接口
Title: 部署步骤2:使用FastAPI部署模型并暴露API
Keywords: FastAPI, uvicorn, AutoModelForCausalLM, AutoTokenizer, API
Content:
通过 FastAPI 部署模型并暴露 HTTP 接口:

  1. 创建应用文件夹和入口文件: mkdir Apptouch main.py

  2. 编写 main.py 代码,加载合并后的模型和分词器,并创建一个 /generate 的GET接口来接收prompt并返回生成结果。

    python 复制代码
    from fastapi import FastAPI
    from transformers import AutoModelForCausalLM, AutoTokenizer
    import torch
    
    app = FastAPI()
    model_path = "/root/autodl-tmp/Models/deepseek-r1-1.5b-merged"
    tokenizer = AutoTokenizer.from_pretrained(model_path)
    device = "cuda" if torch.cuda.is_available() else "cpu"
    model = AutoModelForCausalLM.from_pretrained(model_path).to(device)
    
    @app.get("/generate")
    async def generate_text(prompt: str):
        inputs = tokenizer(prompt, return_tensors="pt").to(device)
        outputs = model.generate(inputs["input_ids"], max_length=150)
        generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True)
        return {"generated_text": generated_text}
  3. 启动FastAPI应用: uvicorn main:app --reload --host 0.0.0.0

  4. 配置端口转发(如将服务器8000端口映射到本地),即可通过 http://localhost:8000/docs 或 Postman 测试接口。


Chunk ID: 24
Source: pasted_text_0.txt
Path: 六、web后端调用 -> 1. pom.xml 导入依赖 & 2. 自定义方法发送并处理 HTTP 请求
Title: 后端调用步骤1&2:Java后端调用AI接口
Keywords: Java, Spring, RestTemplate, httpclient5, pom.xml
Content:
Java后端调用AI服务:

  1. pom.xml 中导入HTTP客户端依赖:

    xml 复制代码
    <dependency>  
        <groupId>org.apache.httpcomponents.client5</groupId>  
        <artifactId>httpclient5</artifactId>  
        <version>5.2.1</version>  
    </dependency>
  2. 在Spring Service中,使用 RestTemplate 或其他HTTP客户端,向部署好的FastAPI服务地址(如 http://localhost:8000/generate?prompt=XXX)发送GET请求,并解析返回的JSON以获取生成文本。

    java 复制代码
    @Service  
    public class ChatServiceImpl implements ChatService {  
        // ...
        @Override  
        public String callAiForOneReply(String prompt) {  
            String url = String.format("%s/generate?prompt=%s", baseUrl, prompt);  
            GenerateResponse response = restTemplate.getForObject(url, GenerateResponse.class);  
            return response != null ? response.getGenerated_text() : "";  
        }  
    }

Chunk ID: 25
Source: pasted_text_0.txt
Path: 六、web后端调用 -> 3. 本机启动 Demo 前后端工程
Title: 后端调用步骤3:启动Demo前后端工程
Keywords: npm install, npm run dev, mvn clean install, 前端, 后端
Content:
本机启动 Demo 前后端工程,测试对话效果:

  • 启动前端工程 :
    • 克隆项目: https://github.com/huangyf2013320506/magic_conch_frontend.git
    • 执行: npm install 然后 npm run dev
  • 启动后端工程 :
    • 克隆项目: https://github.com/huangyf2013320506/magic_conch_backend.git
    • 执行: mvn clean install
    • 在IDE中运行 MagicConchBackendApplication.java 主类。

Chunk ID: 26
Source: pasted_text_0.txt
Path: 六、web后端调用 -> 5. 如何开放服务端口到公网 & 6. 企业部署还需考虑
Title: 服务部署注意事项:公网开放与企业级部署
Keywords: 公网, 端口开放, AutoDL, 高并发, 高可用, 安全
Content:
服务部署注意事项:

  • 如何开放服务端口到公网: AutoDL等平台通常仅支持个人用户通过端口转发在本地访问。如需开放服务端口到公网,一般需要企业认证。
  • 企业部署考虑: 企业级部署除了功能实现,还需重点考虑高并发、高可用、安全机制等问题。
相关推荐
阿水实证通4 小时前
面向社科研究者:用深度学习做因果推断(二)
深度学习·1024程序员节·因果推断·实证分析·科研创新
文火冰糖的硅基工坊4 小时前
[人工智能-大模型-83]:模型层技术 - 前向预测:神经网络是如何产生涌现智能的?背后的本质是什么?
人工智能·深度学习·神经网络
赋能大师兄4 小时前
数据库锁分类和总结
数据库
子不语1805 小时前
深度学习——IDE之Jupyter
人工智能·深度学习·jupyter
高洁016 小时前
【无标题】大模型-模型压缩:量化、剪枝、蒸馏、二值化 (2
人工智能·python·深度学习·神经网络·知识图谱
越来越无动于衷6 小时前
SQL 拼接完全指南
数据库·sql
WWZZ20256 小时前
快速上手大模型:深度学习2(实践:深度学习基础、线性回归)
人工智能·深度学习·算法·计算机视觉·机器人·大模型·slam
weixin_46687 小时前
Redis数据库基础
数据库·redis·缓存