LLM基礎1_語言模型如何處理文本

基于GitHub項目:https://github.com/datawhalechina/llms-from-scratch-cn

工具介紹

  • tiktoken:OpenAI開發的專業"分詞器"

  • torch:Facebook開發的強力計算引擎,相當于超級計算器

理解詞嵌入:給詞語畫"肖像"

  • 傳統方法:給每個詞一個編號(就像學生學號)

  • 詞嵌入:給每個詞畫一幅多維畫像(就像用顏色、形狀、紋理描述一幅畫),但是計算機理解不了這樣的描述,所以我們轉成多維向量來描述每個詞

?例如:

"國王" → [0.8, -0.2, 0.5]

"王后" → [0.7, -0.1, 0.6]

"蘋果" → [0.1, 0.9, -0.3]

計算機通過計算向量相似度(如余弦相似度)就可以知道“國王”與“王后”關系更密切,與“蘋果”沒什么關系!

文本分詞:把文章切成"詞塊"

(LLM對于長文本的識別能力限制,所以要切塊)

第一步:讀取文本

with open("sample.txt", "r", encoding="utf-8") as f:raw_text = f.read()

第二步:分詞器切分文本

舉例:“Hello?world.”

# 簡單切分:按空格切割
["Hello,", " ", "world."]
import re
# 專業切分:同時處理標點符號
text = "Hello, world. Is this-- a test?"
result = re.split(r'([,.?_!"()\']|--|\s)', text)
#正則表達式 r'([,.?_!"()\']|--|\s)' 匹配以下任意一種情況:
#單字符標點符號:,.?_!"()'
#雙連字符 --
#空白字符 \s
#括號 () 將整個模式捕獲為一個分組,確保 re.split 保留分隔符。
#空字符串 '' 出現在連續分隔符或字符串末尾時,表示相鄰分隔符之間的空匹配。切割結果:['Hello', ',', 'world', '.', 'Is', 'this', '--', 'a', 'test', '?']

第三步:清理切割結果

# 清除空白碎片
result = [item.strip() for item in result if item.strip()]
#對于單個字符串,可使用strip()方法移除首尾空白

通過這種處理,計算機從"看到一堆字母"變成"理解詞語之間的關系"。

將詞元轉換為詞元IDs?

舉例解釋這樣做的目的:

????????老師記不住所有學生名字 → 用學號點名

????????計算機記不住所有詞語 → 用數字ID處理文本

優勢:

  1. 計算機處理數字比處理文本快得多

  2. 數字形式更適合數學計算(比如詞嵌入)

  3. 統一格式方便存儲和傳輸

第一步:收集所有詞(去重)

all_words = sorted(list(set(preprocessed)))  # 用集合去重,列表裝好所有詞,sorted排序
vocab_size = len(all_words)

第二步:創建詞語?ID的映射表

# 像單詞表一樣:單詞 → 序號
vocab = {"!":0, '"':1, "'":2, ... "He":50} # 同時也需要序號 → 單詞的反向映射
int_to_str = {0:"!", 1:'"', 2:"'", ... 50:"He"}

舉例:一個詞對應一個特殊的ID,方便查找

