AIGC 大语言模型之词元和嵌入向量
前言
词元和嵌入向量是人工智能生成内容(AIGC)中使用 LLM 的两个核心概念。
一、LLM 的分词
1、分词器
是在模型处理文本之前,分词器会将文本分解成词或者子词。这个是根据特定的方法和训练过程进行的。
2、分词器如何分解文本
3、开源分词器
| 分词器/库 | 核心思想/算法 | 标志性特点 | 主要使用者 |
|---|---|---|---|
| OpenAI BPE(tiktoken) | Byte-level BPE | 直接在字节流上操作,高效压缩 | GPT-2,GPT-3,GPT-4 |
| SentencePiece | BPE, Unigram | 语言无关,无需预分词,空格视为 | LLaMA, T5,多语言模型 |
| WordPiece | Max-Likelihood | 需要预分词,词中片段用 ## 标记 | BERT 及其家族 |
| Hugging Face tokenizers | BPE, WordPiece,Unigram… | 集大成者,高性能 Rust 实现,完整流水线 | Hugging Face 生态所有模型 |
4、词级、子词级、字符级与字节级分词
二、词元嵌入向量
语言是词元的序列,如果在足够大的词元集上训练一个足够好的模型,它就会开始捕获训练数据集中出现的复杂模式:
- 如果训练数据包含有大量英语文本,通过这些模式,模型就能够表示和生成英语。
- 如果训练数据包含事实性信息(例如维基百科),模型就会具有生成一下事实性信息的能力
1、文本嵌入(用于句子和整篇文档)
虽然词元嵌入是 LLM 运作的关键,但许多 LLM 应用需要处理完整的句子,段落甚至文本文档,这催生了一些特殊的语言模型,他们能够生成文本嵌入-- 用单个向量来表示长度超过一个词元的文本片段。
我们可以这样理解文本嵌入模型:它接收一段文本,最终生成单个向量,这个向量以某种形式表示该文本并捕获其含义。生成文本嵌入有多种方法。常见的方法之一是对模型生成的所有词元嵌入的值取平均值,然而,高质量的文本嵌入模型往往是专门为文本嵌入任务训练的
三、自定义预训练分词器
- 通过网络爬虫抓取数据(红楼梦)
- 准备预训练数据集 (清洗、去重、tokenizer)
- Tokenizer 设置(词元、分词策略)
- 输出模型生成嵌入向量
1、通过网络爬虫抓取数据(红楼梦)
这边我们抓取红楼梦书作为数据集进行无监督学习
抓取完数据后放到 data 目录下 hongloumeng.txt 文件中
# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoup
# 红楼梦目录页地址
base_url = "https://hongloumeng.5000yan.com/"
# 数据保存路径
save_path = "./data/hongloumeng.txt"
():
headers = {
:
}
()
page_text = requests.get(url=url, headers=headers)
page_text.encoding = page_text.apparent_encoding
page_text = page_text.text
soup = BeautifulSoup(page_text, )
aTagList = soup.select()
titleList = [i.text i aTagList]
urlList = [i[] i aTagList]
(save_path, , encoding=) fp:
fp.write()
chp (titleList, urlList):
write_chapter(chp)
()
():
title, url = content_list
headers = {: }
page_text = requests.get(url=url, headers=headers, timeout=)
page_text.encoding = page_text.apparent_encoding
page_text = page_text.text
soup = BeautifulSoup(page_text, )
content = soup.select()
txt =
i content:
txt += i.text
(save_path, , encoding=) fp:
fp.write(.(title, txt))
()
__name__ == :
book_spider(base_url)


