學習LLM大語言模型之路(二) - 大型語言模型最佳化:數據處理、向量搜尋與模型微調

更新於 發佈於 閱讀時間約 10 分鐘

學習內容

  • 了解 Tokenization、Embedding、向量搜索(FAISS、Chroma)
  • 學習如何微調 LLM(LoRA、PEFT)
  • 準備數據集(清理、標註、格式化)


1️⃣ 準備數據集(清理、標註、格式化)

  • 移除噪音、標點符號、格式化文本
  • 使用 JSON 標註數據,準備訓練集

🔹 數據清理

import re

def clean_text(text):

text = text.lower() # 轉換為小寫

text = re.sub(r'\s+', ' ', text) # 移除多餘空格

text = re.sub(r'[^\w\s]', '', text) # 移除標點符號

return text

raw_text = "Hello, LLM! 這是一個測試文本。"

cleaned_text = clean_text(raw_text)

print(cleaned_text) # "hello llm 這是一個測試文本"

🔹 數據標註

import json

data = [

{"text": "LLM 是什麼?", "label": "問答"},

{"text": "Transformer 是 NLP 的核心技術", "label": "知識"}

]

with open("dataset.json", "w") as f:

json.dump(data, f, ensure_ascii=False, indent=4)



2️⃣ Tokenization & Embedding

  • 使用 Hugging Face Tokenizer 進行分詞
  • 透過 OpenAI Embeddings 轉換文本為向量

🔹 什麼是 Tokenization(分詞)?

Tokenization 是 將文本轉換為 Token(子詞單位),讓 LLM 能夠理解和處理語言。

🔹 Tokenization 方法

raw-image

🔹 使用 Hugging Face 進行 Tokenization

from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-2-7b-hf")
tokens = tokenizer.encode("LLM 是什麼?", return_tensors="pt")
print(tokens) # 顯示 Token ID

🔹 Embedding(向量化)

🔹 什麼是 Embedding?

Embedding 是 將文本轉換為向量,讓 LLM 能夠進行語義理解與檢索。

🔹 使用 OpenAI Embeddings

from langchain.embeddings import OpenAIEmbeddings

embeddings = OpenAIEmbeddings()
vector = embeddings.embed_query("LLM 是什麼?")
print(vector[:5]) # 顯示前 5 個向量值


3️⃣ 向量搜索(FAISS、Chroma)

  • 建立 FAISS 向量數據庫,進行相似度檢索
  • 使用 ChromaDB 儲存與查詢文本向量

🔹 什麼是向量搜索?

向量搜索讓 LLM 能夠 查找最相關的文本,適用於 檢索增強生成(RAG)

🔹 使用 FAISS 建立向量數據庫

from langchain.vectorstores import FAISS
from langchain.schema import Document

documents = [
Document(page_content="LLM 是大型語言模型,如 GPT-4"),
Document(page_content="LangChain 是 LLM 應用框架"),
Document(page_content="FAISS 是向量搜索庫")
]

vector_db = FAISS.from_documents(documents, embeddings)

query = "什麼是 LangChain?"
docs = vector_db.similarity_search(query)
print(f"檢索結果: {docs[0].page_content}")

🔹 使用 ChromaDB

import chromadb

chroma_client = chromadb.PersistentClient(path="./chroma_db")
collection = chroma_client.get_or_create_collection(name="llm_docs")

collection.add(
documents=["LLM 是大型語言模型", "LangChain 是 LLM 框架"],
ids=["doc1", "doc2"]
)

query = "什麼是 LangChain?"
results = collection.query(query_texts=[query], n_results=1)
print(results["documents"][0])


4️⃣ 微調 LLM(LoRA、PEFT)

  • 使用 LoRA 進行輕量級微調,降低計算成本
  • 透過 PEFT 只微調部分參數,提高效率

🔹 LoRA(低秩適應)

LoRA 是 輕量級微調技術,適用於 LLM 訓練

from peft import LoraConfig, get_peft_model
from transformers import AutoModelForCausalLM, AutoTokenizer

model_name = "meta-llama/Llama-2-7b-hf"
model = AutoModelForCausalLM.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)

config = LoraConfig(
r=8, lora_alpha=32, target_modules=["q_proj", "v_proj"], lora_dropout=0.1
)
model = get_peft_model(model, config)

