自回归生成原理剖析:从零实现一个'逐字生成'的 AI 写作模型
语言模型基础与生成范式对比
在自然语言处理 (NLP) 领域,语言模型 (Language Model) 的核心任务是建模词序列的概率分布。给定前文上下文,预测下一个词的条件概率可表示为:
$$ P(w_t | w_{1:t-1}) $$
根据生成方式差异,主要分为两类方法:
- 自回归生成 (Autoregressive Generation)
- 顺序生成:从左到右逐个预测 token,每次将预测结果反馈给模型作为新输入
- 代表模型:GPT 系列、LSTM 语言模型
- 数学表达:$P(x) = \prod_{t=1}^T P(x_t | x_{1:t-1})$
- 非自回归生成 (Non-autoregressive Generation)
- 并行生成:一次性预测所有 token 位置
- 代表模型:BERT 的 MLM 任务、GLAT
- 优势:推理速度更快,但生成质量通常较低
PyTorch 实现核心生成逻辑
1. 文本预处理与 Tokenization
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("gpt2")
text = "人工智能是"
input_ids = tokenizer.encode(text, return_tensors="pt")
# 输出形状:[1, seq_len]
2. 自回归生成循环
import torch
import torch.nn.functional as F
def generate_text(model, input_ids, max_length=50, temperature=1.0, top_k=50):
with torch.no_grad():
for _ in range(max_length):
# 获取模型预测
outputs = model(input_ids)
logits = outputs.logits[:, -1, :] # 取最后一个 token 的 logits
# 应用温度调节
logits = logits / temperature
probs = F.softmax(logits, dim=-1)
# Top-k 过滤
top_k > :
indices_to_remove = logits < torch.topk(logits, top_k)[][..., -, ]
logits[indices_to_remove] = -()
next_token = torch.multinomial(probs, num_samples=)
input_ids = torch.cat([input_ids, next_token], dim=-)
next_token == tokenizer.eos_token_id:
tokenizer.decode(input_ids[], skip_special_tokens=)

