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.mzph.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 协议自动化生成&…