詞語ID詞語ID
!0HAD46
"1Had47
'2Hang48
(3......

創建分詞器

#基礎版分詞器
class SimpleTokenizerV1:def __init__(self, vocab):self.str_to_int = vocab  # 詞語→IDself.int_to_str = {i:s for s,i in vocab.items()}  # ID→詞語def encode(self, text):  # 文本 → 數字# 1. 分割文本為詞語# 2. 清理空白# 3. 查表轉換為IDreturn [self.str_to_int[s] for s in preprocessed]def decode(self, ids):  # 數字 → 文本# 1. ID轉回詞語# 2. 拼接成句子# 3. 修復標點空格return text

使用舉例:

text = """"It's the last he painted, you know," Mrs. Gisburn said."""
ids = SimpleTokenizerV1.encode(text) 
# [1, 58, 2, 872, 1013, 615, 541, 763, 5, 1155, 608, ...]decoded = SimpleTokenizerV1.decode(ids)
# ""It's the last he painted, you know," Mrs. Gisburn said."""

處理特殊詞元

(遇到某個新詞沒有在詞匯表中)

舉例:

text = "Hello, do you like tea?"
# 報錯:KeyError: 'Hello'(Hello不在詞匯表中)

解決方案:添加特殊詞元

all_tokens.extend(["<|endoftext|>", "<|unk|>"])
特殊詞元作用
<|unk|>
未知詞語
<|endoftext|>
文本結束標記
<|bos|>
文本開始標記
<|pad|>填充對齊
#升級版分詞器
class SimpleTokenizerV2:def __init__(self, vocab):self.str_to_int = vocab  # 詞語→IDself.int_to_str = {i:s for s,i in vocab.items()}  # ID→詞語def encode(self, text):# 遇到不認識的詞就用<|unk|>代替preprocessed = [item if item in self.str_to_int else "<|unk|>" for item in preprocessed]return [self.str_to_int[s] for s in preprocessed]#def encode(self, text):  # 文本 → 數字# 1. 分割文本為詞語# 2. 清理空白# 3. 查表轉換為ID#return [self.str_to_int[s] for s in preprocessed]def decode(self, ids):  # 數字 → 文本# 1. ID轉回詞語# 2. 拼接成句子# 3. 修復標點空格return text
#特殊詞元的使用
text1 = "Hello, do you like tea?"
text2 = "In the sunlit terraces of the palace."# 用<|endoftext|>連接兩段文本
text = text1 + " <|endoftext|> " + text2ids = tokenizer.encode(text)
# [1160, 5, 362, ... 1159, 57, 1013, ... 1160, 7]tokenizer.decode(ids)
# "Hello, do you like tea? <|endoftext|> In the sunlit terraces of the palace."
# 注意:Hello和palace被標記為<|unk|>

過程總結:

  • 用戶輸入 → 轉換為ID → 模型處理 → 生成回復ID → 轉換回文本

小思考:為什么GPT模型不需要[PAD][UNK]

GPT使用更先進的字節對編碼(BPE),總能將詞語拆分成已知子詞

GPT用同一個<|endoftext|>標記表示結束和填充

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/908985.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/908985.shtml
英文地址,請注明出處:http://en.pswp.cn/news/908985.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【HarmonyOS 5.0】開發實戰:從UI到Native全解析

一、環境搭建與項目創建 ??跨平臺安裝?? DevEco Studio支持Windows/macOS系統&#xff0c;安裝包集成HarmonyOS SDK、Node.js和OHPM工具鏈。 Windows&#xff1a;雙擊.exe選擇非中文路徑macOS&#xff1a;拖拽.app至Applications目錄驗證&#xff1a;通過Help > Diagnos…

零知開源——STM32F103RBT6驅動 ICM20948 九軸傳感器及 vofa + 上位機可視化教程

STM32F1 本教程使用零知標準板&#xff08;STM32F103RBT6&#xff09;通過I2C驅動ICM20948九軸傳感器&#xff0c;實現姿態解算&#xff0c;并通過串口將數據實時發送至VOFA上位機進行3D可視化。代碼基于開源庫修改優化&#xff0c;適合嵌入式及物聯網開發者。在基礎驅動上新增…

華為OD最新機試真題-食堂供餐-OD統一考試(B卷)

題目描述 某公司員工食堂以盒飯方式供餐。 為將員工取餐排隊時間降低為0,食堂的供餐速度必須要足夠快,現在需要根據以往員工取餐的統計信息,計算出一個剛好能達成排隊時間為0的最低供餐速度。即,食堂在每個單位時間內必須至少做出 多少價盒飯才能滿足要求。 輸入描述 第1行…

【筆記】MSYS2 的 MINGW64 環境 全面工具鏈

#工作記錄 MSYS2 的 MINGW64 環境&#xff08;mingw64.exe&#xff09;&#xff0c;下面是為該環境準備的最全工具鏈安裝命令&#xff08;包括 C/C、Python、pip/wheel、GTK3/GTK4、PyGObject、Cairo、SDL2 等&#xff09;。 這一環境適用于構建原生 64 位 Windows 應用程序。…

基于 HTTP 的單向流式通信協議SSE詳解

SSE&#xff08;Server-Sent Events&#xff09;詳解 &#x1f9e0; 什么是 SSE&#xff1f; SSE&#xff08;Server-Sent Events&#xff09; 是 HTML5 標準中定義的一種通信機制&#xff0c;它允許服務器主動將事件推送給客戶端&#xff08;瀏覽器&#xff09;。與傳統的 H…

【react+antd+vite】優雅的引入svg和阿里巴巴圖標

1.安裝相關包 由于是vite項目&#xff0c;要安裝插件來幫助svg文件引入進來&#xff0c;否則會失敗 npm下載包 npm i vite-plugin-svgr vite.config.ts文件內&#xff1a; import svgr from "vite-plugin-svgr"; //... export default defineConfig({plugins: …

UI框架-通知組件

UI框架-通知組件 介紹 一個基于 Vue 3 的輕量級通知組件庫&#xff0c;提供了豐富的消息通知功能。支持多種通知類型、自定義樣式、進度條顯示等特性。 特性 &#x1f3a8; 支持多種通知類型&#xff1a;信息、成功、警告、錯誤? 支持進度條顯示&#x1f504; 支持加載中狀…

WordZero:讓Markdown與Word文檔自由轉換的Golang利器

在日常工作中&#xff0c;我們經常需要在Markdown和Word文檔之間進行轉換。Markdown方便編寫和版本控制&#xff0c;而Word文檔更適合正式的商務環境。作為一名Golang開發者&#xff0c;我開發了WordZero這個庫&#xff0c;專門解決這個痛點。 項目背景 GitHub倉庫&#xff1…

計算機網絡面試匯總(完整版)

基礎 1.說下計算機網絡體系結構 計算機網絡體系結構&#xff0c;一般有三種&#xff1a;OSI 七層模型、TCP/IP 四層模型、五層結構。 簡單說&#xff0c;OSI是一個理論上的網絡通信模型&#xff0c;TCP/IP是實際上的網絡通信模型&#xff0c;五層結構就是為了介紹網絡原理而折…

動端React表格組件:支持合并

前言 在移動端開發中&#xff0c;表格組件是一個常見但復雜的需求。相比PC端&#xff0c;移動端表格面臨著屏幕空間有限、交互方式不同、性能要求更高等挑戰。本文將詳細介紹如何從零開始構建一個功能完整的移動端React表格組件&#xff0c;包含固定列、智能單元格合并、排序等…

廣告系統中后鏈路數據為什么要使用流批一體技術?流批一體技術是什么?

在大規模廣告系統的后鏈路(離線和實時特征計算、模型訓練與上線、效果監控等)中,往往既有對海量歷史數據的批量計算需求(離線特征、離線模型訓練、報表匯總),又有對在線請求的低延遲實時計算需求(實時特征、在線打分、實時監控/告警)。傳統將二者割裂、用 Lambda 架構…

6.10 - 常用 SQL 語句以及知識點

MySQL 技術 SQL 是結構化查詢語言&#xff0c;他是關系型數據庫的通用語言 SQL 可以分為分為以下三個類別 DDL (data definition languages) 語句 數據定義語言&#xff0c;定義了 不同的數據庫、表、索引等數據庫對象的定義。常用的的語句關鍵字包括 **create、drop、alter …

OpenCV CUDA 模塊光流計算------稀疏光流算法類SparsePyrLKOpticalFlow

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 OpenCV CUDA 模塊中實現的稀疏光流算法類&#xff0c;基于 Lucas-Kanade 方法&#xff0c;并支持圖像金字塔結構。適用于特征點跟蹤任務&#xf…

免費工具-微軟Bing Video Creator

目錄 引言 一、揭秘Bing Video Creator 二、輕松上手&#xff1a;三步玩轉Bing Video Creator 2.1 獲取與訪問&#xff1a; 2.2 創作流程&#xff1a; 2.3 提示詞撰寫技巧——釋放AI的想象力&#xff1a; 三、核心特性詳解&#xff1a;靈活滿足多樣化需求 3.1 雙重使用模…

MySQL技術內幕1:內容介紹+MySQL編譯使用介紹

文章目錄 1.整體內容介紹2.下載編譯流程2.1 安裝編譯工具和依賴庫2.2 下載編譯 3.配置MySQL3.1 數據庫初始化3.2 編輯配置文件3.3 啟動停止MySQL3.4 登錄并修改密碼 1.整體內容介紹 MySQL技術系列文章將從MySQL下載編譯&#xff0c;使用到MySQL各組件使用原理源碼分析&#xf…

MySQL 事務詳解

MySQL 事務詳解 一、事務是什么&#xff1f;為什么需要事務&#xff1f; 二、事務的四大特性&#xff08;ACID&#xff09;舉例說明&#xff1a;轉賬操作 三、MySQL 中事務的支持四、事務分類&#xff1a;隱式 vs 顯式1. 隱式事務&#xff08;自動提交&#xff09;2. 顯式事務&…

深入淺出Asp.Net Core MVC應用開發系列-AspNetCore中的日志記錄

ASP.NET Core 是一個跨平臺的開源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 應用。 ASP.NET Core 中的日志記錄 .NET 通過 ILogger API 支持高性能結構化日志記錄&#xff0c;以幫助監視應用程序行為和診斷問題。 可以通過配置不同的記錄提供程…

利用coze工作流制作一個自動生成PPT的智能體

在Coze平臺中&#xff0c;通過工作流實現PPT自動化生成是一個高效且靈活的解決方案&#xff0c;尤其適合需要快速產出標準化演示文稿的場景。以下是基于Coze工作流制作PPT的核心邏輯與操作建議&#xff1a; 理論流程 一、核心流程設計 需求輸入與解析 用戶輸入&#xff1a;主…

vue3 按鈕級別權限控制

在Vue 3中實現按鈕級別的權限控制&#xff0c;可以通過多種方式實現。這里我將介紹幾種常見的方法&#xff1a; 方法1&#xff1a;使用Vue 3的Composition API 在Vue 3中&#xff0c;你可以使用Composition API來創建一個可復用的邏輯來處理權限控制。 創建權限控制邏輯 首…

spa首屏加載慢怎樣解決

SPA&#xff08;Single Page Application&#xff0c;單頁應用&#xff09;首屏加載慢是一個常見問題&#xff0c;主要原因通常是首次加載需要拉取體積較大的 JavaScript 文件、樣式表、初始化數據等。以下是一些常見的 優化策略&#xff0c;可以幫助你 提升首屏加載速度&#…