text = "LLM 是什麼?"
inputs = tokenizer(text, return_tensors="pt")
outputs = model.generate(**inputs)

print(tokenizer.decode(outputs[0]))

🔹 PEFT(參數高效微調)

PEFT 讓 LLM 只微調 部分參數,降低計算成本:

from peft import PeftModel

peft_model = PeftModel.from_pretrained(model, "peft/llama-2-7b")
outputs = peft_model.generate(**inputs)
print(tokenizer.decode(outputs[0]))


5️⃣構建數據處理管道

🔹 數據流

graph TD;
Data[原始數據] --> Cleaning[數據清理];
Cleaning --> Tokenization[分詞];
Tokenization --> Embedding[向量化];
Embedding --> VectorDB[向量數據庫];
VectorDB --> LLM[LLM 推理];


6️⃣設計 Prompt Engineering 策略

🔹 Prompt Engineering 重要性

Prompt Engineering 讓 LLM 生成更準確的回應

常見策略:

Zero-shot Prompting:直接詢問

Few-shot Prompting:提供範例

Chain-of-Thought(CoT):引導推理

🔹 設計最佳 Prompt

prompt = """
你是一個專業的 AI 助理,請根據以下問題提供詳細解釋:
問題:什麼是 LLM?
請用簡單易懂的方式回答。
"""


7️⃣學習成果

🔹 掌握 NLP 數據處理流程,能夠清理、標註、格式化數據

🔹 熟悉 Tokenization & Embedding,能夠將文本轉換為向量

🔹 建立向量數據庫,提升 LLM 的檢索能力(RAG)

🔹 成功微調 LLM,降低計算成本,提高模型效能

🔹 設計 Prompt Engineering 策略,優化 LLM 回應品質


下回我們來探討一下Prompt Engineering的策略和實作。


留言
avatar-img
留言分享你的想法!
avatar-img
宅D嘉的開發人生
20會員
43內容數
加密貨幣很有趣,遊戲開發也很有趣,AI也有點意思,身為一個跨多領域的軟體工程師,喜歡研究新鮮的事物,歡迎來到我的世界,一起坐上這艘開往未來探索新奇的列車。
你可能也想看
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 回顧 AI說書 - 從0開始 - 129 中說,Bidirectional Encoder Representations from Transformers (BER
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 回顧 AI說書 - 從0開始 - 129 中說,Bidirectional Encoder Representations from Transformers (BER
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 總結一下目前有的素材: AI說書 - 從0開始 - 103:資料集載入 AI說書 - 從0開始 - 104:定義資料清洗的函數 AI說書 - 從0開始 - 105
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 總結一下目前有的素材: AI說書 - 從0開始 - 103:資料集載入 AI說書 - 從0開始 - 104:定義資料清洗的函數 AI說書 - 從0開始 - 105
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 延續 AI說書 - 從0開始 - 93 介紹了 The Corpus of Linguistic Acceptability (CoLA),其核心思想為:如果該句子在語
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 延續 AI說書 - 從0開始 - 93 介紹了 The Corpus of Linguistic Acceptability (CoLA),其核心思想為:如果該句子在語
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 延續 AI說書 - 從0開始 - 93 介紹了 The Corpus of Linguistic Acceptability (CoLA),其核心思想為:如果該句子在語
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 延續 AI說書 - 從0開始 - 93 介紹了 The Corpus of Linguistic Acceptability (CoLA),其核心思想為:如果該句子在語
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 延續 AI說書 - 從0開始 - 93 介紹了 The Corpus of Linguistic Acceptability (CoLA),其核心思想為:如果該句子在語
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 延續 AI說書 - 從0開始 - 93 介紹了 The Corpus of Linguistic Acceptability (CoLA),其核心思想為:如果該句子在語
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 以下陳述任務 (Task)、模型 (Model)、微調 (Fine-Tuning)、GLUE (General Language Understanding Evalu
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 以下陳述任務 (Task)、模型 (Model)、微調 (Fine-Tuning)、GLUE (General Language Understanding Evalu
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 我們已經在AI說書 - 從0開始 - 17中,介紹了大型語言模型 (LLM)世界裡面常用到的Token,現在我們來談談OpenAI的GPT模型如何利用Inference
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 我們已經在AI說書 - 從0開始 - 17中,介紹了大型語言模型 (LLM)世界裡面常用到的Token,現在我們來談談OpenAI的GPT模型如何利用Inference
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News