国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當前位置: 首頁 > news >正文

閘北專業(yè)做網(wǎng)站seo搜索引擎實訓心得體會

閘北專業(yè)做網(wǎng)站,seo搜索引擎實訓心得體會,沈陽招聘網(wǎng)官網(wǎng),山東高端網(wǎng)站建設wang一、導讀 本系列文章將圍繞《大模型微調》進行學習(也是我個人學習的筆記,所以會持續(xù)更新),最后以上手實操模型微調的目的。 (本文如若有錯誤的地方,歡迎批評指正) (寫作不易&#…

一、導讀

本系列文章將圍繞《大模型微調》進行學習(也是我個人學習的筆記,所以會持續(xù)更新),最后以上手實操模型微調的目的。
(本文如若有錯誤的地方,歡迎批評指正)
(寫作不易,方便的話點個贊,謝謝)

?《大模型微調》往期系列文章

01 | 大模型微調 | 從0學習到實戰(zhàn)微調 | AI發(fā)展與模型技術介紹
02 | 大模型微調 | 從0學習到實戰(zhàn)微調 | 從數(shù)學概率到千億參數(shù)大模型

1、本文摘要

本文內(nèi)容很長,我不喜歡[ 碎片化信息 ],不想拆成幾個文章,本文內(nèi)容其實每一節(jié)都可以拆成很多文章發(fā)布
但是我覺得沒意義,為了保證思路連貫性,所以全部寫在一起了

  1. 學會安裝transformers框架環(huán)境
  2. 學會使用hugging Face 平臺
  3. 掌握transformers的核心模塊
  4. 學會如何看源碼
  5. 深入業(yè)務場景進行學習理解

在這里插入圖片描述

2、往期文章推薦

你可以閱讀我下列文章
1?? 關于langchain的系列文章(相信我把Langchain全部學一遍,你能深入理解AI的開發(fā))

01|LangChain | 從入門到實戰(zhàn)-介紹
02|LangChain | 從入門到實戰(zhàn) -六大組件之Models IO
03|LangChain | 從入門到實戰(zhàn) -六大組件之Retrival
04|LangChain | 從入門到實戰(zhàn) -六大組件之Chain
05|LangChain | 從入門到實戰(zhàn) -六大組件之Memory
06|LangChain | 從入門到實戰(zhàn) -六大組件之Agent

2?? 關于Langchain的實戰(zhàn)案例(自認為本地問答機器人的案例寫的很好,很好理解ReAct)
Langchain-實戰(zhàn)篇-搭建本地問答機器人-01
都2024了,還在糾結圖片識別?fastapi+streamlit+langchain給你答案!

3?? 關于Agent智能體開發(fā)案例(MCP協(xié)議)
在dify構建mcp,結合fastapi接口,以實際業(yè)務場景理解MCP

4?? 推薦閱讀一下transformer 文章,以便能更好的理解大模型

Transformer模型詳解(圖解最完整版)
Attention Is All You Need (Transformer) 論文精讀

5?? 除了在 CSDN 分享這些技術內(nèi)容,我還將在微信公眾號持續(xù)輸出優(yōu)質文章,內(nèi)容涵蓋以下板塊:?
(當然我也希望能夠跟你們學習探討😀)

關注😄「穩(wěn)穩(wěn)C9」😄公眾號

  • 爬蟲逆向:分享爬蟲開發(fā)中的逆向技術與技巧,探索數(shù)據(jù)獲取的更多可能。?
  • AI 前沿內(nèi)容:緊跟 AI 發(fā)展潮流,解讀大模型、算法等前沿技術動態(tài)。?
  • 騎行分享:工作之余,用騎行丈量世界,分享旅途中的所見所感。

二、Hugging Face Transformers 介紹

Hugging Face 通過開源社區(qū)與技術創(chuàng)新,重新定義了 NLP 的開發(fā)范式。

其核心價值在于 降低技術門檻、促進協(xié)作共享,并推動從學術研究到工業(yè)落地的全鏈條發(fā)展。

無論是個人開發(fā)者還是企業(yè)用戶,均可通過其生態(tài)快速實現(xiàn)從原型驗證到生產(chǎn)部署的跨越。

1、Hugging Face 地址

  • 官網(wǎng)地址:https://huggingface.co/

在這里插入圖片描述

  • 國內(nèi)鏡像地址:https://hf-mirror.com/

在這里插入圖片描述

2、發(fā)展歷史與技術組成

發(fā)展歷史
Hugging Face 成立于2016年,最初以聊天機器人起家,后轉型為 NLP 開源社區(qū)。其核心產(chǎn)品 Transformers 庫于2019年發(fā)布,迅速成為 NLP 領域的事實標準。關鍵節(jié)點包括:

  • 2018年:支持 BERT、GPT 等早期模型,推動預訓練模型的普及。
  • 2019年:推出 Pipeline API,實現(xiàn)三行代碼調用復雜 NLP 任務。
  • 2020年:整合多模態(tài)模型,擴展至計算機視覺和語音領域。
  • 2024年:中國智源研究院的 BGE 模型登頂 Hugging Face 月度下載榜,成為首個下載量破億的國產(chǎn)模型。

技術組成
Hugging Face 生態(tài)由四大核心組件構成:

  1. 預訓練模型庫:涵蓋 30+ 架構(如 BERT、GPT、T5)和 2000+ 預訓練模型,支持 100+ 語言。
  2. Pipeline API:封裝模型加載、預處理、推理全流程,支持情感分析、文本生成、翻譯等任務。
  3. Model Hub:開源社區(qū)平臺,支持模型托管、版本管理、在線演示(如 Write With Transformer)。
  4. 多框架兼容:無縫支持 PyTorch、TensorFlow、JAX,支持跨框架模型轉換。

3、價值與作用

核心價值

  • 開源共享:降低模型使用門檻,避免重復訓練,減少碳排放。
  • 技術普惠:通過簡單 API 讓非專業(yè)開發(fā)者也能調用 SOTA 模型。
  • 社區(qū)驅動:全球開發(fā)者貢獻模型與工具,形成良性生態(tài)循環(huán)(如國產(chǎn) BGE 模型的成功)。

實際作用

  1. 加速研發(fā)
    • 研究者可基于預訓練模型快速微調,如智源 BGE 通過社區(qū)反饋迭代優(yōu)化。
    • 企業(yè)利用 Infinity 容器實現(xiàn)毫秒級推理延遲,降低生產(chǎn)環(huán)境成本。
  2. 多場景適配
    • 情感分析:3 行代碼判斷文本情感傾向(例:pipeline("sentiment-analysis"))。
    • 跨語言檢索:BGE M3 支持 100+ 語言統(tǒng)一表征,提升 RAG 系統(tǒng)的多語言適配能力。
  3. 教育與創(chuàng)新
    • 提供 DatasetsTokenizer 庫,簡化數(shù)據(jù)預處理與特征提取。
    • 開發(fā)者可通過 Spaces 快速部署交互式應用(如對話機器人、文本生成器)。

三、Transformers介紹與安裝

在這里插入圖片描述

論文:Attention Is All You Need

本章節(jié)講解的內(nèi)容為摘要方式,如果需要完全學習,可以去官網(wǎng)看完整的
如果沒有空,其實也不影響后續(xù)達到微調的目的

1、Transformers庫

在這里插入圖片描述

github:https://github.com/huggingface/transformers

Transformers 是由 Hugging Face 開發(fā)的開源 Python 庫,專注于提供先進的預訓練模型和工具,支持自然語言處理(NLP)、計算機視覺(CV)、語音等多模態(tài)任務。

其核心理念是通過標準化接口,讓開發(fā)者無需從零實現(xiàn)復雜模型,即可快速調用、微調和部署 SOTA(State-of-the-Art)模型,如 BERT、GPT、Stable Diffusion 等。

2、Transformers環(huán)境搭建

本次主要以windows,GPU安裝為主,linux安裝方案大同小異
(后面會講解租用云服務器linux微調,不必擔心)

2.1 安裝python環(huán)境

conda create -n hf-env python=3.10.16 -y  
conda activate hf-env  

2.2 安裝NVIDIA驅動及工具包

  • GPU用戶 已安裝的可以跳過,可以輸出下面命令檢測
nvidia-smi

在這里插入圖片描述

nvcc -V

在這里插入圖片描述

2.2.1 安裝顯卡驅動

官方地址:https://www.nvidia.cn/drivers/lookup/

WIN+R 輸入 dxdiag ,然后回車

在這里插入圖片描述
在欄目中多點擊選擇一下,直到看到顯卡參數(shù)

在這里插入圖片描述

來到官網(wǎng)根據(jù)自己的顯卡選擇合適的參數(shù)

在這里插入圖片描述
在這里插入圖片描述

后面根據(jù)內(nèi)容下載安裝即可

2.2.2 安裝CUDA工具包

官網(wǎng)網(wǎng)址:https://developer.nvidia.com/cuda-downloads

選擇適合自己的安裝即可,注意 nvidia-smi 有顯示驅動版本,你要結合官方的實際情況下載CUDA 工具版本
在這里插入圖片描述
官方說明:https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html#cuda-major-component-versions__table-cuda-toolkit-driver-versions

在這里插入圖片描述

選擇自己合適的版本即可:
https://developer.nvidia.com/cuda-toolkit-archive
在這里插入圖片描述
在這里插入圖片描述

2.3 安裝pytorch

GPU版本
PyTorch版本最低CUDAGame Ready驅動版本Studio驅動版本
2.0+11.7525.85+R525 U2+
1.1211.6516.94+R516 U5+
1.1011.3471.96+R470 U3+

激活你的虛擬環(huán)境,開始準備安裝!!!!!!!!!!!!!!!!!!!!!!

通過pip下載方式,你可以執(zhí)行下面自動檢測腳本來

import subprocess
import re
import sys
import osdef get_cuda_version():"""通過多種方式檢測系統(tǒng)CUDA版本"""# 方式1: 通過nvcc編譯器檢測try:output = subprocess.check_output(["nvcc", "--version"], stderr=subprocess.STDOUT).decode()if match := re.search(r"release (\d+\.\d+)", output):return match.group(1)except Exception:pass# 方式2: 通過CUDA安裝目錄檢測cuda_home = os.environ.get('CUDA_HOME', '') or os.environ.get('CUDA_PATH', '')if cuda_home and os.path.isfile(ver_file := os.path.join(cuda_home, "version.txt")):with open(ver_file) as f:if match := re.search(r"CUDA Version (\d+\.\d+)", f.read()):return match.group(1)# 方式3: 通過NVIDIA驅動檢測try:output = subprocess.check_output(["nvidia-smi", "--query-gpu=cuda_version", "--format=csv,noheader"],stderr=subprocess.DEVNULL).decode()if output.strip():return output.strip().split('\n')[0]except Exception:passreturn Nonedef build_install_command():"""構建安裝命令"""version_map = {12: ("2.3.1+cu121", "0.18.1+cu121", "2.3.1+cu121", "cu121"),11: ("2.3.1+cu118", "0.18.1+cu118", "2.3.1+cu118", "cu118")}if not (cuda_version := get_cuda_version()):return "pip install torch==2.3.1 torchvision==0.18.1 torchaudio==2.3.1 --index-url https://pypi.tuna.tsinghua.edu.cn/simple"try:major_ver = int(cuda_version.split('.')[0])except ValueError:major_ver = 0if major_ver not in version_map:return "pip install torch==2.3.1 torchvision==0.18.1 torchaudio==2.3.1 --index-url https://pypi.tuna.tsinghua.edu.cn/simple"torch_ver, vision_ver, audio_ver, cuda_tag = version_map[major_ver]line_cont = "^" if sys.platform == "win32" else "\\"return (f"pip install torch=={torch_ver} torchvision=={vision_ver} torchaudio=={audio_ver} {line_cont}\n"f"--extra-index-url https://download.pytorch.org/whl/{cuda_tag} {line_cont}\n"f"--index-url https://pypi.tuna.tsinghua.edu.cn/simple")if __name__ == "__main__":print("自動生成的PyTorch安裝命令:")print(build_install_command())

在這里插入圖片描述

pip install torch==2.3.1+cu121 torchvision==0.18.1+cu121 torchaudio==2.3.1+cu121 ^
--extra-index-url https://download.pytorch.org/whl/cu121 ^
--index-url https://pypi.tuna.tsinghua.edu.cn/simple

官網(wǎng)手動下載地址:https://download.pytorch.org/whl/cu121/torch_stable.html

如果你網(wǎng)絡不好,可以選擇手動安裝whl方式

官網(wǎng)手動下載地址:https://download.pytorch.org/whl/cu121/torch_stable.html

pip install torch-2.3.1+cu121-cp310-cp310-win_amd64.whl
pip install torchvision-0.18.1+cu121-cp310-cp310-win_amd64.whl
pip install torchaudio-2.3.1+cu121-cp310-cp310-win_amd64.whl
CPU版本

雖然transformer部分模型支持CPU運行,但是還是建議大家搞個顯卡吧,CPU版本不過講解,跟上面流程一樣
(未來微調模型必定要GPU的,第四章節(jié)的案例CPU本次可以運行起來部分)

pip install torch==2.3.1+cpu torchvision==0.18.1+cpu torchaudio==2.3.1+cpu  

2.4 安裝其它依賴

requirements.txt


# ------------------------
# Hugging Face 生態(tài)系統(tǒng)
# ------------------------
transformers==4.37.2          # 預訓練語言模型庫(BERT/GPT等)
datasets==2.16.1              # 超大規(guī)模數(shù)據(jù)集加載工具
accelerate==0.26.1            # 分布式訓練加速框架
peft==0.7.1                   # 參數(shù)高效微調工具(LoRA/Adalora)
trl==0.8.1                    # 強化學習與人類反饋訓練庫# ------------------------
# 模型量化與優(yōu)化
# ------------------------
autoawq==0.2.2                # 4-bit 激活感知量化推理框架  依賴 triton(linux) windows安裝: https://blog.csdn.net/Changxing_J/article/details/139785954
auto-gptq==0.6.0              # GPT模型量化工具(支持GPU推理加速)# ------------------------
# 計算加速與量化支持
# ------------------------
bitsandbytes==0.41.3.post2    # 8-bit/4-bit CUDA量化核心庫(需系統(tǒng)級CUDA支持) # https://pypi.org/project/bitsandbytes/#files# ------------------------
# 數(shù)據(jù)處理與機器學習
# ------------------------
timm==0.9.12                  # 前沿視覺模型庫(ResNet/ViT等)
scikit-learn==1.3.2           # 經(jīng)典機器學習算法庫
pandas==2.1.1                 # 結構化數(shù)據(jù)分析工具# ------------------------
# 音頻處理工具鏈
# ------------------------
ffmpeg==1.4                   # 音視頻編解碼核心庫(需通過conda安裝)
ffmpeg-python==0.2.0          # FFmpeg 的 Python 接口
soundfile==0.12.1             # 音頻文件讀寫庫(支持WAV/FLAC等格式)
librosa==0.10.1               # 音頻特征提取與處理
jiwer==3.0.3                  # 語音識別評估工具(計算WER等指標)# ------------------------
# 應用開發(fā)與部署
# ------------------------
gradio==4.13.0                # 快速構建AI演示界面(支持Web/API)
langchain==0.2.0              # 大語言模型應用開發(fā)框架(核心)
langchain-openai==0.1.7       # OpenAI 官方集成模塊
langchain-core==0.2.1         # LangChain 核心依賴
langchain-community==0.2.0    # 社區(qū)貢獻的擴展模塊
openai==1.30.1                # OpenAI 官方SDK(GPT/DALL-E等接口)jupyter # 安裝 https://jupyter.org/install

2.5 驗證環(huán)境

import torch
import bitsandbytes as bnbprint("\n=== 環(huán)境診斷報告 ===")
print(f"PyTorch 版本: {torch.__version__}")
print(f"CUDA 可用性: {torch.cuda.is_available()}")
print(f"GPU 設備: {torch.cuda.get_device_name(0)}")
print(f"bitsandbytes 版本: {bnb.__version__}")# 新版獲取CUDA版本方式
if hasattr(bnb, 'cuda_setup'):print(f"CUDA 主版本: {bnb.cuda_setup.main_cuda_version()}")
else:print("CUDA 版本檢測接口已變更,請嘗試以下方法驗證:")print(">>> 測試8-bit優(yōu)化器:")optimizer = bnb.optim.Adam8bit(torch.nn.Linear(1,1).parameters())print("? bitsandbytes CUDA 支持正常")

在這里插入圖片描述

四、Transformers庫核心功能模塊

在這里插入圖片描述

  • 統(tǒng)一接口設計:AutoClass體系實現(xiàn)模型無關編程

  • 模塊解耦:各組件可獨立替換(如單獨使用Tokenizer)

  • 跨框架兼容:同時支持PyTorch/TensorFlow/JAX

  • 生態(tài)集成:與Datasets/Accelerate等庫深度整合

建議有空還是閱讀一下官方文檔的內(nèi)容,本章節(jié)只采用深入淺出的方式

官方文檔:https://hf-mirror.com/docs/transformers/v4.52.2/zh/index
transformers能做什么:https://hf-mirror.com/docs/transformers/v4.52.3/zh/task_summary

在這里插入圖片描述

通過Hugging Face的Transformers庫自動下載模型,會先緩存在默認路徑:

Linux:~/.cache/huggingface/hub

Windows :C:\Users\<你的用戶名>\.cache\huggingface\hub

在這里插入圖片描述

當然你可以,選擇設置運行模塊下載的模型放置別的目錄

import osos.environ['HF_HOME'] = '/mnt/new_volume/hf'
os.environ['HF_HUB_CACHE'] = '/mnt/new_volume/hf/hub'

1、模型配置文件

1.1 文件說明

1.1.1 常見文件說明

理解這些文件的作用后,就能更好地解決模型加載問題,調試錯誤,甚至創(chuàng)建自己的模型配置。
PS:僅列舉經(jīng)常見到的,不同模型還有其他類型文件!!!!!!看到新的,可以官方發(fā)布github查看相應文檔說明

文件用途說明
config.json模型配置文件定義模型架構參數(shù)(如隱藏層維度、注意力頭數(shù)等),用于初始化模型
pytorch_model.bin模型權重文件(PyTorch)保存模型訓練后的參數(shù)值
tf_model.h5模型權重文件(TensorFlow)保存模型訓練后的參數(shù)值(TensorFlow 格式)
model.onnx模型權重文件(ONNX 格式)用于模型部署,支持跨平臺推理
tokenizer_config.json分詞器配置文件定義分詞器類型和參數(shù)(如最大長度、特殊標記等)
vocab.json詞匯表文件存儲分詞器的詞匯表(適用于 BPE 等分詞方法)
merges.txt合并規(guī)則文件定義 BPE 分詞中的合并規(guī)則
special_tokens_map.json特殊標記映射文件定義特殊標記(如 [CLS][SEP])及其對應符號
training_args.bin訓練參數(shù)文件記錄模型訓練時的超參數(shù)(如學習率、批次大小等)
tokenizer.json分詞器完整配置文件包含分詞器的完整配置(可獨立用于初始化分詞器)
added_tokens.json自定義標記文件存儲用戶添加的自定義標記或詞匯

比如:https://hf-mirror.com/google-bert/bert-base-chinese/tree/main

在這里插入圖片描述

  1. 核心必需文件config.json + 權重文件(pytorch_model.binmodel.safetensorstf_model.h5) + tokenizer_config.json + special_tokens_map.json
  2. 詞表文件:根據(jù)模型類型選擇:vocab.txt(BERT)或 merges.txt + vocab.json(GPT-2)
  3. 安全權重model.safetensors 是推薦的安全權重格式,尤其適合不信任的模型來源。
  4. Tokenizer 文件
    • tokenizer_config.json:配置參數(shù)
    • tokenizer.json:實際詞匯表和規(guī)則(用于快速加載)
    • 若只有vocab.txt也能工作,但加載速度可能慢

1.1.2 權重文件格式對比

權重格式框架支持安全加載速度大小
pytorch_model.binPyTorch?中等
model.safetensorsPyTorch/TF/JAX?中等
tf_model.h5TensorFlow?大(含優(yōu)化器狀態(tài))

1.1.3 如何加載模型

1.2 文件調用流程

PS:僅列舉經(jīng)常見到的,不同模型還有其他類型文件!!!!!!看到新的,可以官方發(fā)布github查看相應文檔說明
在這里插入圖片描述

from transformers import AutoConfig, AutoTokenizer, AutoModel# 加載配置
config = AutoConfig.from_pretrained("bert-base-chinese")# 加載分詞器(會自動找到tokenizer_config.json和vocab.txt等)
tokenizer = AutoTokenizer.from_pretrained("bert-base-chinese")# 加載模型(自動識別權重文件)
model = AutoModel.from_pretrained("bert-base-chinese")

1.2.1 深度解析

1. config.json:模型的DNA
from transformers import AutoConfig# 加載配置
config = AutoConfig.from_pretrained("bert-base-chinese")# 創(chuàng)建自定義配置
custom_config = AutoConfig.from_pretrained("bert-base-chinese")
custom_config.num_hidden_layers = 6  # 輕量版模型# 無預訓練權重建模
model = AutoModel.from_config(custom_config)
2. tokenizer 文件組:文本處理的流水線
from transformers import AutoTokenizertokenizer = AutoTokenizer.from_pretrained("gpt2")# 查看組件關系
print("特殊Token:", tokenizer.special_tokens_map)  # ← special_tokens_map.json
print("配置參數(shù):", tokenizer.init_kwargs)           # ← tokenizer_config.json
print("詞匯大小:", tokenizer.vocab_size)           # ← vocab.json
print("合并規(guī)則:", tokenizer.merge_file)            # ← merges.txt (如存在)
3. 權重文件的跨框架支持

PS: 這里為手動調用模型框架,一定要看《 模型加載方法比對》加深理解
`PS: 這里為手動調用模型框架,一定要看《 模型加載方法比對》加深理解``

# PyTorch用戶
from transformers import BertModel
model = BertModel.from_pretrained("bert-base-chinese")# TensorFlow用戶
from transformers import TFBertModel
model = TFBertModel.from_pretrained("bert-base-chinese")  # 自動查找 tf_model.h5
4. 生成配置的使用
# 自定義生成參數(shù)
generation_config = {"temperature": 0.8,"top_p": 0.95,"max_length": 200
}# 保存為generation_config.json
with open("generation_config.json", "w") as f:json.dump(generation_config, f)# 加載模型時自動應用
pipe = pipeline("text-generation", model="path/to/model")

1.3 模型加載方法比對

在這里插入圖片描述

特性手動調用Auto ClassesPipeline
模型/框架指定手動選擇具體的模型類(如 BertModel自動根據(jù) config.json 選擇模型架構自動選擇模型和框架
Tokenizer 加載手動加載分詞器(如 BertTokenizer自動加載匹配的分詞器(AutoTokenizer自動加載匹配的分詞器
預處理手動實現(xiàn)分詞、編碼、填充等手動實現(xiàn)自動處理
模型推理手動調用模型,處理輸入輸出手動調用模型,處理輸入輸出自動處理
后處理手動實現(xiàn)(如 softmax、實體聚合、標簽映射)手動實現(xiàn)自動處理(根據(jù)任務標準化輸出)
單行代碼實現(xiàn)能力? 需要多行代碼? 需要多行代碼? 一行代碼啟動
內(nèi)置最佳實踐? 需用戶自行實現(xiàn)?? 部分通過配置實現(xiàn)? 自動應用行業(yè)最佳實踐
自定義靈活性? 完全控制(可修改任意中間過程)? 高靈活性(可訪問模型各層)?? 中等(通過參數(shù)調整,無法修改內(nèi)部邏輯)
項目啟動速度?? 慢(需寫大量代碼)?? 中等(需寫部分代碼)? 極快(開箱即用)
適合人群研究人員、框架開發(fā)者進階開發(fā)者、定制任務用戶初學者、應用工程師、快速原型
典型用例模型架構修改、定制訓練、調試遷移學習、微調、模型分析生產(chǎn)部署、API 服務、demo 演示
任務支持所有任務(需自行實現(xiàn))所有任務(需自行實現(xiàn)預處理和后處理)內(nèi)置 60+ 任務(分類、NER、生成等)
硬件優(yōu)化手動實現(xiàn)(如 fp16、設備放置)手動實現(xiàn)自動優(yōu)化(如設備切換、批處理)

2、Pipeline(流程管道)

意義:

  • 任何模型進行任何語言、計算機視覺、語音以及多模態(tài)任務的推理變得非常簡單。

  • 即使您對特定的模態(tài)沒有經(jīng)驗,或者不熟悉模型的源碼,您仍然可以使用pipeline()進行推理!

傳統(tǒng) NLP 開發(fā) vs Pipeline

在這里插入圖片描述
在這里插入圖片描述
已支持的任務和可用參數(shù)的完整列表

https://hf-mirror.com/docs/transformers/v4.52.3/zh/main_classes/pipelines#transformers.pipeline

模塊/功能參數(shù)/方法說明示例
創(chuàng)建Pipelinepipeline()核心創(chuàng)建函數(shù),自動選擇模型和配置pipe = pipeline("text-classification")
task (str)指定任務類型(必需參數(shù))task="sentiment-analysis"
model (str)指定預訓練模型model="distilbert-base-uncased"
framework (str)指定框架(“pt”=PyTorch, “tf”=TensorFlow)framework="pt"
參數(shù)配置device (int)指定設備(-1=CPU, 0=第一塊GPU)device=0
batch_size (int)批處理大小batch_size=32
num_workers (int)數(shù)據(jù)加載線程數(shù)num_workers=4
音頻任務audio-classification音頻分類pipe = pipeline("audio-classification", model="speechbrain/spkrec-xvect")
automatic-speech-recognition語音識別pipe = pipeline("automatic-speech-recognition", model="openai/whisper-small")
視覺任務image-classification圖像分類pipe = pipeline("image-classification", model="google/vit-base-patch16-224")
object-detection目標檢測pipe = pipeline("object-detection", model="facebook/detr-resnet-50")
文本任務text-classification文本分類/情感分析pipe("I love transformers!")
token-classification命名實體識別pipe("My name is Sarah and I live in London")
question-answering問答系統(tǒng)pipe(question="Why?", context="Transformers are...")
text-generation文本生成pipe("The future of AI is", max_length=50)
多模態(tài)任務visual-question-answering視覺問答pipe(image=image, question="What is in this picture?")
功能方法.save_pretrained()保存Pipeline到本地pipe.save_pretrained("my_pipeline")
from_pretrained()加載保存的Pipelinepipe = pipeline.from_pretrained("my_pipeline")
.__call__()執(zhí)行推理的核心調用方法pipe(輸入數(shù)據(jù))
高級特性PipelineRegistry注冊自定義Pipeline(高級功能)PipelineRegistry.register_pipeline()
自定義后處理覆蓋后處理方法繼承Pipeline類并重寫postprocess方法
輸入?yún)?shù)kwargs任務特定參數(shù)(如max_length, temperature等)

小技巧-玩轉Hugging Face

https://hf-mirror.com/models

我們可以點擊這些板塊,找到開源模型,跟數(shù)據(jù)集使用

在這里插入圖片描述

小技巧-讀源碼,定位方法的使用

QA小技巧,學習的過程中沒必要記住所有的方法,以創(chuàng)建了piplines怎么確認傳參為例子

Pipline 源代碼位置 https://github.com/huggingface/transformers/blob/main/src/transformers/pipelines/init.py

我在這里演示,指定了QA任務,傳入什么參數(shù)的查找過程,可以看到為傳去 question context

請?zhí)砑訄D片描述

2.1 自然語言處理

在這里插入圖片描述

官網(wǎng)鏈接-自然語言處理

任務類型任務描述常見應用場景代表性模型/方法
文本分類將文本劃分到預定義的類別中垃圾郵件識別、新聞分類、情感分析等傳統(tǒng)機器學習(如SVM、樸素貝葉斯)+TF-IDF特征;深度學習(如BERT、TextCNN)
Token分類對文本中的每個Token(如單詞、字符等)進行分類標注命名實體識別(NER)、詞性標注等BERT+CRF、BiLSTM+CRF
問答根據(jù)給定問題生成對應的答案智能客服、知識問答系統(tǒng)等T5、GPT系列、BERT-based問答模型
摘要從長文本中提取關鍵信息生成簡短摘要新聞摘要、學術文獻摘要等BART、PEGASUS、Transformer-based編碼器-解碼器架構
翻譯將一種語言的文本轉換為另一種語言的文本跨語言交流、多語言文檔處理等Transformer、 MarianMT、百度翻譯模型等
語言模型預測文本序列中下一個Token的概率分布文本生成、自動補全、語言理解等GPT系列、Transformer-XL、XLNet

自然語言處理案例有很多,我就不按照案例講解,以串聯(lián)過程,講解重點功能

2.1.1 Text classification(文本分類)

1. 默認模型

在這里,我指定了任務類型為情感分類,model參數(shù)沒有指定
默認使用的模型為:distilbert-base-uncased-finetuned-sst-2-english

  • task 優(yōu)先原則:當指定任務而不指定模型時,Pipeline 會自動選擇最適合該任務的默認模型
from transformers import pipeline# 僅指定任務時,使用默認模型(不推薦)
pipe = pipeline(task="sentiment-analysis", device='cuda')
print(pipe("小明是好人"))
print(pipe("小紅是壞人"))print(pipe("This restaurant is awesome"))
print(pipe("This restaurant is bad"))

可以看到中文的score置信度很低,英文的卻很高

[{'label': 'NEGATIVE', 'score': 0.5197433233261108}]
[{'label': 'NEGATIVE', 'score': 0.774127721786499}][{'label': 'POSITIVE', 'score': 0.9998743534088135}] # 積極的
[{'label': 'NEGATIVE', 'score': 0.9998098015785217}] # 消極的
2.指定模型

在這里我替換一下模型使用,再來看看中文的效果
https://hf-mirror.com/lxyuan/distilbert-base-multilingual-cased-sentiments-student

from transformers import pipelinepipe = pipeline(task="sentiment-analysis", model="lxyuan/distilbert-base-multilingual-cased-sentiments-student",device='cuda')print(pipe("小明是好人"))
print(pipe("小紅是壞人"))print(pipe("This restaurant is awesome"))
print(pipe("This restaurant is bad"))

可以看到對于中文置信度很高了

[{'label': 'positive', 'score': 0.9678574204444885}]
[{'label': 'negative', 'score': 0.9101658463478088}]
[{'label': 'positive', 'score': 0.9811712503433228}]
[{'label': 'negative', 'score': 0.9343340396881104}]
3.批量調用模型推理
from transformers import pipeline
pipe = pipeline(task="sentiment-analysis", model="lxyuan/distilbert-base-multilingual-cased-sentiments-student",device='cuda')
print(pipe(["小明是好人","小明是壞人"]))

輸出

[{'label': 'positive', 'score': 0.9678574204444885},{'label': 'negative', 'score': 0.911962628364563}]

2.1.2 Token Classification (token分類)

在任何NLP任務中,文本都經(jīng)過預處理,將文本序列分成單個單詞或子詞。這些被稱為tokens。

Token Classification(Token分類)將每個token分配一個來自預定義類別集的標簽。
兩種常見的 Token 分類是:

  • 命名實體識別(NER):根據(jù)實體類別(如組織、人員、位置或日期)對token進行標記。NER在生物醫(yī)學設置中特別受歡迎,可以標記基因、蛋白質和藥物名稱。
  • 詞性標注(POS):根據(jù)其詞性(如名詞、動詞或形容詞)對標記進行標記。
    POS對于幫助翻譯系統(tǒng)了解兩個相同的單詞如何在語法上不同很有用(作為名詞的銀行與作為動詞的銀行)。
1.命名實體識別(NER)

下面我們調用一個命名實體ner模型

模型主頁:https://hf-mirror.com/ckiplab/bert-base-chinese-ner

在模型的files,config.json 有說明標簽
https://hf-mirror.com/ckiplab/bert-base-chinese-ner/blob/main/config.json
在這里插入圖片描述
每個標簽是對歸屬的簡寫,比如"30": "I-ORG", ORG 代表的是組織

import os
# 設置鏡像源(推薦國內(nèi)源)
os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'  # 國內(nèi)鏡像源
from transformers import pipeline# 創(chuàng)建NER管道(使用中文預訓練模型)
ner = pipeline(# grouped_entities=True,task="token-classification",model="ckiplab/bert-base-chinese-ner",device='cuda'  # 使用GPU加速,)
# 待分析文本
text = "小紅是中國人,在上海大學讀書"
# 進行實體識別
entities = ner(text)
# 打印原始結果
print("===== 原始識別結果 =====")
for entity in entities:print(f"{entity['word']} → {entity['entity']} (置信度: {entity['score']:.3f})")

輸出

===== 原始識別結果 =====
小 → B-PERSON (置信度: 1.000)
紅 → E-PERSON (置信度: 1.000)
中 → B-NORP (置信度: 1.000)
國 → I-NORP (置信度: 1.000)
人 → E-NORP (置信度: 1.000)
上 → B-ORG (置信度: 1.000)
海 → I-ORG (置信度: 1.000)
大 → I-ORG (置信度: 1.000)
學 → E-ORG (置信度: 1.000)

上面效果看起來不是很好看,我們可以加以合并更修飾

2.實體合并
import os
os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'from transformers import pipeline# 創(chuàng)建NER管道(使用聚合策略)
ner = pipeline(task="token-classification",model="ckiplab/bert-base-chinese-ner",aggregation_strategy="simple",  # 關鍵設置device='cuda'
)text = "小紅是中國人,在上海大學讀書"
entities = ner(text)# 打印結果
print("===== 完整實體識別結果 =====")
for entity in entities:print(f"{entity['word']} → {entity['entity_group']} (置信度: {entity['score']:.3f})")# 補充:理解實體類型
print("\n===== 實體類型解釋 =====")
entity_types = {'PERSON': '人名','ORG': '組織機構','NORP': '民族/宗教團體','LOC': '地點','GPE': '國家/城市','MISC': '其他','FAC': '設施','PRODUCT': '產(chǎn)品'
}
for entity in entities:print(f"{entity['word']}: {entity_types.get(entity['entity_group'], '未知類型')}")

輸出

可以看到效果還是挺好的,輸出內(nèi)容不再單個割裂,國家也能組合出來 “中國”

===== 完整實體識別結果 =====
小 → PERSON (置信度: 1.000)
紅 → PERSON (置信度: 1.000)
中 國 → NORP (置信度: 1.000)
人 → NORP (置信度: 1.000)
上 海 大 → ORG (置信度: 1.000)
學 → ORG (置信度: 1.000)===== 實體類型解釋 =====
小: 人名
紅: 人名
中 國: 民族/宗教團體
人: 民族/宗教團體
上 海 大: 組織機構
學: 組織機構

2.1.3 Question Answering(問答)

問答類型核心特點典型模型適用場景優(yōu)勢局限性
抽取式問答 (Extractive QA)從上下文直接抽取答案文本片段BERT, RoBERTa, XLNet閱讀理解、文檔問答準確度高、支持事實性回答答案必須在原文中
生成式問答 (Generative QA)生成自然語言答案文本T5, BART, GPT系列開放域問答、解釋性回答答案不受原文限制可能產(chǎn)生事實錯誤
開放域問答 (Open-Domain QA)不依賴給定上下文DPR (Dense Passage Retrieval), REALM百科問答、智能助手無需預設知識庫依賴外部知識檢索
基于知識的問答 (KBQA)利用知識圖譜推理DrQA, UNIK-QA專業(yè)領域問答支持復雜推理依賴預構建知識庫
多跳問答 (Multi-Hop QA)跨多文檔/段落推理HotpotQA, PathNet復雜問題回答支持深層次推理計算復雜度高
視覺問答 (VQA)結合圖像理解ViLBERT, LXMERT圖文混合問答多模態(tài)融合依賴視覺識別能力

問答的模型有很多,本文不做過多展示,下面就展示傳統(tǒng)的抽取式問答

模型地址:https://hf-mirror.com/uer/roberta-base-chinese-extractive-qa

import os
os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'
from transformers import pipelinemodel = pipeline(task="question-answering",model="uer/roberta-base-chinese-extractive-qa",device='cuda'
)# res = model(
#     {'question': "穩(wěn)穩(wěn)C9是誰",
#      'context': "穩(wěn)穩(wěn)C9是CSDN一名博主,處理爬蟲,以及前沿AI\n 小明是小紅的男朋友"}
#
# )
res = model(question="穩(wěn)穩(wěn)C9是誰", context="穩(wěn)穩(wěn)C9是CSDN一名博主,處理爬蟲,以及前沿AI\n 小明是小紅的男朋友")
print(res)

輸出

還是挺不錯的,我輸入了1個干擾內(nèi)容

{'score': 0.07943948358297348, 'start': 11, 'end': 13, 'answer': '博主'}

2.1.4 Summarization(文本摘要)

摘要類型核心特點典型模型適用場景優(yōu)勢局限性
抽取式摘要從原文中直接抽取關鍵句子或片段BERT, TextRank, BM25+新聞摘要、長文檔概覽保留原文準確性,避免事實錯誤摘要不夠流暢,無法生成新詞
生成式摘要理解原文后重新生成簡潔摘要T5, BART, PEGASUS, GPT系列生成流暢摘要、個性化摘要摘要更自然、簡潔可能偏離原意,存在幻覺風險
多文檔摘要從多個相關文檔中生成統(tǒng)一摘要MultiDoc, HMNet輿情分析、跨文檔信息整合支持跨文檔信息融合整合難度大,需要處理冗余信息
引導式摘要根據(jù)用戶指定的關鍵詞或主題生成摘要CTRLSum, Concept-guided Summarization個性化摘要生成、領域聚焦摘要定制化摘要內(nèi)容依賴引導信息的質量
對話摘要提取和整合對話中的核心信息TODSum, DialoGPT會議記錄、客服對話總結處理多輪對話結構對話信息分散,主題不連貫
長文檔摘要處理超長文本(10K token以上)LED, PRIMERA學術論文摘要、長篇小說概覽支持長上下文建模資源消耗大,復雜度高

本小節(jié),演示抽取式摘要模型
模型地址:https://hf-mirror.com/utrobinmv/t5_summary_en_ru_zh_base_2048

這里多說一下,該模型還有挺多用法,可以往下瀏覽
在這里插入圖片描述

import os
os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'
from transformers import pipelinemodel = pipeline(task="summarization",model="utrobinmv/t5_summary_en_ru_zh_base_2048",device='cuda',
)
res = model("""summary: 央廣網(wǎng)北京6月10日消息(總臺中國之聲記者韓雪瑩 朱宏源)據(jù)中央廣播電視總臺中國之聲報道,一群看上去只有十幾歲的少年,騎著山地自行車,
不戴護具、無視人流,在城市的商圈樓宇、公園廣場,從臺階、高坡等數(shù)米高的位置急速俯沖而下,
過往行人不得不緊急避讓……近期,一些未成年人在公共場所騎速降自行車炫技的短視頻廣泛傳播,引發(fā)市民擔憂。
其中,部分“速降少年”因操作失誤引發(fā)危險傷及自身,更有甚者,自行車失控撞倒路人。看似炫酷的極限運動,存在哪些安全隱患?
速降山地自行車運動又該如何規(guī)范發(fā)展、不負熱愛
""")print(res)

輸出

[{'summary_text': '一群看上去只有十幾歲的少年,騎著山地自行車,不戴護具、無視人流,在城市的商圈樓宇、公園廣場,從臺階、高坡等數(shù)米高的位置急速俯沖而下。'}]

2.2 音頻處理

音頻處理有很多好玩的,比如識別音頻中多少人,等等

本小節(jié)演示,音頻的情感分類
在這里插入圖片描述

在 huggingface上面有很多數(shù)據(jù)集可以公開使用,這里我們要找一個音頻,你也可以自己找
(我在下面代碼里面已經(jīng)準備了一個)

在這里插入圖片描述

2.1 環(huán)境安裝

安裝windows FFmpeg

訪問 FFmpeg 官方網(wǎng)站:https://ffmpeg.org/download.html
下載 Windows 版本(推薦:https://github.com/BtbN/FFmpeg-Builds/releases)

  • 解壓下載的 ZIP 文件(例如到 C:\ffmpeg)
  • 將 FFmpeg 添加到系統(tǒng)環(huán)境變量:
  • 打開 “系統(tǒng)屬性” > “高級” > “環(huán)境變量”
  • 在 “系統(tǒng)變量” 中找到Path,點擊編輯
  • 添加 FFmpeg 的 bin 目錄路徑(例如 C:\ffmpeg\bin)點擊確定保存
  • 記得重啟IDE

驗證環(huán)境

ffmpeg -version

2.2 音頻情感分類

本次使用模型:https://hf-mirror.com/firdhokk/speech-emotion-recognition-with-openai-whisper-large-v3

在這里插入圖片描述

這是一段語氣激昂的一段錄音,聽起來有點生氣

import os
os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'
from transformers import pipeline
model = pipeline(task="audio-classification",model="firdhokk/speech-emotion-recognition-with-openai-whisper-large-v3",device='cuda',
)
res = model("https://hf-mirror.com/datasets/Narsil/asr_dummy/resolve/main/mlk.flac")
print(res)

輸出

[{'score': 0.9832255244255066, 'label': 'angry'},  # 可以看到置信度很高
{'score': 0.014977349899709225, 'label': 'happy'}, 
{'score': 0.0007455425802618265, 'label': 'fearful'}, 
{'score': 0.0005094102816656232, 'label': 'neutral'},{'score': 0.00019644349231384695, 'label': 'sad'}]

2.3 圖片處理

在這里插入圖片描述

模型地址: https://hf-mirror.com/google/vit-base-patch16-224

import os
os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'
from transformers import pipeline
model = pipeline(task="image-classification",model="google/vit-base-patch16-224",device='cuda',
)
res = model("https://img0.baidu.com/it/u=2156020984,3145770830&fm=253&fmt=auto&app=138&f=JPEG")
print(res)

輸出

[{'label': 'Pomeranian', 'score': 0.5816799402236938},{'label': 'Eskimo dog, husky', 'score': 0.10331527143716812}, {'label': 'Chihuahua', 'score': 0.09424787759780884},{'label': 'Japanese spaniel', 'score': 0.018894687294960022}, {'label': 'Pembroke, Pembroke Welsh corgi', 'score': 0.01833692565560341}]

可以看到輸出了博美犬

其余標簽請查看
https://hf-mirror.com/google/vit-base-patch16-224/blob/main/config.json

2.3 視頻處理

視頻處理的模型很多,比如暴力,顏色檢測,等等

在這里插入圖片描述

模型地址:https://hf-mirror.com/MCG-NJU/videomae-large-finetuned-kinetics

安裝一個包

pip install decord

數(shù)據(jù)集地址:
https://hf-mirror.com/datasets/sayakpaul/ucf101-subset/blob/main/v_BasketballDunk_g14_c06.avi

在這里插入圖片描述
在這里插入圖片描述

這是一段NBA,籃球比賽的視頻

import os
os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'
from transformers import pipeline
model = pipeline(task="video-classification",model="MCG-NJU/videomae-large-finetuned-kinetics",device='cuda',
)
res = model("https://hf-mirror.com/datasets/sayakpaul/ucf101-subset/resolve/main/v_BasketballDunk_g14_c06.avi?download=true")
print(res)

輸出

[{'score': 0.44488775730133057, 'label': 'dunking basketball'},{'score': 0.12890341877937317, 'label': 'playing basketball'},{'score': 0.04511522129178047, 'label': 'dribbling basketball'}, {'score': 0.03531673923134804, 'label': 'shooting basketball'}, {'score': 0.0020291220862418413, 'label': 'ski jumping'}]

3、Datasets & Tokenizers(數(shù)據(jù)預處理)

在 Hugging Face 生態(tài)中,DatasetsTokenizers 是數(shù)據(jù)預處理的核心組件,它們共同構成了高效數(shù)據(jù)處理的基石。

3.1 Datasets

在這里插入圖片描述

核心特點:

  1. 海量數(shù)據(jù)集 & 簡單加載: 提供對成千上萬公開數(shù)據(jù)集(涵蓋 NLP、CV、音頻等)的一鍵式訪問 (load_dataset)。
  2. 高性能處理: 底層使用 Apache Arrow 內(nèi)存格式和零拷貝讀取,處理速度極快,特別適合處理大規(guī)模數(shù)據(jù)集。
  3. 內(nèi)存映射 (Memory-Mapping): 數(shù)據(jù)集只在訪問時加載到內(nèi)存,極大節(jié)省內(nèi)存開銷,輕松處理超大數(shù)據(jù)集(超過內(nèi)存大小)。
  4. 流式處理 (Streaming): 支持數(shù)據(jù)集流式讀取(load_dataset(..., streaming=True)),無需下載整個數(shù)據(jù)集到本地,即可逐條或小批量處理,極大加速處理超大、遠程數(shù)據(jù)集的開局速度。
  5. 靈活的轉換 (Transforms): 提供類似 mapfilter 的轉換方法,可以輕松地對數(shù)據(jù)集進行清洗、分詞、格式轉換等操作。轉換通常是惰性執(zhí)行的。
  6. 版本管理與緩存: 自動緩存處理過的數(shù)據(jù)集和加載的數(shù)據(jù)集,避免重復加載和轉換。支持數(shù)據(jù)集版本管理。
  7. 與框架集成: 方便地轉換為 PyTorch DataLoader (to_torch_dataset / DataLoader(dataset, ...)) 或 TensorFlow tf.data.Dataset (to_tf_dataset)。

官方文檔
https://hf-mirror.com/docs/datasets/v2.16.1/en/loading

官方文檔寫的很詳細,所以本小節(jié)主要還是以經(jīng)常使用的場景進行分享即可,深入了解,我覺得根據(jù)實際需求

去到官方文檔找對應的內(nèi)容即可,無需糾結

在這里插入圖片描述

3.1.1 加載數(shù)據(jù)

  • load_dataset_builder 檢查數(shù)據(jù)不下載本地
  • load_dataset 完全下載到本地

如果不想下載完整數(shù)據(jù),想預覽一下數(shù)據(jù)集可以到hub查看,或者通過load_dataset_builder確認

import os
os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'
from datasets import load_dataset_builder
ds_builder = load_dataset_builder("stanfordnlp/imdb")
print(ds_builder.info.description)
print(ds_builder.info.features)

輸出

Downloading readme: 7.81kB [00:00, ?B/s]{'text': Value(dtype='string', id=None), 'label': ClassLabel(names=['neg', 'pos'], id=None)}

利用 load_dataset 下載數(shù)據(jù)到本地

import os
os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'
from datasets import load_dataset
# 加載 電影數(shù)據(jù)集
dataset = load_dataset("stanfordnlp/imdb")
print(dataset)

輸出

Downloading data: 100%|██████████| 21.0M/21.0M [00:04<00:00, 4.56MB/s]
Downloading data: 100%|██████████| 20.5M/20.5M [00:04<00:00, 4.92MB/s]
Downloading data: 100%|██████████| 42.0M/42.0M [00:08<00:00, 5.01MB/s]
Generating train split: 100%|██████████| 25000/25000 [00:00<00:00, 431023.20 examples/s]
Generating test split: 100%|██████████| 25000/25000 [00:00<00:00, 625022.95 examples/s]
Generating unsupervised split: 100%|██████████| 50000/50000 [00:00<00:00, 617288.72 examples/s]DatasetDict({train: Dataset({features: ['text', 'label'],num_rows: 25000})test: Dataset({features: ['text', 'label'],num_rows: 25000})unsupervised: Dataset({features: ['text', 'label'],num_rows: 50000})
})

windows默認加載路徑

在這里插入圖片描述

  • Datasets 庫支持從本地加載數(shù)據(jù)集,支持多種格式(如 CSV、JSON、文本文件等)
dataset = load_dataset("csv", data_files="path/to/file.csv")
  • 查看加載后的數(shù)據(jù)信息
    在這里插入圖片描述

load_dataset 還有很多常用屬性,這里提及一下split可以只加載訓練集,這塊是根據(jù)開源數(shù)據(jù)標簽區(qū)分的
并不是所有數(shù)據(jù)集的都有 train

dataset_train = load_dataset("stanfordnlp/imdb",split="train")
  • 更多方法可以查看源碼

https://github.com/huggingface/datasets/blob/2.16.1/src/datasets/load.py#L2251

在這里插入圖片描述

3.1.2 訪問數(shù)據(jù)

  • 查看數(shù)據(jù)相關信息

    data_train = dataset['train']
    
    data_train.info
    
    data_train.features
    

    在這里插入圖片描述

  • 索引訪問某一行

    data_train[0]
    
  • 根據(jù)列名訪問

    data_train.column_names # ['text', 'label']
    data_train['text']
    
  • 還有很多聚合復雜訪問,請看開頭官方文檔

3.1.3 操作數(shù)據(jù)

  • 過濾數(shù)據(jù)

    data_train.filter(lambda x:x['label'] == 1)
    

    在這里插入圖片描述

  • 排序數(shù)據(jù)
    使用 sort() 根據(jù)其數(shù)值對列值進行排序。提供的列必須是 NumPy 兼容的’
    https://hf-mirror.com/docs/datasets/v2.16.1/en/process#sort

    data_train.sort('text')
    
  • 拆分數(shù)據(jù)
    https://hf-mirror.com/docs/datasets/v2.16.1/en/process#split
    將部分數(shù)據(jù)拆成為測試數(shù)據(jù)

    data_train.train_test_split(test_size=0.1)
    
    	DatasetDict({train: Dataset({features: ['text', 'label'],num_rows: 22500})test: Dataset({features: ['text', 'label'],num_rows: 2500})
    })
    
  • 分片數(shù)據(jù)
    https://hf-mirror.com/docs/datasets/v2.16.1/en/process#shard
    原本數(shù)據(jù)有25000行,分成4等份,從第0位開始

    data_train.shard(num_shards=4, index=0)
    

    在這里插入圖片描述

  • 數(shù)據(jù)映射
    https://hf-mirror.com/docs/datasets/v2.16.1/en/process#map
    通過map方法,將原本里面內(nèi)容全部大寫

    def preprocess_function(example):example['text'] = example['text'].upper()return exampledata_train2 = data_train.map(preprocess_function)
    

    在這里插入圖片描述
    當然支持批量處理,減少map時間

    data_train3 = data_train.map(preprocess_function,batched=True,batch_size=100)
    

3.1.4 導出數(shù)據(jù)

這個沒有什么好說的,自己看一下就好了

https://hf-mirror.com/docs/datasets/v2.16.1/en/process#save
https://hf-mirror.com/docs/datasets/v2.16.1/en/process#export

3.2 Tokenizers

在這里插入圖片描述

Tokenizers原生
官方代碼:https://github.com/huggingface/tokenizers/tree/v0.15.2
官方文檔:https://hf-mirror.com/docs/tokenizers/main/en/index

transformers的集成API文檔
https://hf-mirror.com/docs/transformers/v4.37.2/en/main_classes/tokenizer

調用方式

  1. from transformers import AutoTokenizer

    • 這是Hugging Face Transformers庫提供的高級API,它封裝了底層的tokenizers庫,并提供了與Transformers模型的無縫集成。
    • 使用AutoTokenizer可以自動根據(jù)模型名稱加載對應的分詞器(如’bert-base-uncased’),并且返回的是transformers.PreTrainedTokenizer(或其子類)的實例,這類分詞器可以直接用于Transformers模型的輸入處理。
  2. from tokenizers import Tokenizer

    • 這是直接使用Hugging Face的tokenizers庫,這是一個用Rust編寫的快速分詞庫。它提供了構建和使用分詞器的底層接口。
    • 這里的Tokenizer類是一個通用的分詞器,可以通過配置文件或者代碼來構建分詞器(如BPE、WordPiece等),然后進行訓練和使用。

關系

  • transformers庫中的分詞器(如BertTokenizer)通常使用tokenizers庫作為后端引擎(特別是新版的Transformers庫)。例如,當你調用AutoTokenizer.from_pretrained加載一個分詞器時,對于許多模型,它實際上是在內(nèi)部使用了tokenizers庫的Tokenizer類。

  • 但是,transformers庫的分詞器類(PreTrainedTokenizer)提供了額外的功能,比如與模型類對齊的特殊標記(如[CLS][SEP])的自動處理,以及提供與模型輸入格式一致的方法(如返回attention_mask、token_type_ids等)。

總結

  • 如果你使用的是Transformers庫中的模型,那么推薦使用transformers中的分詞器(如AutoTokenizer),因為這樣能確保分詞方式與模型預訓練時一致,并且可以方便地處理模型輸入所需的各種字段。

  • 如果你需要訓練一個新的分詞器,或者想要直接使用底層分詞庫的高性能特性,那么你可以使用tokenizers庫。然后,你也可以通過transformers庫的PreTrainedTokenizerFast將這個分詞器包裝成Transformers庫可以使用的格式。

特性維度tokenizers 庫 (原生)transformers.AugTokenizer (集成)
開發(fā)定位獨立高性能分詞引擎Transformers 模型的配套組件
主要語言Rust (核心) + Python 綁定Python
性能特點優(yōu)化極致速度 (比transformers快5-10倍)接口友好但速度較慢
使用復雜度需要構建訓練管道 (中高級)一行代碼加載預訓練 (入門友好)
適用場景定制化分詞器訓練/高性能需求直接使用預訓練模型

PS:本節(jié)內(nèi)容基本以transformers框架的 分詞器講解

3.2.1 為什么需要分詞器?

假設現(xiàn)在我們要處理一個文本

text = "📌@穩(wěn)穩(wěn)C9 最愛🚴?騎行,不喜歡釣魚,#技術分享時! 說:'關注我的博客!' 網(wǎng)址https://blog.csdn.net/weixin_44238683"
  • 傳統(tǒng)方案
    直接字符串切割處理

    字符列表 = [📌, @, 穩(wěn), 穩(wěn), C, 9,  ,,, 🚴, ...] 
    

    問題產(chǎn)生

    • URL 被拆成碎片:長 URL 變成無意義字符序列
    • 無法識別專業(yè)平臺:博客地址包含 “csdn” 技術社區(qū)名卻被拆分
    • 用戶名處理不當:“@穩(wěn)穩(wěn) C9” 中的用戶名關聯(lián)被破壞
    • 關鍵符號丟失:博客 URL 中的下劃線 (_) 和點 (.) 被忽略
  • Tokenizer 方案

    tokens = ["📌", "@", "穩(wěn)穩(wěn)", "C9", "最愛", "🚴?騎行", ",","不喜歡", "釣魚", ",", "#", "技術分享", "時","!", "說", ":", "'", "關注", "我的", "博客", "!", "'","網(wǎng)址", "https://blog.csdn.net/weixin_44238683"
    ]
    
  • 分析比對

    問題類型Tokenizer 解決方案案例體現(xiàn)
    平臺識別保留完整URL完整保留CSDN博客地址
    技術內(nèi)容處理識別技術社區(qū)名稱"csdn"保護技術專有名詞
    用戶標識保護用戶名關聯(lián)"@穩(wěn)穩(wěn)C9"保持整體關聯(lián)
    符號保護保留URL中的特殊字符下劃線和點號完整保留

3.2.2 以工作流程來理解分詞器

預清洗

可以看到文本有個特殊符號 "hello,how are you? ?"

預清洗:就像是為分詞器打掃 “工作臺”,只有干凈的環(huán)境,才能實現(xiàn)精準的分詞結果!

  1. 防止噪聲干擾:去除多余的空白、不可見字符和非語義符號,確保分詞器專注于有意義內(nèi)容
  2. 統(tǒng)一格式標準:將所有文本轉換為統(tǒng)一編碼(如 UTF-8),避免特殊字符錯誤
  3. 信息安全保護:處理敏感信息(如完整 URL),避免隱私泄露
  4. 規(guī)范化表達:將變體表達(如不同形式的引號)轉換為標準形式
  5. 提高模型魯棒性:為后續(xù)處理準備干凈的輸入源,降低錯誤傳遞風險
import os
os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'
input_text = "hello,how are you? ?"
def clean_text(text):# 替換特殊符號text = text.replace("?", "")return text.strip()
cleaned_text = clean_text(input_text)
print(cleaned_text)
執(zhí)行分詞器

模型地址:https://hf-mirror.com/google-bert/bert-base-chinese
官方文檔:https://hf-mirror.com/docs/transformers/v4.37.2/en/main_classes/tokenizer

from transformers import AutoTokenizer
# 加載預訓練的分詞器
tokenizer = AutoTokenizer.from_pretrained("google-bert/bert-base-chinese")
tokens_1 = tokenizer(input_text) # 沒進行清洗的輸入
print(tokens_1)
tokens_2 = tokenizer(cleaned_text) # 清洗后的輸入
print(tokens_2)

輸出

{'input_ids': [101, 8701, 117, 9510, 8995, 8357, 136, 100, 102], 
'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 0], 
'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1]}{'input_ids': [101, 8701, 117, 9510, 8995, 8357, 136, 102], 
'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0], 
'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1]}

鍵值對說明

  • input_ids:token 對應的 ID 列表。
    https://hf-mirror.com/docs/transformers/v4.37.2/en/glossary#input-ids

  • attention_mask:注意力掩碼,1 實際內(nèi)容,0 填充內(nèi)容 。
    https://hf-mirror.com/docs/transformers/v4.37.2/en/glossary#attention-mask

  • token_type_ids(可選):用于區(qū)分句子對的任務(如 BERT)。
    https://hf-mirror.com/docs/transformers/v4.37.2/en/glossary#token-type-ids

[101, 8701, 117, 9510, 8995, 8357, 136, 100, 102] 說明

獲取完整詞匯表,其實就是內(nèi)容鍵值關系,你可以查看

vocab_dict = tokenizer.get_vocab()

在這里插入圖片描述
為什么2個,清洗前后開頭都是 101,跟102?
在BERT分詞器中,有固定的特殊標記系統(tǒng)

特殊標記ID功能在序列中的位置
[CLS]101分類標記(Classification)序列開頭
[SEP]102分隔標記(Separator)序列結尾或句子間
[PAD]0填充標記(Padding)填充位置
[UNK]100未知標記(Unknown)未知詞位置
[MASK]103掩碼標記(Masked )掩碼語言

其實從堆棧也能看到

在這里插入圖片描述

解碼

在前面,我們編碼了兩個內(nèi)容,現(xiàn)在編碼查看效果

tokenizer.decode(tokens_1['input_ids'])
tokenizer.decode(tokens_2['input_ids'])

可以看到我們的解碼后的,沒有進《清洗的數(shù)據(jù)》出現(xiàn)了[UNK]代表未知標記

在這里插入圖片描述
當然為了更形象,你也可以運行如下代碼

# 解碼演示
def decode_demo(ids):"""解碼并顯示差異"""text = tokenizer.decode(ids)print(f"IDs: {ids}")print(f"解碼: {text}")print("="*50)# 原始文本解碼
decode_demo(tokens_1['input_ids'])# 清洗后解碼
decode_demo(tokens_2['input_ids'])

輸出

IDs: [101, 8701, 117, 9510, 8995, 8357, 136, 100, 102]
解碼: [CLS] hello, how are you? [UNK] [SEP]
==================================================
IDs: [101, 8701, 117, 9510, 8995, 8357, 136, 102]
解碼: [CLS] hello, how are you? [SEP]
==================================================

3.2.3 分詞器深入理解

PS:這章節(jié)最好!最好是動手操作,理解一下這個參數(shù)意義

源代碼位置: https://github.com/huggingface/transformers/blob/v4.37.2/src/transformers/tokenization_utils_base.py

from transformers import AutoTokenizer
# 加載預訓練的分詞器
tokenizer = AutoTokenizer.from_pretrained("google-bert/bert-base-chinese")
tokens_1 = tokenizer(input_text) # 沒進行清洗的輸入

運行這段代碼在tokens_1 單步調試DEBUG進去(本文文章開頭GIF 里面有跳轉路徑)
在這里插入圖片描述
BERT 模型都是繼承 PreTrainedTokenizerBase

在這里插入圖片描述
其實我們可以看一下這個基類的所有子類方法,點擊紅色

在這里插入圖片描述
可以看到很多子類分詞器,都是繼承于他

在這里插入圖片描述
在這里插入圖片描述
官方源碼文檔
https://github.com/huggingface/transformers/blob/v4.37.2/src/transformers/tokenization_utils_base.py#L1544
transformer文檔
https://hf-mirror.com/docs/transformers/v4.37.2/zh/internal/tokenization_utils#transformers.PreTrainedTokenizerBase.call
在這里插入圖片描述

1.核心參數(shù)詳解

基本文本輸入

參數(shù)名類型默認值說明
textstr/list[str]None要分詞的文本(單條或多條)
text_pairstr/list[str]None用于句子對任務(如NLI)的第二個句子
is_split_into_wordsboolFalse輸入是否已預處理為單詞列表

特殊標記控制

參數(shù)名類型默認值說明
add_special_tokensboolTrue是否添加模型特定的特殊標記([CLS]/[SEP]等)
return_special_tokens_maskboolFalse是否返回標記特殊token位置的掩碼

長度控制

參數(shù)名類型默認值說明推薦值
paddingbool/strFalse填充策略:True/‘longest’(批內(nèi)最長),‘max_length’(指定長度)‘max_length’
truncationbool/strFalse截斷策略:True(使用max_length),‘longest_first’(優(yōu)先截較長句)True
max_lengthintNone最大長度(截斷/填充依據(jù))512
strideint0當截斷返回所有片段時,連續(xù)片段間的重疊token數(shù)128(長文檔處理)
pad_to_multiple_ofintNone填充至該數(shù)的倍數(shù)(優(yōu)化GPU計算)8(GPU高效)

返回值控制

參數(shù)名類型默認值說明常用場景
return_tensorsstrNone返回張量格式:‘pt’(PyTorch), ‘tf’(TensorFlow), ‘np’(NumPy)‘pt’
return_token_type_idsboolNone是否返回token_type_ids(句子A/B標識)BERT類模型設為True
return_attention_maskboolNone是否返回attention_mask(實詞/填充區(qū)分)使用填充時設為True
return_overflowing_tokensboolFalse是否返回所有截斷片段(用于處理長文檔)處理長文本
return_offsets_mappingboolFalse是否返回每個token在原始文本中的位置(起始和結束索引)NER任務
return_lengthboolFalse是否返回每個序列的長度調試
2. 完整參數(shù)使用示例
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")# 處理句子對(如問答)
inputs = tokenizer(text="Where is Paris located?",        # 問題text_pair="Paris is the capital of France.",  # 上下文add_special_tokens=True,     # 添加[CLS]和[SEP]padding="max_length",        # 填充至最大長度truncation="longest_first",  # 優(yōu)先截斷較長序列max_length=512,              # 最大長度限制return_tensors="pt",         # 返回PyTorch張量return_token_type_ids=True,   # 返回句子類型IDreturn_attention_mask=True    # 返回注意力掩碼
)print("input_ids:", inputs["input_ids"].shape)
print("token_type_ids:", inputs["token_type_ids"][0, :20].tolist())
print("attention_mask:", inputs["attention_mask"][0, :20].tolist())

3.2.4 特殊標簽進一步理解

我們現(xiàn)在這節(jié)著重講一下,這些特殊標記,的意義,更使用場景

  • 利用 tokenizer.tokenize 分詞,以及token編碼,可以看到出現(xiàn) [UNK]

    from transformers import AutoTokenizer
    # 加載預訓練的分詞器
    tokenizer = AutoTokenizer.from_pretrained("google-bert/bert-base-chinese")
    input_text = "hello,how are you? ?"
    print(tokenizer.tokenize(input_text))
    print(tokenizer(input_text)['input_ids'])
    ['hello', ',', 'how', 'are', 'you', '?', '[UNK]']
    [101, 8701, 117, 9510, 8995, 8357, 136, 100, 102]

    如果大量的出現(xiàn)的 未知標記,對于模型理解來說是一個災難,不明白輸入,無法反饋輸出

    • 大量未知不影響用戶語義,可以清洗掉
    • 也可以創(chuàng)建特定標標簽

我們用一個實際的場景來比喻:

想象你開了一家"洗車店"

  1. 原始車輛進店(原始文本輸入)

    input_text = "聯(lián)系客服:support@company.com 了解詳情 ?"
    

    這輛"數(shù)據(jù)車"臟兮兮的:

    • 車身沾滿泥點(特殊符號 ?
    • 車窗貼著聯(lián)系電話的便簽(郵箱 support@company.com
    • 后備箱貼著公司網(wǎng)址貼紙(但我們還看不到網(wǎng)址)
  2. 預清洗工位(Clean)

    def clean_text(text):text = text.replace("?", "")  # 洗掉車身泥點text = re.sub(r"\S+@\S+", "[EMAIL]", text)  # 用統(tǒng)一貼紙覆蓋聯(lián)系方式return text.strip()cleaned_text = "聯(lián)系客服:[EMAIL] 了解詳情"
    

    現(xiàn)在車輛煥然一新:
    - 車身干凈無泥點
    - 聯(lián)系方式被統(tǒng)一標識覆蓋
    - 保持核心信息完整(聯(lián)系客服了解詳情)

  3. 貼標工位(Tokenizer)

    from transformers import AutoTokenizer
    tokenizer = AutoTokenizer.from_pretrained("google-bert/bert-base-chinese")
    tokens = tokenizer(cleaned_text)
    print(tokens)
    

    洗車店為車輛貼上統(tǒng)一標識貼紙:

    • 101: 🚗 洗車店入場貼紙 (CLS)
    • 1234: “聯(lián)系”
    • 5678: “客服”
    • 9999: [EMAIL] 特殊貼紙
    • 2345: “了解詳情”
    • 102: 🛣? 洗車店出場貼紙 (SEP)
  4. 轉運至工廠(模型處理)

    model_input = {'input_ids': [101, 1234, 5678, 9999, 2345, 102],'attention_mask': [1,1,1,1,1,1]
    }
    

    洗干凈的車輛被送至不同工廠:

    • 客服機器人工廠:看到 [EMAIL] 標識,會換成真實的客服郵箱
    • 數(shù)據(jù)分析工廠:保留 [EMAIL] 標識,用于統(tǒng)計客服咨詢數(shù)量
    • 審計部門:看到統(tǒng)一標識知道這里有私人信息,加強安全措施

3.2.4 常用功能總結

預清洗
分詞
ID轉換
模型輸入
解碼
1. 基礎分詞 (tokenize)
input_text = "hello,how are you? ?"
cleaned_text = input_text.replace("?", "").strip()# 基礎分詞
print("原始文本分詞:", tokenizer.tokenize(input_text))
print("清洗后分詞:", tokenizer.tokenize(cleaned_text))

輸出結果:

原始文本分詞: ['hello', ',', 'how', 'are', 'you', '?', '[UNK]']
清洗后分詞: ['hello', ',', 'how', 'are', 'you', '?']

功能說明

  • 基礎文字拆分:將文本拆分為最小語義單元
  • 特殊符號處理:[UNK]標記表示不可識別內(nèi)容
  • 使用場景:快速查看分詞效果,無需生成模型輸入
2. 完整分詞處理 (__call__)
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("google-bert/bert-base-chinese")
input_text = "hello,how are you? ?"
cleaned_text = input_text.replace("?", "").strip()
inputs = tokenizer(cleaned_text,padding="max_length",          # 自動填充到設置的max_length為10的長度truncation=True,       # 自動截斷max_length=10,        # 最大長度return_tensors="pt"   # 返回PyTorch張量
)pprint(inputs)

輸出結構: 可以看到attention_mask 最后出現(xiàn)0為,為填充的內(nèi)容

{
'attention_mask': tensor([[1, 1, 1, 1, 1, 1, 1, 1, 0, 0]]), 'input_ids': tensor([[ 101, 8701,  117, 9510, 8995, 8357,  136,  102,    0,    0]]),'token_type_ids': tensor([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]])}

功能特點

  • 自動化處理:一鍵完成分詞、填充、特殊標記添加等
  • 框架支持:通過return_tensors指定TensorFlow/PyTorch格式
  • 批處理優(yōu)化:支持多文本同時處理

在這里重點講一下

3. 編碼與解碼
文本 → ID (encode)
# 單條文本編碼
input_ids = tokenizer.encode(cleaned_text)
print(f"編碼結果: {input_ids}")# 批量編碼(性能提升10倍)
texts = [cleaned_text, "你好世界", "NLP很有趣"]
batch_ids = tokenizer.batch_encode_plus(texts, padding=True,return_tensors="pt"
)
print("批量編碼:", batch_ids)

輸出結果

編碼結果: [101, 8701, 117, 9510, 8995, 8357, 136, 102]
批量編碼: {'input_ids': tensor([[ 101, 8701,  117, 9510, 8995, 8357,  136,  102],[ 101,  872, 1962,  686, 4518,  102,    0,    0],[ 101,  100, 2523, 3300, 6637,  102,    0,    0]]), 'token_type_ids': tensor([[0, 0, 0, 0, 0, 0, 0, 0],[0, 0, 0, 0, 0, 0, 0, 0],[0, 0, 0, 0, 0, 0, 0, 0]]), 'attention_mask': tensor([[1, 1, 1, 1, 1, 1, 1, 1],[1, 1, 1, 1, 1, 1, 0, 0],[1, 1, 1, 1, 1, 1, 0, 0]])}
ID → 文本 (decode)
# 基本解碼
decoded_text = tokenizer.decode(input_ids)
print("解碼結果:", decoded_text)# 去特殊標記解碼
clean_decoded = tokenizer.decode(input_ids, skip_special_tokens=True)
print("干凈解碼:", clean_decoded)# 保留特殊標記
full_decoded = tokenizer.decode(input_ids, skip_special_tokens=False)
print("完整解碼:", full_decoded)

輸出結果

解碼結果: [CLS] hello, how are you? [SEP]
干凈解碼: hello, how are you?
完整解碼: [CLS] hello, how are you? [SEP]
4. 詞匯表操作
詞匯表查詢
# 查看詞匯量
print(f"詞匯表大小: {len(tokenizer)}")# 查看特定token信息
print("hello的ID:", tokenizer.convert_tokens_to_ids("hello"))
print("ID 102對應的token:", tokenizer.convert_ids_to_tokens(102))# 特殊標記信息
print(f"[CLS]標記: {tokenizer.cls_token} (ID: {tokenizer.cls_token_id})")

輸出結果

詞匯表大小: 21128
hello的ID: 8701
ID 102對應的token: [SEP]
[CLS]標記: [CLS] (ID: 101)
擴展詞匯表
# 添加新詞匯
new_tokens = ["穩(wěn)扎穩(wěn)打", "C++", "?", "transformers"]
num_added = tokenizer.add_tokens(new_tokens)
print(f"添加了{num_added}個新詞匯")# 驗證添加效果
for token in new_tokens:   print(f"{token}的ID:", tokenizer.convert_tokens_to_ids(token))# 獲取所有特殊標記
print("特殊標記映射:", tokenizer.special_tokens_map)

咱可以看看效果

# 查看編碼后的
tokens = tokenizer("hello,how are you? ?")
pprint(tokens)
# 查看分詞后的
res = tokenizer.tokenize("hello,how are you? ?")
pprint(res)
# 查看ID解碼
print(tokenizer.decode(tokens["input_ids"]))

輸出,可以看到?jīng)]有 [UNK] 未知標簽

{'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1],'input_ids': [101, 8701, 117, 9510, 8995, 8357, 136, 21130, 102],'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 0]}
['hello', ',', 'how', 'are', 'you', '?', '?']
[CLS] hello, how are you? ? [SEP]

擴展詞匯表場景

  • 領域專業(yè)術語(醫(yī)療、法律等)
  • 新出現(xiàn)詞匯(網(wǎng)絡用語、新興技術)
  • 特殊符號(表情、公式符號)

五、相關閱讀

  • How Transformers work in deep learning and NLP: an intuitive introduction
    深度學習和自然語言處理中 Transformers 的工作原理:直觀入門
  • Transformer Architecture Transformer 架構
  • Attention Is All You Need
  • 深入淺出 Hugging Face:解鎖 NLP 的強大工具
http://aloenet.com.cn/news/45964.html

相關文章:

  • 簡單模板網(wǎng)站制作時間百度優(yōu)化是什么意思
  • 武漢網(wǎng)站建設老牌公司適合推廣的app有哪些
  • 網(wǎng)站建設代碼生成器重慶seo外包平臺
  • dw軟件做二級連接網(wǎng)站長春網(wǎng)站制作推廣
  • 南京美容網(wǎng)站建設營銷案例
  • 網(wǎng)站建設報價明細表指數(shù)分布的分布函數(shù)
  • 福州正規(guī)網(wǎng)站建設公司報價雙灤區(qū)seo整站排名
  • 蕪湖做公司網(wǎng)站網(wǎng)站優(yōu)化排名網(wǎng)站
  • 哪個教育網(wǎng)站做助理造價師培訓關鍵詞優(yōu)化排名用哪些軟件比較好
  • 手機網(wǎng)站推廣怎么做軟文營銷常用的方式
  • 凡科做的網(wǎng)站手機版目錄搜索引擎有哪些
  • 有什么軟件可以找客戶搜索引擎營銷與seo優(yōu)化
  • 網(wǎng)站admin目錄名怎么改百度運營公司
  • 做網(wǎng)站可以用python么谷歌搜索入口365
  • 做網(wǎng)站需要填什么軟文推廣代表平臺
  • 工業(yè)b2b網(wǎng)站建設網(wǎng)站推廣的目的
  • 閘北區(qū)網(wǎng)站建設搜索推廣代運營
  • 官方網(wǎng)站平臺有哪些百度關鍵字推廣費用
  • 自己做電影網(wǎng)站可以賺錢嗎新媒體運營培訓班
  • 懶人做圖網(wǎng)站江門seo
  • 國外家譜網(wǎng)站的建設關鍵詞排名怎么做上首頁
  • 四川成都最新新聞事件今天深圳谷歌seo推廣
  • 自己的服務器做網(wǎng)站優(yōu)速網(wǎng)站建設優(yōu)化seo
  • web app 和網(wǎng)站的區(qū)別企業(yè)郵箱賬號
  • 定制做網(wǎng)站百度網(wǎng)絡科技有限公司
  • 免費做網(wǎng)站的網(wǎng)址有哪些網(wǎng)絡整合營銷4i原則
  • 微信小網(wǎng)站怎么做百度競價廣告推廣
  • 盱眙在仕德偉做網(wǎng)站的有幾家如何進行品牌營銷
  • 焦作市網(wǎng)站建設科技推廣方法有哪幾種
  • 寧波外貿(mào)網(wǎng)站推廣今日頭條重大消息