在 AI 开发(尤其是大模型、RAG 系统)中,向量(Vector)是绕不开的核心基础。很多开发者因担心数学门槛望而却步,但实际上,向量的本质是“特征的数字化描述”——AI 正是通过向量将文本、图片等复杂信息转化为可计算的数值,从而实现语义理解、相似检索等核心功能。
本文将完全避开晦涩的数学推导,用“生活化例子+代码实战”的方式,从基础概念、核心运算、相似度衡量到高维应用,全方位拆解向量在 AI 中的作用,补充实战场景、代码实现和工程化技巧,帮你真正理解“AI 如何通过向量思考”。
一、向量基础:AI 世界的“特征描述语言”
1. 什么是向量?—— 不止是“方向+大小”
在数学中,向量被定义为“既有大小又有方向的量”,但在 AI 领域,它的本质是事物特征的结构化数字表达:
- 标量(Scalar):只能描述“单一属性”(如“苹果甜度 5 分”“体重 60 公斤”);
- 向量(Vector):能同时描述“多个属性”(如苹果的“颜色、甜度、脆度”,文本的“主题、情感、关键词强度”)。
举个直观例子:
- 描述“一杯奶茶”,标量只能说“甜度 7 分”,而向量可以是
(0.8, 7, 3, 5),分别对应“奶盖厚度(0.8)、甜度(7)、温度(3)、价格(5)”四个维度; - 描述“一句话”,向量可以是
(0.92, 0.15, 0.03, 0.88),分别对应“科技主题(0.92)、积极情感(0.15)、正式语气(0.03)、长度归一化值(0.88)”。
2. 为什么需要高维向量?—— 精准捕捉复杂特征
现实世界的事物(如文本、图片)特征极其复杂,二维/三维向量远远不够:
- 描述一张图片,需要包含“颜色分布、边缘特征、物体轮廓、纹理细节”等数十甚至数百个特征;
- 描述一段文本,需要捕捉“关键词、语义倾向、语法结构、情感强度”等多个维度的信息。
高维向量(通常数百到数千维)的价值正在于此——每一个维度对应一个特征,维度越多,描述越精准。比如 OpenAI 的 text-embedding-3-small 模型输出 1536 维向量,意味着它用 1536 个特征维度来刻画一段文本的语义。
3. 向量在计算机中的表示:坐标即向量
在代码中,向量无需复杂的数学符号,直接用数组(列表)表示即可:
- 二维向量:
[3, 4](对应平面坐标 (3, 4)); - 三维向量:
[0.9, 5, 8](如苹果的“颜色、甜度、脆度”); - 高维向量:
[0.12, 0.88, 0.34, ..., 0.76](1536 维文本向量,省略中间维度)。
核心逻辑:计算机中所有向量默认是“位置向量”——起点固定在坐标原点 (0, 0),只需记录终点坐标,就能唯一确定向量。比如从点 A(1,2) 到点 B(4,6) 的向量,可通过“终点减起点”转化为标准向量 (3, 4)。
二、向量核心运算:AI 如何“推演语义”?
向量的加减、模长计算,是 AI 实现语义组合、特征筛选的基础——每一种运算都对应具体的业务逻辑,而非单纯的数学操作。
1. 向量加减:语义的“组合与抵消”
向量加减法遵循“对应维度相加/相减”规则(如 (x1,y1) ± (x2,y2) = (x1±x2, y1±y2)),在 AI 中,这对应“特征的叠加或去除”:
(1)加法:特征组合(概念融合)
- 例子:
“编程”向量 + “乐趣”向量 = “编程乐趣”向量; - 代码示例(Python):
# 简化的二维向量:[主题相关性,情感强度]
coding = [0.9, 0.3] # 编程:高主题相关性,中等情感
fun = [0.2, 0.8] # 乐趣:低主题相关性,高情感
coding_fun = [coding[i] + fun[i] for i in range(len(coding))]
print(coding_fun) # 输出:[1.1, 1.1] → 高主题相关性+高情感 → 对应“编程乐趣”
(2)减法:特征去除(剥离无关属性)
经典案例:“王子” - “男人” + “女人” = “公主”,背后是特征的精准剥离与叠加:
- 假设向量维度:
[性别(数值越大越女性化),地位(数值越大越尊贵)]; - 向量定义:
王子 = (1, 9)、男人 = (1, 1)、女人 = (9, 1); - 运算过程:
王子 - 男人 = (0, 8)→ 剥离“男性”特征,保留“尊贵”特征;+ 女人 = (9, 9)→ 叠加“女性”特征,最终得到“女性+尊贵”的“公主”向量。
(3)工程化应用
- 文本扩写:
“AI” + “开发” + “工具” = “AI 开发工具”向量,用于生成相关主题内容; - 情感调整:
“电影好看” - “积极情感” + “消极情感” = “电影难看”,实现文本情感反转。
2. 向量的模(长度):特征强度的“量化指标”
向量的模(Magnitude)是向量的“大小”,计算公式源于勾股定理(二维向量:√(x² + y²)),在 AI 中主要用于“特征强度衡量”和“归一化处理”。
(1)模的实际意义
- 文本向量的模:可理解为“文本与主题的关联强度”(模越大,主题越鲜明);
- 图片向量的模:可理解为“图片特征的丰富度”(模越大,细节越饱满)。
(2)核心应用:归一化(Normalization)
在很多场景中,我们只关心“特征方向”(如文本主题),不关心“特征强度”(如文本长度)。此时需要将向量归一化为“单位向量”(模=1),消除长度差异的影响:
- 公式:单位向量 = 原向量 / 原向量的模;
- 代码示例:
import math
def normalize_vector(vec):
"""向量归一化:将向量转为模为1的单位向量"""
vec模 = math.sqrt(sum([x**2 for x in vec]))
return [x / vec模 for x in vec]
# 测试:两个长度不同但方向相同的向量,归一化后完全一致
vec1 = [3, 4] # 模=5
vec2 = [6, 8] # 模=10
print(normalize_vector(vec1)) # 输出:[0.6, 0.8]
print(normalize_vector(vec2)) # 输出:[0.6, 0.8]
(3)工程化价值
- 语义检索:归一化后,文本长度不再影响相似度计算(如“我爱编程”和“我非常热爱编程技术”的向量方向一致,相似度高);
- 数据存储:归一化后的向量数值范围统一(-1~1),减少存储和计算开销。
三、相似度衡量:AI 如何“判断相似”?
在 RAG 检索、推荐系统、语义匹配等场景中,核心是“计算两个向量的相似度”——本质是判断两个事物的特征是否一致,常用方法有两种:余弦相似度和欧氏距离。
1. 余弦相似度:语义相似的“黄金标准”
余弦相似度通过计算两个向量的夹角余弦值,衡量“方向一致性”,取值范围为 [-1, 1]:
- 1:夹角 0°(方向完全相同,语义极度相似,如“猫”和“猫咪”);
- 0:夹角 90°(方向垂直,毫无关联,如“猫”和“电脑”);
- -1:夹角 180°(方向完全相反,语义对立,如“喜欢”和“讨厌”)。
(1)为什么 AI 偏爱余弦相似度?
它只关注“特征方向”,忽略“长度差异”——这恰好契合语义理解的需求:
- 例子:“我爱编程”(短文本)和“我从大学开始就热爱编程,至今已有 5 年经验”(长文本),虽然向量长度差异巨大,但主题方向一致,余弦相似度接近 1;
- 对比欧氏距离:会因文本长度导致距离过大,误判为“不相似”。
(2)代码实现(Python)
def cosine_similarity(vec1, vec2):
"""计算两个向量的余弦相似度"""
# 计算点乘:对应维度相乘再求和
dot_product = sum([v1 * v2 for v1, v2 in zip(vec1, vec2)])
# 计算两个向量的模
vec1模 = math.sqrt(sum([x**2 for x in vec1]))
vec2模 = math.sqrt(sum([x**2 for x in vec2]))
# 避免除以0
if vec1模 == 0 or vec2模 == 0:
return 0.0
return dot_product / (vec1模 * vec2模)
# 测试:语义相似的向量
vec_编程1 = [0.9, 0.8, 0.1] # 编程:高主题、高情感、低正式度
vec_编程2 = [0.85, 0.75, 0.08] # 热爱编程:高主题、高情感、低正式度
vec_美食 = [0.1, 0.2, 0.9] # 美食:低主题、低情感、高正式度
print(cosine_similarity(vec_编程1, vec_编程2)) # 输出:0.99 → 极度相似
print(cosine_similarity(vec_编程1, vec_美食)) # 输出:0.23 → 几乎无关
2. 欧氏距离:数值大小相关的“相似度”
欧氏距离是两个向量终点的“直线距离”,计算公式为 √[(x1-x2)² + (y1-y2)²],适用于“特征大小(量级)至关重要”的场景:
(1)适用场景
- 电商用户聚类:用户 A 购买 1 个苹果,用户 B 购买 2 个苹果,用户 C 购买 1000 个苹果(批发商);
- 相似度判断:A 和 B 的欧氏距离小(消费能力接近),归为普通消费者;C 与 A/B 距离大,归为商业客户。
(2)代码实现(Python)
def euclidean_distance(vec1, vec2):
"""计算两个向量的欧氏距离"""
return math.sqrt(sum([(v1 - v2)**2 for v1, v2 in zip(vec1, vec2)]))
# 测试:消费行为向量 [购买苹果数量, 消费金额]
user_A = [1, 10]
user_B = [2, 20]
user_C = [1000, 10000]
print(euclidean_distance(user_A, user_B)) # 输出:10.05 → 距离近
print(euclidean_distance(user_A, user_C)) # 输出:10000.01 → 距离远
3. 两种方法选型指南
| 场景类型 | 推荐方法 | 核心原因 |
|---|---|---|
| 语义检索、文本匹配 | 余弦相似度 | 关注主题方向,忽略文本长度差异 |
| 用户聚类、数值分析 | 欧氏距离 | 关注特征大小,量化实际差异 |
| RAG 知识库检索 | 余弦相似度 | 精准匹配语义,不受文档长度影响 |
| 商品推荐(基于购买量) | 欧氏距离 | 量化消费行为差异,区分普通用户与大客户 |
四、从二维到高维:AI 中的向量实战
AI 中真正使用的向量都是高维(数百到数千维),但数学规则与二维完全一致——加法、模长、相似度计算只需扩展到多维度即可。
1. 高维向量的“不可可视化”与“可计算性”
- 不可可视化:我们无法在脑海中想象 1536 维空间,但数学规则通用(如 1536 维向量的点乘 = 所有对应维度乘积之和);
- 可计算性:代码无需修改,只需传入高维数组即可,示例如下:
# 10 维向量相似度计算(模拟 OpenAI 嵌入向量)
vec_high1 = [0.12, 0.34, 0.56, 0.78, 0.90, 0.87, 0.65, 0.43, 0.21, 0.09]
vec_high2 = [0.11, 0.35, 0.57, 0.79, 0.89, 0.88, 0.64, 0.42, 0.20, 0.10]
print(cosine_similarity(vec_high1, vec_high2)) # 输出:0.998 → 极度相似
2. 实战场景:用向量实现简单 RAG 检索
RAG(检索增强生成)的核心是“根据用户查询向量,从知识库中找到最相似的文档向量”,完整流程如下:
# 1. 模拟知识库(文档 + 对应的向量)
knowledge_base = [
{"text": "Python 是一种解释型编程语言", "vec": [0.92, 0.15, 0.03, 0.88]},
{"text": "Java 是一种编译型编程语言", "vec": [0.89, 0.13, 0.05, 0.85]},
{"text": "猫是一种常见的宠物", "vec": [0.02, 0.87, 0.11, 0.05]}
]
# 2. 用户查询(模拟生成的向量)
user_query = "推荐一种解释型编程语言"
query_vec = [0.91, 0.14, 0.04, 0.87]
# 3. 检索最相似的文档
def rag_retrieval(query_vec, knowledge_base, top_k=1):
"""RAG 检索:找到知识库中最相似的文档"""
# 计算所有文档与查询的相似度
similarity_scores = [
(doc["text"], cosine_similarity(query_vec, doc["vec"]))
for doc in knowledge_base
]
# 按相似度降序排序
similarity_scores.sort(key=lambda x: x[1], reverse=True)
# 返回 top_k 结果
return similarity_scores[:top_k]
# 4. 执行检索
results = rag_retrieval(query_vec, knowledge_base)
print("检索结果:", results[0][0]) # 输出:Python 是一种解释型编程语言
print("相似度:", results[0][1]) # 输出:0.997
3. 工程化技巧:高维向量的存储与计算
- 存储:使用向量数据库(如 Chroma、Milvus),而非普通数据库(优化高维向量的检索速度);
- 计算优化:使用 NumPy 替代纯 Python 循环,提升高维向量计算效率:
import numpy as np
# NumPy 优化高维向量相似度计算
vec1_np = np.array([0.12, 0.34, ..., 0.09]) # 1536 维向量
vec2_np = np.array([0.11, 0.35, ..., 0.10])
similarity = np.dot(vec1_np, vec2_np) / (np.linalg.norm(vec1_np) * np.linalg.norm(vec2_np))
五、总结:向量是 AI 的“底层语言”
向量的核心价值,是为 AI 提供了“将复杂世界数字化”的方法——通过将文本、图片等事物的特征转化为数值数组,让计算机能够通过数学运算实现“理解语义、判断相似、组合概念”。
对于开发者而言,无需深究复杂的数学推导,只需记住三点核心:
- 向量 = 特征的数字化描述(每维对应一个特征);
- 向量运算 = 特征的组合与调整(加减=特征叠加/剥离,模=特征强度);
- 相似度 = 特征的匹配程度(余弦关注方向,欧氏关注大小)。
掌握这些,你就能理解大模型、RAG 系统的底层逻辑,甚至自己动手实现简单的语义检索、推荐系统。向量不是阻碍你进入 AI 领域的门槛,而是帮你打开大门的钥匙。
除非注明,否则均为李锋镝的博客原创文章,转载必须以链接形式标明本文链接
文章评论