一、从单词到向量:什么是 Embedding

在传统计算机眼中,文本只是一串没有意义的字符。为了让机器“理解”语言,我们需要一种数学化的方法来表示文本的语义。这正是 Embedding 向量 的核心目标:将离散的、高维的符号(如单词、句子、文档)映射到一个连续的、低维的向量空间中。

这个映射过程并非随机,而是通过机器学习模型从海量文本数据中学习得来。其精髓在于:语义相似的词汇或句子,在这个高维空间中的距离会非常近。例如,“国王”和“王后”的向量会比“国王”和“自行车”的向量更加接近。通过这种方式,我们把难以处理的语义问题,转化成了可以进行精确数学计算的向量距离问题。

提示:你可以把 Embedding 向量想象成一个物品的“多维特征坐标”。一个苹果可能由 [颜色=红,形状=圆,味道=甜...] 等多个维度定义,每个维度就是一个数值,这些数值组成的列表就是它的向量。

二、为什么需要 Embedding 向量:传统关键词匹配的局限

在没有 Embedding 的时代,搜索主要依赖关键词匹配。这种方式存在明显短板:

Embedding 向量通过将整个查询和文档编码成向量,从根本上解决了这些问题。它比较的是“意思”而非“字面”。因此,搜索“如何学习编程”时,它能关联到标题为“编程入门指南”的文章,即使二者没有共同的关键词。这就是语义检索,它让搜索变得更加智能和人性化。

三、如何生成 Embedding 向量:从模型到服务

生成高质量的 Embedding 向量依赖于预训练语言模型。常见的模型和方法有:

在实际应用中,我们通常不会从头训练这些模型。而是利用各大厂商(如 OpenAI, Cohere)或开源社区提供的预训练模型 API,或者自己微调(Fine-tune)模型。调用 API 获取一个句子的 Embedding 向量通常很简单。

# 示例:使用一个假设的 Embedding API 获取句子向量
import requests

def get_embedding(text):
    api_url = "https://api.example.com/embeddings"
    headers = {"Authorization": "Bearer YOUR_API_KEY"}
    payload = {"input": text, "model": "text-embedding-ada-002"}
    response = requests.post(api_url, json=payload, headers=headers)
    return response.json()["data"][0]["embedding"]

# 获取句子“今天天气真好”的向量
vector = get_embedding("今天天气真好")
print(f"向量维度:{len(vector)}") # 例如输出:向量维度:1536
print(f"前5个元素:{vector[:5]}") # 例如输出:[0.0023, -0.0091, ...]
提示:选择 Embedding 模型时需权衡质量、速度、成本和维度。高维向量(如 1536 维)通常表达更精准,但存储和计算成本也更高。

四、向量空间与语义相似度计算

生成向量后,我们如何衡量两个句子是否“相似”呢?这依赖于向量空间中的距离度量。最常用的是余弦相似度。

余弦相似度计算两个向量夹角的余弦值。值域为 [-1, 1],值越接近 1,说明两个向量方向越一致,即语义越相似。它关注的是方向(语义)而非大小,对长度不敏感,非常适合文本比较。

import numpy as np

def cosine_similarity(vec_a, vec_b):
    """计算两个向量的余弦相似度"""
    dot_product = np.dot(vec_a, vec_b)
    norm_a = np.linalg.norm(vec_a)
    norm_b = np.linalg.norm(vec_b)
    similarity = dot_product / (norm_a * norm_b)
    return similarity

# 假设已有三个句子的向量
vec_sun = get_embedding("太阳")
vec_star = get_embedding("星星")
vec_car = get_embedding("汽车")

# 计算相似度
sim_sun_star = cosine_similarity(vec_sun, vec_star)
sim_sun_car = cosine_similarity(vec_sun, vec_car)

print(f"“太阳”与“星星”的相似度: {sim_sun_star:.4f}") # 较高,如 0.8756
print(f"“太阳”与“汽车”的相似度: {sim_sun_car:.4f}") # 较低,如 0.1234

五、语义检索:如何用向量做搜索

理解了向量生成和相似度计算,语义检索的流程就清晰了,它主要分为两个阶段:

1. 离线索引阶段(Indexing)

2. 在线查询阶段(Retrieval)

这个过程的魔力在于,它直接计算了“查询意图”与“文档含义”之间的距离,实现了真正的语义匹配。

六、实践中的注意事项与扩展

在实际工程应用 Embedding 和语义检索时,有几个关键点需要注意:

提示:Embedding 的质量是整个系统的基石。投入资源清洗训练数据、选择合适的模型并进行领域微调,其回报远高于后期复杂的检索策略调整。

七、应用场景与总结

Embedding 向量与语义检索的应用远不止于“搜索”,它正在成为许多 AI 应用的基础设施:

总结来说,Embedding 向量是机器理解语义的“数学语言”,而语义检索是基于这种语言实现智能匹配的关键技术。它们共同将非结构化的文本信息转化为了可计算、可检索、可推理的结构化数据,为构建更智能的应用打开了大门。掌握其原理,是理解现代 AI 应用不可或缺的一步。