【第四章:大模型(LLM)】05.LLM实战: 实现GPT2-(1)文本token到Embedding的代码实现

第四章:大模型(LLM)

第五部分:LLM实战: 实现GPT2

第一节:文本token到Embedding的代码实现

本节目标:
  • 理解 GPT-2 在接收输入时如何将自然语言文本转化为模型可处理的张量(Tensor)表示。

  • 熟悉 Tokenizer 与 Embedding Layer 的配合方式。

  • 编写简易的 GPT-2 风格文本输入处理代码。


1. 从自然语言到 Token

在 GPT-2 中,自然语言需要被分词器(Tokenizer)处理为离散 token id。

示例文本:
text = "Hello, how are you?"
使用 HuggingFace 的 GPT-2 Tokenizer:
from transformers import GPT2Tokenizer

tokenizer = GPT2Tokenizer.from_pretrained("gpt2")
token_ids = tokenizer.encode(text, return_tensors="pt")

print("Token IDs:", token_ids)
print("解码结果:", tokenizer.decode(token_ids[0]))
输出(示意):
Token IDs: tensor([[15496, 11, 703, 389, 345]])
解码结果: Hello, how are you?

GPT-2 使用的是 Byte Pair Encoding(BPE) 分词方式,将词语分成子词或字符级别的单位,更利于处理罕见词和拼写变体。


2. 将 Token IDs 转换为 Embedding

GPT-2 模型的输入是一个张量(tensor),需要用 embedding 层将 token ids 转换为连续向量。

GPT-2 的输入嵌入层包括两部分:

  • 词嵌入(token embedding)

  • 位置嵌入(position embedding)

用 PyTorch 自定义实现:
import torch
import torch.nn as nn

vocab_size = tokenizer.vocab_size        # 词表大小
embedding_dim = 768                      # GPT-2 small 模型的默认维度
max_position_embeddings = 1024           # 支持的最大序列长度

# 定义词嵌入和位置嵌入
token_embedding = nn.Embedding(vocab_size, embedding_dim)
position_embedding = nn.Embedding(max_position_embeddings, embedding_dim)

# 输入 token
input_ids = token_ids  # 形状: [batch_size, seq_len]
seq_len = input_ids.size(1)

# 生成位置索引
position_ids = torch.arange(seq_len, dtype=torch.long).unsqueeze(0)  # [1, seq_len]

# 获取嵌入向量
token_embeds = token_embedding(input_ids)
position_embeds = position_embedding(position_ids)

# 最终输入嵌入(两者相加)
input_embeddings = token_embeds + position_embeds

print("Input Embedding shape:", input_embeddings.shape)  # [1, seq_len, embedding_dim]

总结:本节核心要点

步骤说明作用
文本分词使用 GPT2Tokenizer 将文本编码为 token ids离散化
词嵌入将 token id 映射到 dense vector表示 token 含义
位置嵌入编码 token 在序列中的位置信息保留顺序信息
叠加嵌入token_embed + position_embed构成输入层向量

小贴士:

  • GPT-2 的 Tokenizer 是 无空白区分的,因此多个词可能被拆成子词。

  • 所有嵌入层参数是可训练的,会在训练过程中被更新。

  • 若手动构建模型,需确保 embedding 的 shape 与 Transformer 模块匹配。

<< 要实现本地大模型 + RAG(Retrieval-Augmented Generation),我们需要结合以下几个关键步骤: 1. **加载本地大型语言模型**:我们使用Hugging Face Transformers或其他库将预训练的大规模语言模型加载到本地环境。 2. **构建或集成检索模块 (R)**:该模块负责从外部数据库、文档集合中提取相关信息作为上下文提供给生成模型。 3. **增强生成过程 (G)**:将检索到的信息与用户输入一起送入LLM进行条件化文本生成。 以下是一个简单的Python示例代码框架,展示如何组合这些部分: ```python from transformers import AutoTokenizer, AutoModelForCausalLM import faiss # Fast similarity search library for dense vectors. from sentence_transformers import SentenceTransformer # Step 1: Load pre-trained large language model locally. model_name = "gpt2" # Replace with your local LLM path or HF hub name. tokenizer = AutoTokenizer.from_pretrained(model_name) llm_model = AutoModelForCausalLM.from_pretrained(model_name) # Step 2: Initialize the retrieval system using FAISS and SentenceTransformers. retriever_model = SentenceTransformer('all-MiniLM-L6-v2') # Embedding generator. def create_index(corpus): embeddings = retriever_model.encode(corpus) # Generate vector representations of texts. index = faiss.IndexFlatL2(embeddings.shape[1]) # Create a flat L2 distance-based index. index.add(embeddings) # Add all document embeddings into it. return index # Return configured FAISS Index object. corpus_texts = ["Example text from database.", "..."] # Your dataset goes here! faiss_index = create_index(corpus_texts) def retrieve_relevant_context(query, top_k=5): query_emb = retriever_model.encode([query]) # Encode user's question/phrase as embedding. _, indices = faiss_index.search(query_emb, top_k) # Query nearest neighbors in indexed DB. retrieved_docs = [corpus_texts[i] for i in indices[0]] # Fetch corresponding entries by their IDs. context_string = "\n".join(retrieved_docs) # Combine them into single multi-line string. return context_string # Step 3: Define function that combines both systems - Retrieval & Generative Model. def rag_llm_response(input_text, max_length=128): relevant_context = retrieve_relevant_context(input_text)# First fetch related info via Retriever step. full_input_to_generate = f"{relevant_context}\nUser:{input_text}"# Concatenate prompt plus contextual data found earlier above separator line. inputs = tokenizer(full_input_to_generate, return_tensors="pt") # Tokenize combined input sequence including history etc.. outputs = llm_model.generate(inputs.input_ids, attention_mask=inputs.attention_mask, pad_token_id=tokenizer.eos_token_id,max_new_tokens=max_length,) result = tokenizer.decode(outputs[0], skip_special_tokens=True).
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值