AI 之 LLM(大語言模型)是如何生成文本的!

你是不是也曾在朋友面前自信滿滿地說:“AI我可太熟了!”然后隨便丟一句“寫篇短文”給大模型,坐等它秒出結果?但你有沒有想過,那幾秒鐘里,AI到底干了什么?從你敲下的幾個字,到屏幕上蹦出的流暢句子,這背后可不是什么“魔法”。如果你連LLM(大語言模型)如何生成文本都不清楚,還好意思說自己懂AI?別急,今天我就帶你拆開這臺“寫作機器”,用最直白的方式講清楚每個步驟,看完你再吹牛,至少底氣足點!

一、LLM文本生成的核心步驟

圖片

1. 輸入階段(Input):一切從你開始

一切的開始,來自用戶的輸入。你可以輸入一個提示、一個問題,或者是一段未完成的句子,模型會基于這個“起點”繼續生成內容。

2. 分詞(Tokenization):把句子拆成小塊

為了讓模型理解文本,首先需要將文字拆解成更小的單元——Token。Token 可能是一個詞、一個子詞,甚至是一個字符,具體取決于使用的分詞器(如 BPE、WordPiece 等)。比如“Hello, I'm an AI assistant.”可能會被拆成['Hello', ',', 'I', "'m", 'an', 'AI', 'assistant', '.']。

3. 嵌入(Embedding):給每個小塊賦予“含義”

接下來,分詞后的每個Token會被轉換為向量,也就是我們常說的“嵌入表示”。這個過程幫助模型理解每個Token的語義信息。比如,“Hello”和“Hi”在嵌入空間里會很接近。

4. 位置編碼(Positional Encoding):記住誰在前誰在后

由于 Transformer 本身不具備處理“順序”的能力,因此需要為每個Token添加位置信息,以便模型知道哪個詞在前,哪個在后。位置編碼給每個Token加上順序信息,確保模型理解詞序,比如“貓追狗”和“狗追貓”的區別。

5. Transformer處理階段:大腦開始運轉

這一步是 LLM 的“核心大腦”部分。嵌入和位置編碼后的向量會被送入多層Transformer結構中,每層都包含自注意力機制和前饋神經網絡。自注意力(Self-Attention)允許模型在處理某個詞時,同時“關注”其他詞,從而捕捉長距離的上下文依賴。它通常有多層(比如Llama3有32層),逐步完善文本。

6. 輸出轉換(Output Transformation):準備“選詞”

經過多層 Transformer 后,輸出結果還不能直接變成文字。我們需要通過一個線性變換,將它映射回詞表中的每個詞可能性。處理后的結果變成一個巨大的向量,每個維度對應詞匯表中的一個詞。

7. Softmax函數:把潛力變成概率

接下來應用 Softmax,把這些值轉化為概率分布,表示下一個Token是詞表中每個詞的可能性有多大。

8. 采樣(Sampling):決定下一個詞

有了概率分布,模型就可以選擇下一個Token了。不同的策略會影響生成結果,比如:

  • 貪心采樣(Greedy):每次選最高概率的詞。

  • 隨機采樣(Random):按概率隨機選擇一個詞。

  • 核采樣(Top-p):在累計概率前p%的詞中隨機選一個。

  • 溫度采樣(Temperature):控制生成的多樣性。

9. 生成文本:一步步拼湊

Token 一個個被采樣出來,拼接在一起,直到模型遇到結束標記,或達到設定長度,完成整個文本生成過程。模型通過重復預測和采樣的過程,直到生成完整的句子。

10. 后處理(Post-processing):給文本“化妝”

最后,對生成的文本進行一些清理,比如去掉特殊符號、調整格式,甚至可以進行語法檢查,使得文本更自然可讀。

二、用代碼案例深入理解生成流程(程序員最興奮的章節

圖片

我們以 OpenAI 的 GPT-2 模型為例,配合?tikToken?分詞器和 PyTorch 框架,來展示如何分詞、嵌入,并查看每個Token的語義向量。

import?torch
import?tikToken
from?transformers?import?GPT2Model# 初始化編碼器
encoder = tikToken.get_encoding("gpt2")
model = GPT2Model.from_pretrained("gpt2")# 輸入文本
text =?"Hello, I'm an AI assistant."
Token_ids = encoder.encode(text)
Tokens = [encoder.decode([tid])?for?tid?in?Token_ids]# 轉換為張量
inputs = torch.tensor([Token_ids])# 獲取模型嵌入輸出
with?torch.no_grad():outputs = model(inputs)last_hidden_states = outputs.last_hidden_state
for?Token, emb?in?zip(Tokens, last_hidden_states[0]):print(f"Token:?{Token}\nEmbedding:?{emb}\n")

每一個Token對應的向量(Embedding),都承載著它在語義空間中的“位置”。

三、繼續深入:從位置編碼到輸出生成

示例1:位置編碼 Positional Encoding

Transformer需要位置信息才能理解順序。以下代碼實現了位置編碼的生成:

import?torchimport?math
def?positional_encoding(seq_length, d_model):? ??pe?= torch.zeros(seq_length, d_model)? ??position?= torch.arange(0, seq_length, dtype=torch.float).unsqueeze(1)? ??div_term?= torch.exp(torch.arange(0, d_model,?2).float() * (-math.log(10000.0) / d_model))? ??pe[:,?0::2] = torch.sin(position * div_term)? ??pe[:,?1::2] = torch.cos(position * div_term)? ??return?pe
pos_encoding?= positional_encoding(10,?16)print(pos_encoding)

示例2:構建一個簡化的 Transformer 模型

import torch.nn?as nn
class SimpleTransformer(nn.Module):? ? def?__init__(self, input_dim, model_dim, num_heads, num_layers):? ? ? ??super(SimpleTransformer, self).__init__()? ? ? ? self.embedding = nn.Embedding(input_dim, model_dim)? ? ? ? self.position_encoding =?positional_encoding(5000, model_dim)? ? ? ? self.transformer_layers = nn.TransformerEncoder(? ? ? ? ? ? nn.TransformerEncoderLayer(model_dim, num_heads, model_dim *?4), num_layers? ? ? ? )? ? ? ? self.fc_out = nn.Linear(model_dim, input_dim)
? ? def?forward(self, x):? ? ? ? x = self.embedding(x) + self.position_encoding[:x.size(1), :]? ? ? ? x = self.transformer_layers(x)? ? ? ? return self.fc_out(x)
# 示例運行model =?SimpleTransformer(input_dim=10000, model_dim=512, num_heads=8, num_layers=6)input_seq = torch.randint(0,?10000, (10,?20))output_seq =?model(input_seq)
# Softmax 轉換為概率output_layer = nn.Linear(512,?10000)output_seq_transformed =?output_layer(output_seq)softmax = nn.Softmax(dim=-1)probabilities =?softmax(output_seq_transformed)

可以看到,最終得到的是一個維度為?(batch_size, seq_length, vocab_size)?的概率分布,用于采樣生成下一個詞。

示例3:采樣策略與預測

# 貪心預測predicted_tokens = torch.argmax(probabilities, dim=-1)print(predicted_tokens)
# 隨機采樣predicted_tokens_random = torch.multinomial(? ? probabilities.view(-1, probabilities.size(-1)), 1).view(probabilities.size()[:-1])print(predicted_tokens_random)

示例4:文本生成主流程

以?LLaMA3?為例,下面是一個典型的生成循環:def generate_text(model, tokenizer, start_text, max_length):

? ? tokens = tokenizer.encode(start_text)? ? generated = tokens.copy()? ? for _ in?range(max_length -?len(tokens)):? ? ? ? input_tensor = torch.tensor([generated])? ? ? ? with torch.no_grad():? ? ? ? ? ? output =?model(input_tensor)? ? ? ? next_token_logits = output[:, -1, :]? ? ? ? next_token_probs = torch.softmax(next_token_logits, dim=-1)? ? ? ? next_token = torch.multinomial(next_token_probs, num_samples=1).item()? ? ? ? generated.append(next_token)? ? return tokenizer.decode(generated)

四、總結

看完這篇,LLM從輸入到輸出的“魔法”流程你總算搞清楚了吧?別再只是當個“AI用家”了,懂點門道,下次跟人聊AI也能硬氣地說:“生成文本?小意思,我連Transformer怎么跑都知道!”當然,這只是AI世界的入門課,想真正在這個領域站穩腳跟,還有更多硬核知識等著你去啃。怎么樣,敢不敢給LLM丟個復雜問題,測試一下你剛學的“理論”?

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

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

相關文章

STL之序列式容器(Vector/Deque/List)

序列式容器 序列式容器包括:靜態數組 array 、動態數組 vector 、雙端隊列 deque 、單鏈表 forward_ list 、雙鏈表 list 。這五個容器中,我們需要講解三個 vector 、 deque 、 list 的使 用,包括:初始化、遍歷、尾部插入與刪除、…

swift菜鳥教程6-10(運算符,條件,循環,字符串,字符)

一個樸實無華的目錄 今日學習內容:1.Swift 運算符算術運算符比較運算符邏輯運算符位運算符賦值運算區間運算符其他運算符 2.Swift 條件語句3.Swift 循環4.Swift 字符串字符串屬性 isEmpty字符串常量let 變量var字符串中插入值字符串連接字符串長度 String.count使用…

泛微ECOLOGY9 記 數據展現集成 自定義開窗測試中對SQL 的IN語法轉換存在BUG

背景 搭建流程時,需將明細表1中的合同字段 供明細表2中的合同開窗查詢使用。 最終實現如下圖: 選擇 發票號時,自動帶出明細表1中的采購合同號清單,然后在明細表2中開窗采購合同號時,只跳出明細表1中有的采購合同號&am…

(自用)藍橋杯準備(需要寫的基礎)

要寫的文件 led_app lcd_app key_app adc_app usart_app scheduler LHF_SYS一、外設引腳配置 1. 按鍵引腳 按鍵引腳配置如下: B1:PB0B2:PB1B3:PB2B4:PA0 2. LCD引腳 LCD引腳配置如下: GPIO_Pin_9 /* …

PM2 完全指南:Node.js 應用后臺啟動、關閉與重啟詳解

文章目錄 **PM2 完全指南:Node.js 應用后臺啟動、關閉與重啟詳解****1. 什么是 PM2?****2. 安裝 PM2****全局安裝****驗證安裝** **3. 使用 PM2 啟動 Node.js 應用****基本啟動****指定應用名稱****集群模式(多進程負載均衡)****監…

Linux環境變量詳解

引言 在Linux系統中,環境變量是一種非常重要的概念,它影響著系統的運行方式和應用程序的行為。無論你是Linux新手還是經驗豐富的管理員,深入理解環境變量都能幫助你更高效地使用和管理Linux系統。本文將從基礎概念到高級應用,全面…

408 計算機網絡 知識點記憶(8)

前言 本文基于王道考研課程與湖科大計算機網絡課程教學內容,系統梳理核心知識記憶點和框架,既為個人復習沉淀思考,亦希望能與同行者互助共進。(PS:后續將持續迭代優化細節) 往期內容 408 計算機網絡 知識…

@linux系統SSL證書轉換(Openssl轉換PFX)

在Linux中,你可以使用OpenSSL工具將PFX/P12格式的證書轉換為單獨的CRT(證書)、KEY(私鑰)文件以及提取證書鏈 1. 提取私鑰文件(.key) openssl pkcs12 -in your_certificate.pfx -nocerts -out private.key -nodes系統會…

DAOS系統架構-組件

如上圖所示,一個完整的DAOS系統是由管理節點組件、客戶端節點組件、服務端節點組件以及網絡通信組件四個部分組成。管理節點組件通過管理網絡通道(藍色)對DAOS服務管理和監控。客戶端節點組件通過數據網絡通道(紅色)與…

制作一款打飛機游戲教程2:背景滾動

滾動原型開發 接下來,我們開始聚焦滾動原型的開發。我們需要確定游戲關卡的長度以及背景滾動的速度。 地圖與精靈空間限制 在開發過程中,我們遇到了地圖與精靈空間限制的問題。PICO 8的地圖編輯器下半部分與精靈表共享空間,這意味著我們只…

計算機組成原理——CPU與存儲器連接例題

計算機組成原理——CPU與存儲器連接例題 設CPU共有16根地址線和8根數據線,并用(MREQ) ?作為訪存控制信號(低電平有效),(WR) ?作為讀/寫命令信號(高電平讀,低電平寫)。現有下列存儲芯片&#…

GNSS靜態數據處理

1 安裝數據處理軟件:儀器之星(InStar )和 Trimble Business Center 做完控制點靜態后,我們需要下載GNSS數據,對靜態數據進行處理。在處理之前需要將相關軟件在自己電腦上安裝好: 儀器之星(InS…

Process Explorer 性能調優實戰:精準定位資源泄漏與高負載進程

一、下載與安裝 ?下載地址? Process Explorer安裝包下載:https://pan.quark.cn/s/950c36ba5364下載后解壓壓縮包,運行 procexp.exe(32 位系統)或 procexp64.exe(64 位系統)?。 ?界面概覽? 主界面以樹…

SVMSPro分布式綜合安防管理平臺-->以S3存儲革新,開啟智能安防新紀元

SVMSPro分布式綜合安防管理平臺–>以S3存儲革新,開啟智能安防新紀元 在數字化轉型浪潮下,企業安防管理正面臨海量數據存儲、跨區域協同以及數據安全的嚴峻挑戰。如何實現高效、彈性、低成本的存儲擴容?如何確保關鍵錄像數據萬無一失&…

Python 裝飾器(Decorator)

文章目錄 代碼解析1. 裝飾器定義 timer(func)2. 應用裝飾器 timer **執行流程****關鍵點****實際應用場景****改進版本(帶 functools.wraps)** 這是一個 Python 裝飾器(Decorator) 的示例,用于測量函數的執行時間。下…

git commit時自動生成Change-ID

創建全局鉤子目錄: 創建一個全局的Git hooks目錄: mkdir -p ~/.githooks 下載并設置commit-msg鉤子腳本: 下載Gerrit的commit-msg鉤子腳本,并放置在全局鉤子目錄中(如下載不了,可從本頁面附件中下載,“…

最新Ktransformers v0.24(Docker)并發部署DeepSeek-V3-0324模型

一、介紹 KTransformers v0.2.4 發布說明 我們非常高興地宣布,期待已久的 KTransformers v0.2.4 現已正式發布!在這個版本中,我們對整 體架構進行了重大重構,更新了超過 1 萬行代碼,為社區帶來了備受期待的多并發支…

飛牛私有云5大硬核功能實測!

📸 1. 智能相冊:AI搜圖原圖自由 - 自動備份:手機照片/視頻實時同步,支持RAW格式、實況照片無損備份,釋放128G手機秒變256G。 - AI黑科技: - 人臉識別:自動歸類人物相冊,輸入「媽媽…

webrtc pacer模塊(一) 平滑處理的實現

Pacer起到平滑碼率的作用,使發送到網絡上的碼率穩定。如下的這張創建Pacer的流程圖,其中PacerSender就是Pacer,其中PacerSender就是Pacer。這篇文章介紹它的核心子類PacingController及Periodic模式下平滑處理的基本流程。平滑處理流程中還有…

【android bluetooth 協議分析 01】【HCI 層介紹 1】【hci_packets.pdl 介紹】

在 AOSP 的藍牙協議棧 (Gabeldorsche) 中,hci_packets.pdl 是一個 協議描述語言文件,用于定義 HCI (Host Controller Interface) 層的數據包結構和通信協議。以下是詳細解析: 1. 文件作用 system/gd/hci/hci_packets.pdl 協議自動化生成&…