學習內容:
- 了解 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 方法

🔹 使用 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的策略和實作。