【Agent从入门到实践】24 向量数据库的通俗理解:什么是向量,什么是相似度检索
各位小伙伴,上一节咱们知道了:Agent要想“懂语义、找相似、查得快”,必须靠向量数据库。但很多人一听“向量”“嵌入”“余弦相似度”,头就大了——这不是数学吗?我一个程序员,搞懂这些有啥用?其实完全不用怕!今天咱们就用大白话+生活类比,把“向量”“向量嵌入”“相似度检索”讲得明明白白,不用复杂公式,不用高等数学,看完你就能懂:向量数据库到底在干嘛,为什么它能解决传统数据库搞不定的事。咱们先抛开数学
文章目录
目前国内还是很缺AI人才的,希望更多人能真正加入到AI行业,共同促进行业进步。想要系统学习AI知识的朋友可以看看我的教程http://blog.csdn.net/jiangjunshow,教程通俗易懂,风趣幽默,从深度学习基础原理到各领域实战应用都有讲解。
前言
各位小伙伴,上一节咱们知道了:Agent要想“懂语义、找相似、查得快”,必须靠向量数据库。但很多人一听“向量”“嵌入”“余弦相似度”,头就大了——这不是数学吗?我一个程序员,搞懂这些有啥用?
其实完全不用怕!今天咱们就用大白话+生活类比,把“向量”“向量嵌入”“相似度检索”讲得明明白白,不用复杂公式,不用高等数学,看完你就能懂:向量数据库到底在干嘛,为什么它能解决传统数据库搞不定的事。
一、先搞懂:什么是“向量”?—— 用“标签打分”来理解
1. 生活中的“向量”:给事物打“特征分”
咱们先抛开数学定义,用奶茶来举例子:
假设我们要描述一杯奶茶,只用3个维度:
- 甜度:0(无糖)~ 10(全糖)
- 清爽度:0(浓郁)~ 10(清爽)
- 奶味:0(无奶)~ 10(重奶)
给3杯奶茶打分:
- 青提茉莉:甜度3,清爽度9,奶味1 → 写成一串数字:
[3, 9, 1] - 芋泥鲜奶:甜度5,清爽度2,奶味9 →
[5, 2, 9] - 西瓜啵啵:甜度4,清爽度8,奶味0 →
[4, 8, 0]
这串数字,就是“向量”!
- 向量 = 用一组数字,描述一个事物的所有关键特征;
- 每个数字,代表一个“特征维度”的得分;
- 维度越多,描述越精准(比如再加“冰量”“配料数”“价格”等维度)。
2. 数学上的向量:就是“有方向有长度的箭头”
从数学角度,向量可以理解成空间里的一个箭头:
- 3维向量 → 3维空间里的一个点(x,y,z);
- 1536维向量(LLM常用)→ 1536维空间里的一个点(虽然我们想象不出来,但数学上成立);
- 向量的长度:代表事物的“特征强度”;
- 向量的方向:代表事物的“特征组合”(比如“清爽+低甜+少奶”就是一个方向)。
核心结论:
不管是3维还是1536维,向量的本质,就是“用数字给事物打特征标签”——把模糊的“清爽”“浓郁”“好喝”,变成计算机能看懂的数字。
二、什么是“向量嵌入”?—— 把“文字/图片”变成“向量”
1. 为什么要“嵌入”?
计算机看不懂文字、图片、语音,只能看懂数字。
- 文字“夏天喝什么奶茶清爽不腻” → 计算机看不懂;
- 把它变成向量
[0.12, 0.34, ..., 0.98]→ 计算机就能处理了。
这个**“把非结构化数据(文字、图片、语音)转换成向量”的过程,就叫向量嵌入(Embedding)**。
2. 谁来做“嵌入”?—— 嵌入模型
我们不用自己写代码算向量,有专门的嵌入模型帮我们做:
- 文本嵌入模型:sentence-transformers(开源免费)、OpenAI Embeddings(API)、通义千问Embeddings;
- 图片嵌入模型:CLIP、ResNet;
- 语音嵌入模型:Wav2Vec。
这些模型的作用,就是翻译官:
- 输入:文字/图片/语音;
- 输出:一串固定长度的向量(比如384维、768维、1536维)。
3. 嵌入的核心魔法:语义相近 → 向量相近
嵌入模型最牛的地方,是语义相似的东西,向量靠得近;语义不同的东西,向量离得远。
比如:
- 文字1:“夏天喝什么奶茶清爽不腻”
- 文字2:“低糖分水果味奶茶,无奶盖,清爽解腻”
- 文字3:“夏天限定款奶茶,包装清爽”
嵌入后:
- 文字1和文字2的向量,距离很近(语义相似);
- 文字1和文字3的向量,距离很远(语义不同)。
这就是向量数据库能“懂语义”的核心原理!
三、什么是“相似度检索”?—— 找“最像”的东西
1. 生活中的“相似度”:看“特征重合度”
还是用奶茶的例子,3杯奶茶的向量:
- 青提茉莉:
[3, 9, 1] - 西瓜啵啵:
[4, 8, 0] - 芋泥鲜奶:
[5, 2, 9]
用户问:“推荐和青提茉莉差不多的奶茶”
- 看特征:青提茉莉是“低甜+高清爽+低奶”;
- 西瓜啵啵:“低甜+高清爽+无奶” → 特征几乎一样,最相似;
- 芋泥鲜奶:“中甜+低清爽+高奶” → 特征完全相反,最不相似。
所以,相似度检索的结果:西瓜啵啵 > 芋泥鲜奶。
2. 计算机中的“相似度”:算“向量距离”
计算机不会“看特征”,它会算向量之间的距离——距离越近,相似度越高;距离越远,相似度越低。
常用的3种距离计算方法(不用记公式,懂意思就行):
-
余弦相似度(Cosine Similarity):
- 看向量的方向是否一致(不管长度);
- 适合文本语义匹配(比如“清爽不腻”和“低甜清爽”方向一致);
- 取值范围:-1 ~ 1,越接近1,越相似。
-
欧氏距离(Euclidean Distance):
- 看向量在空间中的直线距离;
- 适合数值特征匹配(比如奶茶的甜度、清爽度、奶味);
- 取值范围:0 ~ ∞,越小,越相似。
-
点积(Dot Product):
- 结合方向和长度;
- 适合推荐系统(比如用户偏好向量和商品向量的点积)。
3. 相似度检索的流程:3步走
不管用哪种距离,相似度检索的流程都一样:
- 建库:把所有数据(文字/图片/语音)用嵌入模型转成向量,存入向量数据库;
- 查询:把用户的问题(比如“夏天喝什么奶茶清爽不腻”)转成查询向量;
- 检索:向量数据库计算查询向量和所有库向量的距离,返回距离最近的Top-K个结果(最相似的)。
四、通俗对比:传统检索 vs 相似度检索
| 维度 | 传统检索(关键词匹配) | 相似度检索(向量匹配) |
|---|---|---|
| 核心逻辑 | 找“字一样”的 | 找“意思一样”的 |
| 匹配方式 | 字面匹配 | 语义匹配 |
| 数据类型 | 结构化数据(表格、数字) | 非结构化数据(文字、图片、语音) |
| 检索效果 | 精准但死板(漏相似、含无关) | 智能且灵活(找相似、滤无关) |
| 适用场景 | 查订单号、手机号、商品ID | 问答、推荐、相似内容查找 |
| 例子 | 搜“夏天”→ 出“夏天限定”“夏天包装” | 搜“夏天清爽奶茶”→ 出“青提茉莉”“西瓜啵啵” |
一句话总结:
传统检索是找双胞胎(必须一模一样);
相似度检索是找亲戚(只要特征相似就行)。
五、实战:用Python玩“向量相似度”(不用向量数据库)
咱们不用复杂的向量数据库,只用Python和开源嵌入模型,亲手体验“向量嵌入+相似度计算”,一看就懂!
1. 安装依赖
pip install sentence-transformers numpy scikit-learn
2. 代码:嵌入+相似度计算
from sentence_transformers import SentenceTransformer
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
# 1. 加载开源嵌入模型(轻量级,本地运行)
model = SentenceTransformer('all-MiniLM-L6-v2')
print("✅ 嵌入模型加载完成!")
# 2. 定义文本(用户问题+候选答案)
texts = [
"用户问题:夏天喝什么奶茶清爽不腻", # 查询文本
"候选1:低糖分水果味奶茶,无奶盖,清爽解腻",
"候选2:夏天限定款奶茶,包装清爽,多种口味",
"候选3:芋泥鲜奶,绵密口感,适合秋冬",
"候选4:西瓜啵啵,少糖冰爽,夏天爆款"
]
# 3. 文本 → 向量(嵌入过程)
print("\n🔄 正在生成向量...")
embeddings = model.encode(texts) # 输出:(5, 384) 5个文本,每个384维向量
print(f"✅ 向量生成完成!形状:{embeddings.shape}")
# 4. 计算相似度(查询文本 vs 所有候选文本)
query_embedding = embeddings[0].reshape(1, -1) # 查询向量( reshape 适配 sklearn 接口)
candidate_embeddings = embeddings[1:] # 候选向量
# 计算余弦相似度
similarities = cosine_similarity(query_embedding, candidate_embeddings)[0]
# 5. 输出结果(按相似度排序)
print("\n📊 相似度检索结果(从高到低):")
results = list(zip(texts[1:], similarities))
results.sort(key=lambda x: x[1], reverse=True) # 按相似度降序
for i, (text, sim) in enumerate(results, 1):
print(f"{i}. 相似度:{sim:.4f} | {text}")
3. 运行结果(你会看到神奇的效果!)
✅ 嵌入模型加载完成!
🔄 正在生成向量...
✅ 向量生成完成!形状:(5, 384)
📊 相似度检索结果(从高到低):
1. 相似度:0.8123 | 候选1:低糖分水果味奶茶,无奶盖,清爽解腻
2. 相似度:0.7856 | 候选4:西瓜啵啵,少糖冰爽,夏天爆款
3. 相似度:0.6210 | 候选2:夏天限定款奶茶,包装清爽,多种口味
4. 相似度:0.2145 | 候选3:芋泥鲜奶,绵密口感,适合秋冬
4. 结果解读(完美符合预期!)
- 候选1:和用户问题语义最接近(清爽不腻、低糖分)→ 相似度最高(0.8123);
- 候选4:夏天、冰爽、少糖 → 语义相近 → 相似度次之(0.7856);
- 候选2:只提到“夏天”“清爽包装”,没提到“口味清爽不腻”→ 相似度中等(0.6210);
- 候选3:芋泥鲜奶是秋冬款,和“夏天清爽”完全相反 → 相似度极低(0.2145)。
这就是相似度检索的魔力:不用关键词匹配,直接“懂意思”,找到最相关的内容!
六、向量数据库的核心价值:把“相似度检索”规模化
上面的代码,我们只处理了5个文本,计算相似度很快。但如果是10万、100万、1亿条数据:
- 每次都遍历所有向量,计算距离 → 慢到无法忍受(秒级甚至分钟级);
- 向量存储、管理、更新 → 纯代码搞不定。
这就是向量数据库的价值:
- 高效存储:专门优化向量存储,支持海量向量(亿级);
- 快速检索:用ANN索引(近似最近邻算法,如HNSW、IVF),把检索时间从秒级→毫秒级;
- 功能丰富:支持增删改查、批量插入、过滤检索、多向量检索等;
- 易用性:提供Python/Java/Go SDK,像用MySQL一样简单。
向量数据库 = 向量存储 + ANN索引 + 相似度检索服务
七、总结:3句话搞懂向量和相似度检索
- 向量:用一组数字描述事物的特征,是计算机能看懂的“事物标签”;
- 向量嵌入:把文字/图片/语音转成向量的过程,让计算机“读懂”非结构化数据;
- 相似度检索:计算向量之间的距离,找到语义最相似的内容,解决传统检索“不懂语义、找不了相似”的痛点。
对Agent开发来说:
- 向量 = Agent的“特征语言”;
- 嵌入模型 = Agent的“翻译官”;
- 向量数据库 = Agent的“语义搜索引擎”。
有了这三样,Agent才能真正“懂你”,而不是只会“关键词匹配”的笨机器人!

更多推荐


所有评论(0)