owned this note
owned this note
Published
Linked with GitHub
# Python中文自然語言PNLP
講師:佘志龍(LnData)
## Source Code
[Lesson 20 - Fine-Tune GPT-2 for Text Generation](https://colab.research.google.com/drive/1USNGRzSe21fQAVzSMtNV1IvV05pY2Lq-?usp=sharing)
[Lesson 21 - Google Play BERT Sentiment Classifier](https://colab.research.google.com/drive/1OTcTZ6Yctj73oSZUf9Wq0q_RiJTGQHWJ?usp=sharing)
[Lesson 22 - Fine-tuning RNN](https://colab.research.google.com/drive/1xTWLk_M56fCvR71D8QxDCUFRIyU7k8eH?usp=sharing)
[Lesson 23 - Intention Detection 意圖偵測與回覆相似度](https://colab.research.google.com/drive/1CPFXQg92V43cW0xPeAKfKricVZGPlGZx?usp=sharing)
[Lesson 24 - Fine-tuning ChatGPT 從問答集產生客服機器人](https://colab.research.google.com/drive/1MMQhE3XTmV7bYNZBpWcG3OXfhyRkfGDv?usp=sharing )
[Lesson 25 - Fine-tune LlaMA 2 7b-hf with 新聞資料集](https://colab.research.google.com/drive/1b-I_v1_Sf-iqH2G4TGDN4O_hypTVBLQK?usp=sharing)
## WEEK 1
[上課教材](https://docs.google.com/document/u/0/d/1kmVstj2kD5TOelq28Ptrr2pHAP9LtbudPugm0HPRsT8/mobilebasic?pli=1)
[作業獎勵](https://colab.research.google.com/drive/1g58V_T1xv55z52wS20zLSZw6gTJ-EVeC)
裡面不能開
課程前導
1. NLP 自然語言處理
2. NLU 自然語言理解
3. NLG 自然語言生成
推薦網站
https://www.explainthis.io/zh-hant
TAIDE 台德模型 花你各位的錢買的7億買4500篇
### 中文自然語言前處理
1. 爬蟲
2. 訓練
3. 上雲
##### 壓縮檔密碼都是 uuu
### lesson 0
* 自我吹捧
### lesson 1
* Python data structure
* 基本操作
### lesson 2
* Pandas
* DataFrame
null = 鬧 學會了 (回去教一下我教授)NKUST+NCKU+NTU 唸法
* matplotlib
* seaborn
### lesson 3 Crawler & Fetch training data
* 更新 chrome 安裝 chromedriver
* JSON vs Regular JSON
* urllib
* requests
* SEO (LD+Json)
```<script type="application/ld+JSON">```
key齊全 搜尋優先度較高
* beautifulsoup
source:ettoday
* selenium
1. 壓力測試
2. 測試劇本截圖
3. 關鍵字討論度
### lesson 4 ptt 爬蟲
* ptt 爬板/爬文章
八卦版一天約 150 篇
* jieba 分析詞頻
* word cloud
1. 發文者

2. 留言者

* html word cloud(https://wordcloud.timdream.org/)
### lesson 5
* instagram 爬蟲
* instagram, ptt 整週流量分析
* Jieba
* CKIP Transformers 中研院斷詞系統
#### 斷句
NER import txt file
專有名詞 權重 詞性(POS)part of speech
> 迪士尼 2 n
#### transformer 置換器
1. BERT - ckip Transformer(Word Segmentation)
2. Pytorch - ViTS(TTS, Text-to-Speech)
3. GPT - Text Genneration
---
註冊帳號:
[Hugging Face : https://huggingface.co/](https://huggingface.co/)
[Google Colab : https://colab.research.google.com/](https://colab.research.google.com/)
[Kaggle : https://www.kaggle.com/](https://www.kaggle.com/)
[OpenAI : https://openai.com/](https://openai.com/)
---
#### ML 簡介
監督 非監督 半監督 強化學習
如何看loss
overfitting underfitting
##### Validation
混淆矩陣
準確率 (Accuracy) = (TP + TN) / (TP + TN + FP + FN)
Recall(召回率) = TP/(TP+FN)
Precision(準確率) = TP/(TP+FP)
F1-score = 2 * Precision * Recall / (Precision + Recall)
SVM 支援向量機
### lesson 6
#### activate function
* Sigmoid
#### Algorithm
* LogisticRegression
* DecisionTreeClassifier
* K-Nearest Neighbors
* LDA(Linear Discriminant Analysis)
高斯分佈
* Naive Bayes Classification
高斯分佈
sklearn Classification
Linear Regression
EDA multiple features of data
Decision Tree Regressor
IAI NextAI?
```mermaid
graph TB;
A[Data Collector]
B[ML Classifier]
C[Model Pred]
D[prompt eng]
E[Based model]
F[fine-tuning RAG]
G[Chat GPT]
H[Internal Data]
I[fine-tuning RAG]
J[API Key Azure]
A-->B-->C-->D-->F
E-->D
F-->G-->H-->I-->J
```
[聊天機器人樣板](https://www.dropbox.com/s/h49b56mu0kz4b1d/FlaskServerWithLtnNews.rar?dl=0)
## H/W 01
### HW1: 回家作業
1. Target a website you want to get info from, try to use urllib.request.urlopen to fetch content , then organize your own crawler today.
2. Must include at least two columns, title and link etc.
3. Allow user input at least one parameter into crawler, ex: page or so.
4. Output result as *.json file into disk.
繳交作業方式 by e-mail,郵件標題:Python中文自然語言NLP深度學習專家課程_HWn
a. 將範例程式如D:\Crawler\XXX資料夾壓縮成一個壓縮檔,如:XXX.zip。
b. 將HelloXXX.zip寄至DavidLanz@gmail.com
ps. Gmail不允許*.rar等壓縮檔格式作為郵件附件,所以將副檔名修改為*.zip即可寄出。
### HW2: 回家作業
1. Create your own 3 categories data pool by crawling the gamer.com.
2. At least 100 posts for each category.
3. Save data as an Excel file.
繳交作業方式 by e-mail,郵件標題:Python中文自然語言NLP深度學習專家課程_HWn
a. 將範例程式如D:\Crawler\XXX資料夾壓縮成一個壓縮檔,如:XXX.zip。
b. 將HelloXXX.zip寄至DavidLanz@gmail.com
ps. Gmail不允許*.rar等壓縮檔格式作為郵件附件,所以將副檔名修改為*.zip即可寄出。
### HW3: 回家作業
Agents, here is the mission for you
Project: You are a researcher working at a social analysis company, please find out specific industrial insights from netizen on ptt.cc.
Steps:
1. Select a ptt.cc board (such as Gossiping or NBA etc.) which you’re interested in.
2. Using David’s ptt crawler as template.
3. Look for insights depending on your observation, and share your findings and send a brief report to David..
繳交作業方式 by e-mail,郵件標題:Python中文自然語言NLP深度學習專家課程_HWn
a. 將範例程式如D:\Crawler\XXX資料夾壓縮成一個壓縮檔,如:XXX.zip。
b. 將HelloXXX.zip寄至DavidLanz@gmail.com
ps. Gmail不允許*.rar等壓縮檔格式作為郵件附件,所以將副檔名修改為*.zip即可寄出。
---
```shell
# 環境建置
# 建虛擬環境
conda create -n uuunlp python=3.7
# 裝 anaconda web 所需
pip install ipykernel
python -m ipykernel install --user --name uuunlp --display-name uuunlp
pip install ipywidgets widgetsnbextension pandas-profiling
pip install -r requirements.txt
pip install -U ckiptagger
pip install -U transformers
pip install -U ckip-transformers
pip install plac
pip install tabulate
pip install --upgrade nbformat
pip install --upgrade accelerate
pip install protobuf==3.20
pip install h5py==2.10.0
pip install Delorean
jupyter notebook
注意:移除虛擬環境的指令 (以下不要在課堂中執行)
(uuunlp) C:\>conda deactivate
C:\>conda remove --name uuunlp --all
C:\>jupyter kernelspec uninstall uuunlp
最後至 C:\Andconda3\envs\
將 uuunlp 資料夾刪除
```
---
## WEEK 2
* 作業 reward 記得載下來,老師結束共享就掰了
### lesson 8
#### 貝氏定理
> $$ P(A \mid B) = \frac{ P(B \mid A) P(A) }{ P(B) } $$
Ex: 辦信用卡機率
詞頻 (TF)
字頻 (Words)
詞袋 *BOW* (Bag of Word)
english (one-hot encodeing)
#### TFIDF
TF X IDF= weight
(老師的白板IDF好像寫錯了,分子是文件總數,分母是有出現的文件數+1)
(wiki 是你說的那樣 所以他寫反了,但沒差多少)
(主要意義應該是出現文件數越多權重越低)
#### Homework 1
尋找自己感興趣的小說,長篇文章,進行訓練
利用 jieba的extract_tags 找出標籤
你的文章資料分析與發現?
### lesson 9
文章分類
corpus 語料
#### SVMClassifier
* 原始資料不均衡時會有bias
* 語料夠大時用SVM就有不錯的結果
#### XGBoosting
* 詞彙多的語料
#### 使用模型
MultinomialNB (from sklearn.naive_bayes import MultinomialNB)
XGBoost (import xgboost as xgb)
LinearSVC (sklearn.svm import LinearSVC)
#### Homework
請研究在XGBoost訓練時,調整 num_round 回合數,有助於提高分類的準確率嗎? 不會
新增兩個分類文章(自選),這兩個新增的分類文章數,各有300篇。
重新訓練,增加分類是否會降低準確率?
至少要多少文字的文句,分類才能分得開?
### lesson 10 ext Analytics & Word2Vec
[gephi - https://gephi.org/ ](https://gephi.org/)

* 三個分類是最準的
* 技術演變:
Word2Vec
Doc2Vec
skip-gram - 中心詞預測上下文
CBOW - 上下文預測中心詞
↓
BERT
#### Word2Vec
```python!
model = word2vec.Word2Vec(sentences, vector_size=100, epochs=10, hs=1, min_count=5, negative=3, window=5, batch_words=100000, workers=4)
```
參數解釋:
其中的sentences是句子組成的 list,而每個句子又是詞彙的列表(非一句話或一篇文章),即 list[list] 類型。
1. sg=1是skip-gram演算法,對低頻詞敏感;預設sg=0為CBOW演算法(sg=1是偏GPT的作法)。

2. vector_size是輸出詞向量的維數,值太小會導致詞映射因為衝突而影響結果,值太大則會耗記憶體並使演算法計算變慢,一般值取為100到200之間。
3. window是句子中當前詞與目標詞之間的最大距離,3表示在目標詞前看3-b個詞,後面看b個詞(b在0-3之間隨機)。
4. min_count是對詞進行過濾,詞頻小於 min-count 的單詞則會被忽略,預設值為5。
5. negative和sample可根據訓練結果進行微調,sample表示更高頻率的詞被隨機下採樣到所設置的閾值,預設值為1e-3。
6. hs=1展示層級softmax將會被使用,預設 hs=0 且 negative 不為 0,則負採樣將會被選擇使用。
7. workers控制訓練的平行處理,此參數只有在Windows安裝了Cython或Linux環境才有效,否則只能使用單核,anaconda 會內建 Cython。
### lesson 11
情感模型
P.S.自然語言的模型準確度不是可用性的唯一參考標準,常常準確率低但其實效果是還可以的
(老師google評論5星分數判斷範例準確率只有3成,但是可以用)
#### label data 可爬位置
評論
- google play
- apple store
- agoda
- hotel.com
- books.com.tw
- (yahoo movie) 被移除
- food panda(疑似被移除)
- ubereat
#### 使用模型
SnowNLP (from snownlp import SnowNLP)
用於 transfer learning
Afinn 各語言情感分析語料庫
#### data欄位設計
Y: Ratings
X: Word count, Content summary
#### RNN
#### GCP
#### 大衛HF
### lesson 12
預測性別

> 傑尼龜XD

> 蛤 
### lesson 13
- TextRank
快速摘要
機器人IG貼文
1. Summary
2. Extract keywords
3. \# Hash tag
4. @ mention
5. Image
### lesson 14
詩詞生成chatbot


* 只有RNN能夠用家用GPU跑,其他演算法跑不動
### lesson 15
N-Grams 找出新詞的方法
#### Optimize prompt
人 -> Gate(generate question) **Q**
-> GPT
-> response **A** -> Gate (if not ask gpt again) classifier
透過 DB 驗證 response 結果,但 DB 查得到幹嘛不直接查?
| Q | A | Verify | memo |
| :---: | :---: | :---: | :---: |
| 你好 | 我不知道你在問什麼 | V | 操 |
解決回答不一致的方法: response加入一個Classifier,驗證結果
分析POS(詞性)digit, enities, FAC, Place,...
驗證通過 -> pass 給user
驗證不通過 -> 重問GPT or 透過SQL query DB置換內容
> *Bolinc 太晚了*
Its time to give up. 今天很早喔
> sublime 執行 python : Ctrl + B 然後選 python

inference算力估計
> 1人 100% GPU*1 (A100 / B200)
- 地端部屬
買得到卡嗎? 散熱問題?
- 雲端部屬
model 掌握在自己手上,Data Security
## 6/21 下課前提醒
1. colab 訂閱
2. kaggle 帳號
3. hugging face 帳號
4. H/W reward 記得從老師分享那下載下來
## H/W 02
1. Find articles or novels and segment the text using the Jieba or CKIP library. Create your own dictionary in case the Chinese words are not suitable for vectorization.
2. Perform TF-IDF for each Chinese word by extracting keywords, and select the longest ones as tags.
3. Based on your tags, create your own word cloud chart and save it as an image file.
4. Save everything in one place as a Jupyter notebook file.
5. Create your own HuggingFace account: https://huggingface.co/ and Please follow DavidLanz.
繳交作業方式 by e-mail,郵件標題:Python中文自然語言NLP深度學習專家課程_HWn
a. 將範例程式如D:\Crawler\XXX資料夾壓縮成一個壓縮檔,如:XXX.zip。
b. 將HelloXXX.zip寄至DavidLanz@gmail.com
ps. Gmail不允許*.rar等壓縮檔格式作為郵件附件,所以將副檔名修改為*.zip即可寄出。
### lesson 19
老師丟到dropbox了
最後一堂課小作業,學以致用?
#### gpt prompt
不請 不謝謝 不對不起
---
1. Q/A based
2. instruction (when..., then...)
↑ one shot 唯一答案 or few shots 可能的候選答案
---
雲端方案
家裡電腦較差的可考慮直接用付費colab
地端方案
GPU可以用租的,也可以貢獻自己的GPU (80%收益)
ex: 4090 rent gpu
https://vast.ai/

### lesson 20
訓練專家模型
base model: `ckiplab/gpt2-base-chinese`
train 能源相關 (data from 中經院)
base on 能源,繼續train醫療相關
遷移式監督式學習
tranfer learning
loss 下降很慢
能源專家不容易學醫療

---
## Assignment
請尋找欲訓練的資料集 Excel 或 .csv 檔案,並以中文資料集為素材。
注意清洗你的文字語料,移除如無意義的文字,如記者報導、出處等文字。
選擇 T4 GPU instance後,執行語言模型訓練。
進行資料處理,運用程式進行 Text Generation 訓練。
將你的模型上傳至 HuggingFace Model Hub,並分享你的模型連結。
Bonus
利用其他的領域,調教(Fine tunning)模型。
```txt
Hi David,
我的模型是哪兩種分類
hugging face link...
```
*我覺得這次作業最難的是找資料*
*清洗你的文字語料* <-這也很費工
LlaMa3 8B/7B 邏輯推理
聯發科 Breeze 7B
混合專家模型
Mixture of Exprts, MoE

分類器 + 多個專才 > 一個通才
Low - Rank Adaptation(LoRA) 由 Microsoft 提出 (蒸餾法)
凍結預訓練模型的權重並使用小模型微調,特定層插入小型 LoRA 網路
降低精度,使較低規格GPU能夠訓練
uncensored 的模型沒有道德框架
### lesson 23
意圖偵測 = 問題產生出問題
大問題拆解成小問題 / 小問題展開成大問題
給用戶選擇後丟入LLM
twitch: 台北建東
XD
判斷兩句話正負相關

Training stage
FP32
LoRA(4bit)
QLoRA: 15天
(A100: 15天, 4090: 20天)
Inference stage (Edge)
GGUF (cpu)
GPU (1060) 4bit 4GB
* Cloud Based
* Home, Office
#### Fine-Turning Azure OpenAI
message role
"system" ex rpa assistant
"user", ex ask question
"assistant"
* Pricing
Llama 模型參數量選擇
7B -> Chat
13B -> Logical, Decision
70B -> Creative
微調LLM的資料如果有錯,不要嘗試在後面版本覆蓋
應直接退版,從前一個check point重新訓練
微調LLM會影響LLM的安全性
微調LLM的資料除了正面資料也要有負面資料
HW5:
建議用老師的模型
DavidLanz/Llama2-tw-7B-v2.1-chat
https://huggingface.co/DavidLanz/Llama2-tw-7B-v2.1-chat
### lesson 25
轉換 dataset format
def create_prompt_formats(sample)
* 解釋回答後 微調解決了以下何種問題
1. Task Oriented
2. Conditional resolution
3. role based assistant
4. Mask boundary 越權答案
5. Correct By H.F
LLM模型會越來越新
不變的是資料集,有資料的公司為王
---
## 2024/7/5
複習前三週內容
1. 資料加上標籤
2. transfer learning RNN
3. finetune LLM
* 顯卡記憶體多少才夠?
16GB 約10篇左右 (llama 13B)
24GB 以上約5千篇文章
### RAG
資料餵英文 - 使用英文embedding model - Vector DB
User Query 中文 -> Vector DB
know how
Q: 會找不到
Sol: Query翻譯成英文再做Vector DB retrive
#### Vector DB Solution:
* Chroma
* FAISS
* PineCono
建立出的DB (key-value based)會以sqlite的形式儲存在磁碟 (可以放到手機上)
也可以放到mongoDB, elastic search
Embedding 模型參考:
Chinese, English 大陸 94種語言但只有簡中
https://huggingface.co/intfloat/multilingual-e5-base
50 languages 包含繁中:
sentence-transformers/distiluse-base-multilingual-cased-v2
### LangChain
驗證輸出結果並重問LLM
檢查的項目 `ROI report`:
* digits
* Entity
* NER
- PRODUCT
- Price
- Name
#### text_splitter 切 chunk
```python
from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(
chunk_size = 1000, # the character length of the chunk
chunk_overlap = 100, # the character length of the overlap between chunks
length_function = len, # the length function - in this case, character length (aka the python len() fn.)
)
```
chunk_size : chunk_overlap = 10 : 1
* meta data 給 RAG 創建高效的文檔索引
```json
{
"keyword": ["xxx", "xxx"],
"importance":"",
"datetime":"" //也可以分不同欄位year, month, date,便於filter
}
```
know how:
Q: 問題中帶有重要資訊但資料中出現太少,導致找到太多無關緊要的結果
Sol:
1. extract keywords from question
2. filter metadata (資料帶的標籤)
### Lesson 29 Retriever
* 問答的內容,並列出來源網址
- 用LangChain
- 用LlamaIndex
* 指定查詢資料集的日期與時間區間
#### Refine
機器人對機器人的對話
#### LlamaIndex
* Query Engine vs Chat Engine
- chat engine 更在乎先前的問答內容
* context window 4K的限制,需把舊context pop出去
- ChatMemoryBuffer
### OpenAI 的 Whisper 聲音轉文字
- OpenAI Whisper
- voice to text
- TTS
- 狗哥會議聲音被當雜訊ㄏㄏ
你剛玩完
* youtube 自動生成字幕
* 關鍵字查詢並提供帶時間戳的youtube連結
### OpenAI 進階功能
* 串自己的API
* Assistants for GPTs (上傳文件)
### Lesson 32 Fact checking 事實查核
* Serper SaaS服務 (Google搜尋)
* POS checking
* ckip
* spaCy
### Lesson 35 跟 PDF 聊天
地端串雲端LLM + 地端文件的聊天機器人
### Lesson 36 GPU的LLM自行轉換GGUF
使只用CPU就能夠inference
#### AI agent
LLM跟LLM協作
chatgpt <-> Gemini <-> copilot
#### Quantization
在機器學習中,量化可以將模型參數從浮點數表示轉換為低精度的整數表示,以減少模型大小和提高推理速度,同時盡量減少性能損失。這對於部署在資源受限的設備(如移動設備或嵌入式系統)上特別有用。
#### Predictable AI
digital twins
### Lesson 37 處理時間序列資料
#### Lesson 40 驗證分片效果
```python
from llama_index.core.node_parser import (
SentenceSplitter,
SemanticSplitterNodeParser,
TokenTextSplitter,
)
```
比較
- SentenceSplitter,
- SemanticSplitterNodeParser,
- TokenTextSplitter,
- Semantic Splitter Node Parser (a.k.a Semantic Splitter)
懶人包: Semantic Splitter 效果最好,適用於技術文件
TokenTextSplitter 適用於數據型文件
#### Lesson 41 文字轉聲音 TTS BERT
#### Lesson 42 即時爬蟲跟網頁新聞聊天
### prompt
1. 完成特定任務
2. 資料外洩
3. 不可被攻擊
incontext learning
提取關鍵字 回傳JSON
先分類(filter by metadata) 再 RAG 小任務化
ai agent 算分類? Y
每次問答案都不一致
語言模型語意評分
人 -> 不主觀
gpt -> 可能問的問題是他的訓練資料 or 訓練資料是錯的
沒結論 哭啊
inference 速度vs價格 取捨
貴公司辦不到
jailbreaking
prompt injection
#### In-Context learning
未來趨勢,取代RAG
---
### 全部流程
Question --> Intention detection (classifier) --> expand Question --> extract keywords
RAG --> filter, retrieve relative documents --> Prompt Engineering --> Response --> fact checking --> Answer
finetuning (Base Model, prompt templates, DB for weight) --> finetuning model (Hugging face, dataset) --> LLM --> Prompt Engineering --> Response --> fact checking --> Answer
finetuning model + RAG + fact + Paired result (history memory)
現在碩士生好輕鬆阿