寫在前面:要想做一個比較好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:
本期視頻主要分為以下五部分:
- 需求和技術: 介紹企業對大模型的個性化需求,以及SFT、RLHF、RAG的基本概念、解決的問題和選擇方式。並詳細介紹微調算法分類、LoRA算法和實現框架。
- 整體步驟説明: 演示在Linux系統上微調大模型、部署模型、暴露API給web後端調用,直至前端展示的全過程。
- 模型微調: 使用LLama-Factory框架和LoRA算法,對DeepSeek-R1-Distill-Qwen-1.5B基座模型進行微調。
- 模型部署和暴露接口: 使用FastAPI框架進行模型部署。
- 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 安裝部署:
- 克隆倉庫:
git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git - 進入目錄:
cd LLaMA-Factory - (可選)修改conda環境安裝路徑到數據盤。
- 創建conda虛擬環境:
conda create -n llama-factory python=3.10(必須是3.10版本) - 激活環境:
conda activate llama-factory - 安裝依賴:
pip install -e ".[torch,metrics]"(如pip報錯,先執行conda install pip) - 檢驗安裝:
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-factoryconda 環境中,執行以下命令:
llamafactory-cli webui
Chunk ID: 15
Source: pasted_text_0.txt
Path: 四、模型微調 -> 5. 配置端口轉發
Title: 微調步驟5:配置SSH端口轉發
Keywords: SSH隧道, 端口轉發, AutoDL
Content:
配置端口轉發:
- 為了在本地訪問服務器上運行的WebUI,需要設置SSH隧道。
- 在本地電腦的終端中執行代理命令,將服務器的7860端口映射到本地的7860端口。示例命令如下(需要替換為自己實例的地址和端口):
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 上下載基座模型:
- 創建模型存放目錄:
mkdir Hugging-Face - 修改HuggingFace鏡像源以加速下載:
export HF_ENDPOINT=https://hf-mirror.com - 修改模型默認下載位置:
export HF_HOME=/root/autodl-tmp/Hugging-Face(注意:此為臨時環境變量) - 安裝下載工具:
pip install -U huggingface_hub - 執行下載命令:
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:
準備用於訓練的數據集,並添加到指定位置:
- 按照
instruction-input-output格式準備用於微調的數據集magic_conch.json。
[
{
"instruction": "請問你是誰",
"input": "",
"output": "您好,我是蟹堡王的神奇海螺..."
}
]
- 修改
LLaMA-Factory/data/目錄下的dataset_info.json文件,添加自定義數據集的描述。
"magic_conch": {
"file_name": "magic_conch.json"
}
- 將數據集文件
magic_conch.json放到LLaMA-Factory/data/目錄下。
Chunk ID: 19
Source: pasted_text_0.txt
Path: 四、模型微調 -> 9. 在頁面上進行微調的相關設置
Title: 微調步驟9:配置訓練參數並開始微調
Keywords: 學習率, 訓練輪數, 截斷長度, 批處理大小, 梯度累積, 損失曲線
Content:
在頁面上進行微調的相關設置,開始微調:
- 選擇微調算法: Lora
- 添加數據集: magic_conch
- 修改訓練參數:
- 學習率 (Learning Rate): 權重更新的幅度。
- 訓練輪數 (Epochs): 決定模型學習次數,防止欠擬合或過擬合。
- 最大梯度範數 (Max Gradient Norm): 防止梯度爆炸。
- 截斷長度 (Truncation Length): 處理長文本時截斷的最大長度,避免內存溢出。
- 批處理大小 (Batch Size): 每次送入模型訓練的數據量。
- 梯度累積 (Gradient Accumulation): 累積多個小批次的梯度後再一次性更新參數。
- 驗證集比例 (Validation Set Proportion): 用於評估模型訓練效果的數據比例。
- 啓動訓練: 可在頁面點擊啓動,或複製命令到終端使用
nohup後台執行。 - 監控訓練: 觀察損失曲線,儘可能將損失降到最低。如損失降低太慢可嘗試增大學習率;如訓練結束損失仍下降可增大訓練輪數。
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權重與原始模型權重融合,生成一個可直接部署的完整模型。
- 操作:
- 創建用於存放導出模型的目錄:
mkdir -p Models/deepseek-r1-1.5b-merged - 在LLaMA-Factory頁面的“導出模型”選項卡中,配置好導出路徑,執行導出。
Chunk ID: 22
Source: pasted_text_0.txt
Path: 五、模型部署和暴露接口 -> 1. 創建新的 conda 虛擬環境用於部署模型
Title: 部署步驟1:創建部署環境
Keywords: conda, fastapi, uvicorn, transformers, pytorch
Content:
創建新的 conda 虛擬環境用於部署模型:
- 創建環境:
conda create -n fastApi python=3.10 - 激活環境:
conda activate fastApi - 安裝依賴:
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 接口:
- 創建應用文件夾和入口文件:
mkdir App和touch main.py - 編寫
main.py代碼,加載合併後的模型和分詞器,並創建一個/generate的GET接口來接收prompt並返回生成結果。
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}
- 啓動FastAPI應用:
uvicorn main:app --reload --host 0.0.0.0 - 配置端口轉發(如將服務器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服務:
- 在
pom.xml中導入HTTP客户端依賴:
<dependency>
<groupId>org.apache.httpcomponents.client5</groupId>
<artifactId>httpclient5</artifactId>
<version>5.2.1</version>
</dependency>
- 在Spring Service中,使用
RestTemplate或其他HTTP客户端,向部署好的FastAPI服務地址(如http://localhost:8000/generate?prompt=XXX)發送GET請求,並解析返回的JSON以獲取生成文本。
@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等平台通常僅支持個人用户通過端口轉發在本地訪問。如需開放服務端口到公網,一般需要企業認證。
- 企業部署考慮: 企業級部署除了功能實現,還需重點考慮高併發、高可用、安全機制等問題。