《Born》第18章:文本生成——Tokenizer、采样策略与流式输出
从 logits 到文字,这是一条完整的生成管线。这一章拆解 Born 的文本生成系统。
从 logits 到文字,这是一条完整的生成管线。这一章拆解 Born 的文本生成系统。
生成管线全景
Prompt → Tokenizer.Encode → tokens
→ for i in range(maxTokens):
logits = model.Forward(tokens, kvCache)
nextToken = Sampler.Sample(logits[-1])
tokens = append(tokens, nextToken)
if stopConditionMet: break
→ Tokenizer.Decode(tokens) → 生成的文本
Tokenizer
// TikToken(GPT 系列)
tokenizer := tiktoken.New("cl100k_base")
tokens := tokenizer.Encode("Hello, world!")
// [15496, 11, 995, 0]
text := tokenizer.Decode(tokens)
// "Hello, world!"
Born 支持两种 tokenizer:TikToken(GPT/Claude 系列)和 BPE(BERT 系列)。
采样策略
sampler := nn.NewSampler(nn.SamplerConfig{
Temperature: 0.8, // 降低随机性
TopK: 40, // 只保留概率最高的 40 个 token
TopP: 0.95, // 累积概率达到 95% 时截断
MinP: 0.05, // 最低相对概率阈值
})
nextToken := sampler.Sample(logits)
| 参数 | 作用 | 典型值 |
|---|---|---|
| Temperature | 控制随机性 | 0.7-1.0 |
| TopK | 限制候选集大小 | 20-50 |
| TopP | 动态截断 | 0.9-0.95 |
| MinP | 过滤低概率噪声 | 0.01-0.05 |
流式输出
// 逐 token 输出,不等待整段生成完毕
for token := range generator.Generate(prompt) {
text := tokenizer.Decode([]int{token})
fmt.Print(text) // 实时输出
os.Stdout.Sync()
}
📘 《Born》连载技术书,第 18/22 章。