检索的方式有那些
关键字搜索:通过用户输入的关键字来查找文本数据。
语义搜索:它的目标是理解用户查询的真实意图,不仅考虑关键词的匹配,还考虑词汇之间的语义
(文字,语音,语调...)关系,以提供更准确的搜索结果。
向量与Embeddings的定义
在数学中,向量(也称为欧几里得向量、几何向量),指具有大小和方向的量。
它可以形象化地表示为带箭头的线段。
如下图所示
把文本转换成数组的过程叫做向量化。
向量之间的距离对应向量的语义相似度。
箭头所指:代表向量的方向;线段长度:代表向量的大小。
Embedding模型的核心理论
1. 基本思想:从符号到向量
符号表示的问题:传统方法(如One-Hot编码)将文本表示为离散的符号,导致高维稀疏(维度=词汇表大小)、缺乏语义信息(“猫”和“狗”的向量正交,无相似性)。
向量表示的优势:将文本映射到低维连续向量空间,通过稠密向量捕捉潜在语义,使语义相似的文本在空间中距离更近。
2. 理论基础
分布假设(Distributional Hypothesis)
“一个词的语义由它的上下文决定。”(Harris, 1954)
例如,“猫”和“狗”常出现在类似上下文(“宠物”“喂食”),因此它们的向量应接近。
向量空间模型(Vector Space Model)
将文本视为高维空间中的点,语义关系通过向量方向与距离量化。例如:
余弦相似度:方向越接近,语义越相似。欧氏距离:点之间越近,语义越接近。
降维与稠密表示
通过神经网络或矩阵分解,将高维稀疏输入(如One-Hot词向量)压缩为低维稠密向量(如100~1000维),同时保留关键信息。
文本如何转化为浮点数向量(Embeddings)
1. 词级别嵌入(Word Embedding)
输入:一个单词(如“apple”)。
输出:一个固定长度的浮点数数组(如[0.25, -0.1, 0.7, ..., 0.3]
),每个维度对应潜在语义特征。
实现方法示例:Word2Vec
Skip-Gram模型:通过中心词预测上下文词,学习词向量。
数学目标:最大化概率
结果:每个词对应一个向量,向量维度由模型预设(如300维),每个下标i
的值表示该词在某个潜在语义维度上的强度。
2. 句子/文档级别嵌入(Sentence Embedding)
输入:一段文本(如“I love machine learning”)。
输出:一个浮点数数组,表示整个文本的语义。
实现方法示例:BERT
-
分词与输入编码:
将句子分割为子词(如["I", "love", "machine", "learning"]
),并添加特殊标记[CLS]
和[SEP]
。 -
Transformer编码:
通过多层自注意力机制,生成每个词的上下文相关向量。 -
池化(Pooling):
取[CLS]
标记的向量(或对所有词向量取平均)作为句子向量。
3. 关键特性
每个下标i
对应一个潜在语义维度:
例如,第5维可能隐含“情感极性”,第10维可能对应“动作性”,但这些维度不可直接解释,而是通过模型自动学习。
整体向量表示语义:
所有维度的组合共同编码了文本的全局语义信息
向量距离与语义相似度的关系
1. 向量距离的计算方法
2. 语义相似度的数学体现
示例:
句子A:“猫是一种宠物” → 向量[0.2, 0.8, -0.1]
句子B:“狗喜欢啃骨头” → 向量[0.3, 0.7, 0.0]
句子C:“汽车需要加油” → 向量[-0.5, 0.1, 0.9]
计算余弦相似度:
sim(A, B) ≈ 0.95
(方向接近,语义相似)
sim(A, C) ≈ -0.2
(方向相反,语义无关)
3. 为什么距离能反映语义
训练目标驱动:Embedding模型在训练时强制语义相近的文本在向量空间中靠近。
例如:
Word2Vec让共现词的向量接近。
BERT让相同上下文中的词向量相似。
对比学习(如SimCSE)直接优化相似样本的距离。
完整流程示例:从文本到向量
步骤1:文本预处理
分词:将句子分割为词/子词(如使用BERT的WordPiece)。
规范化:转为小写、去除停用词、词干提取(可选)。
步骤2:向量化
选择模型:例如使用预训练的BERT模型。
输入编码:
# 使用Hugging Face Transformers库
from transformers import BertTokenizer, BertModel
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertModel.from_pretrained('bert-base-uncased')
text = "Embeddings represent text as vectors."
inputs = tokenizer(text, return_tensors='pt')
outputs = model(**inputs)
# 取[CLS]标记的向量作为句子嵌入
sentence_embedding = outputs.last_hidden_state[:, 0, :].detach().numpy()
输出:得到一个768维的浮点数数组(如[0.1, -0.3, 0.8, ..., 0.2]
)。
步骤3:计算相似度
对比两个句子的向量:
from sklearn.metrics.pairwise import cosine_similarity
# 假设emb1和emb2是两个768维向量
similarity = cosine_similarity(emb1.reshape(1, -1), emb2.reshape(1, -1))
print(similarity) # 输出范围[-1, 1],越接近1越相似
数学本质总结
文本向量化:函数 f:Text→Rnf:Text→Rn,将文本映射为n维空间中的点。
语义相似度:通过向量空间中的几何关系(方向或距离)量化语义相关性。
模型学习:通过优化目标(如语言模型、对比损失)调整向量位置,使语义相似文本在空间中聚集
关键问题解答
-
为什么每个维度没有明确含义?
模型自动学习潜在特征,这些特征是统计学规律的抽象,而非人工定义(类似神经网络的隐藏层)。 -
维度数(n)如何选择?
经验值:词嵌入常用50~300维,句嵌入常用384~1024维。维度越高,表达能力越强,但可能过拟合。 -
如何保证不同文本的向量可比?
所有向量必须由同一模型生成,且经过相同的归一化处理(如L2归一化)。
向量(嵌入)模型
text-embedding-3-large 是一种文本嵌入模型,它属于深度学习模型的一种,专门用于将文本转
换为高维向量(也称为嵌入)
向量之间能够捕捉文本的语义信息,使得相似的文本在向量空间中彼此接近。
text-embedding-3-large 的维度为 3072。
文本向量化
from openai import OpenAI#从 openai 库中导入 OpenAI 类。
client = OpenAI()#client 变量是 OpenAI 的一个实例对象,代表与 OpenAI 服务器的连接。
# 嵌入模型
res = client.embeddings.create(
input="你好啊,我好,他好",
model="text-embedding-3-large"
)
# 向量数据
print(res.data)
print("--------------------")
# 获取文本向量 => 列表推导式
print([x.embedding for x in res.data])
print("--------------------")
# 获取向量的维度,就是向量的长度
print(len([x.embedding for x in res.data][0]))
client.embeddings.create(...)
embeddings
:访问 OpenAI 客户端的 embeddings
API。
create(...)
:调用创建嵌入向量的 API 方法。
print([x.embedding for x in res.data])
print("--------------------")
res.data
:存储 API 返回的嵌入向量结果,通常是一个列表,包含多个嵌入向量对象。
for x in res.data
:遍历 res.data
中的每个元素(x
)。
x.embedding
:提取每个 x
对象中的 embedding
(嵌入向量)。
结果是一个嵌套列表,每个嵌入向量都是一个数值列表(浮点数)。
示例输出:
[[0.123, -0.456, 0.789, ...]]
外部 []
:表示一个 Python 列表。
内部 []
:嵌入向量,是高维度数值数组,通常用于机器学习任务。
print(len([x.embedding for x in res.data][0]))
[x.embedding for x in res.data]:
生成一个包含所有嵌入向量的列表,假设只有一个文本,则 res.data
只有一个元素,所以 res.data[0]
是一个对象,res.data[0].embedding
是一个向量(列表)。
[x.embedding for x in res.data][0]:
取出第一个向量。
len(...):
len()
计算该向量的长度,即其维度数。