想象每个词语都是银河系中的星球,向量坐标就是它们的星际坐标:
# 词语向量可视化示例
words = ["国王", "王后", "男人", "女人", "电脑"]
embeddings = model.encode(words)
# 三维投影
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
for i, word in enumerate(words):
x, y, z = embeddings[i][:3]
ax.scatter(x, y, z, marker='o')
ax.text(x, y, z, word)
vec(国王) − vec(男人) + vec(女人) ≈ vec(王后) \text{vec(国王)} - \text{vec(男人)} + \text{vec(女人)} \approx \text{vec(王后)} vec(国王)−vec(男人)+vec(女人)≈vec(王后)
这个著名公式揭示了向量空间的线性可加性特征
思考题:为什么"柏林-德国+法国≈巴黎"的向量运算能够成立?这种特性对知识推理有何启示?
相似度计算公式:
sim ( A , B ) = cos ( θ ) = A ⋅ B ∥ A ∥ ∥ B ∥ \text{sim}(A,B) = \cos(\theta) = \frac{A \cdot B}{\|A\| \|B\|} sim(A,B)=cos(θ)=∥A∥∥B∥A⋅B
import numpy as np
def cosine_similarity(a, b):
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
vec_cat = model.encode("猫") # [0.2, 0.8, -0.3,...]
vec_dog = model.encode("狗") # [0.3, 0.7, -0.2,...]
vec_computer = model.encode("电脑") # [-0.9, 0.1, 0.4,...]
print(cosine_similarity(vec_cat, vec_dog)) # 输出 0.92
print(cosine_similarity(vec_cat, vec_computer)) # 输出 0.15
from sklearn.manifold import TSNE
# 红楼梦人物关系降维
characters = ["贾宝玉", "林黛玉", "薛宝钗", "王熙凤", "贾政"]
embeddings = model.encode(characters)
# t-SNE降维
tsne = TSNE(n_components=2, perplexity=2)
reduced = tsne.fit_transform(embeddings)
# 可视化
plt.scatter(reduced[:,0], reduced[:,1])
for i, name in enumerate(characters):
plt.annotate(name, (reduced[i,0], reduced[i,1]))
模型类型 | 训练目标 | 典型代表 | 优点 | 缺点 |
---|---|---|---|---|
Bag-of-Words | 词频统计 | TF-IDF | 计算简单 | 忽略词序 |
Word2Vec | 上下文预测 | Google News | 轻量高效 | 多义词混淆 |
BERT | 双向上下文理解 | BAAI/bge | 语境感知 | 计算资源需求高 |
GPT | 自回归语言建模 | OpenAI text-embed | 生成能力强 | 单向上下文 |
模型 | 维度 | 检索精度 | 推理速度(句/秒) | 内存占用(GB) |
---|---|---|---|---|
BAAI/bge-large-zh | 1024 | 86.7 | 320 | 3.2 |
OpenAI text-embed-3 | 1536 | 84.3 | 210 | 4.8 |
Alibaba-Chat | 768 | 82.9 | 580 | 2.1 |
Tencent-Multilingual | 768 | 79.5 | 650 | 1.9 |
# 多模型统一接口
class EmbeddingBenchmark:
def __init__(self):
self.models = {
"bge": SentenceTransformer('BAAI/bge-large-zh'),
"openai": OpenAIEmbeddings(),
"alibaba": AlibabaEmbeddings()
}
def benchmark(self, text):
results = {}
for name, model in self.models.items():
start = time.time()
vec = model.encode(text)
latency = time.time() - start
results[name] = {"latency": latency, "dim": len(vec)}
return results
思考题:为什么OpenAI模型的维度高达1536,但精度反而低于BAAI模型?高维度一定代表更强能力吗?
# 量化压缩
original = model.encode(text) # float32 (1024,)
quantized = (original * 127).astype(np.int8) # int8 (1024,)
# 检索加速
index = faiss.IndexPQ(1024, 8, 8) # 8字节压缩
index.train(vectors)
监控指标 | 计算方式 | 报警阈值 |
---|---|---|
向量漂移 | 余弦相似度月变化率 > 5% | 0.85 |
维度塌缩 | 主成分方差 < 0.3 | 0.25 |
语义混淆 | 反义词相似度 > 0.4 | 0.3 |
检索衰减 | MRR@10周下降 > 10% | 0.15 |
class VectorMonitor:
def __init__(self):
self.reference = load_reference_vectors()
def check_drift(self, new_vecs):
avg_sim = np.mean([cosine_similarity(v, self.reference[i])
for i, v in enumerate(new_vecs)])
return avg_sim < 0.85
# CLIP跨模态检索
text_vec = clip.encode_text("一只橘猫在沙发上")
image_vec = clip.encode_image(Image.open("cat.jpg"))
sim = cosine_similarity(text_vec, image_vec) # 输出 0.91
量子比特表示法:
∣ ψ ⟩ = α ∣ 0 ⟩ + β ∣ 1 ⟩ |\psi\rangle = \alpha|0\rangle + \beta|1\rangle ∣ψ⟩=α∣0⟩+β∣1⟩
其中 α 2 + β 2 = 1 \alpha^2 + \beta^2 = 1 α2+β2=1,可用于表示归一化后的语义向量
sim ( A , B ) = ∣ ⟨ A ∣ B ⟩ ∣ 2 \text{sim}(A,B) = |\langle A | B \rangle|^2 sim(A,B)=∣⟨A∣B⟩∣2
思考题:量子计算中的叠加态特性,如何帮助处理自然语言中的歧义问题?
测试代码:
male_words = ["工程师", "医生", "程序员"]
female_words = ["护士", "教师", "秘书"]
def gender_bias_score(model):
male_vecs = model.encode(male_words)
female_vecs = model.encode(female_words)
return cosine_similarity(
np.mean(male_vecs, axis=0),
np.mean(female_vecs, axis=0)
)
通过向量反推原始文本:
argmax x P ( x ∣ v ) \text{argmax}_x P(x|v) argmaxxP(x∣v)
当前最佳模型可实现30%的文本复原率
# 差分隐私保护
noisy_vec = original_vec + np.random.laplace(0, 0.1, size=dim)
下篇预告:《AI的超级书柜 - 向量数据库深度剖析》将揭示:
延伸阅读: