embedding 向量大白话本质认知
1. 一句话给 embedding 向量下定义
embedding 向量 = 文本的「智能语义身份证」,也叫「语义数字指纹」。**
你可以把它理解成:
- 我们人能看懂中文、能理解一句话的意思,但计算机完全看不懂中文,它只认识数字
- embedding 向量,就是把一句中文文本,转换成一串有固定长度的数字,这串数字不是随便编的,它完全代表了这句话的「语义意思」
- 核心规律:语义越相似的两句话,它们对应的 embedding 向量(数字串)就越像;语义完全无关的两句话,向量就完全不一样
embedding 向量核心特性与 RAG 关联逻辑
1. embedding 向量的 3 个核心特性(零基础必须记住)
特性 1:固定长度,维度统一
- 同一个 embedding 模型,生成的所有向量,长度都是固定的,比如 384 维、768 维(就是一串有 384 个 / 768 个数字的列表)
- 比如你用bge-small-zh-v1.5模型,不管是 1 个字的文本,还是 500 字的长文本,生成的向量都是 384 个数字,长度完全统一
- 核心作用:只有长度统一的向量,计算机才能快速计算相似度,才能批量存到向量库里
特性 2:语义相似度 = 向量相似度
- 这是 embedding 向量最核心的特性,也是 RAG 系统能精准检索的底层逻辑
- 用大白话讲:两句话的意思越像,它们的向量距离就越近;意思越无关,距离就越远
- 举个例子:
文本 A:「Day89 的学习内容是 embedding 向量概念」
文本 B:「今天要学的是 embedding 向量的通俗理解」
文本 C:「RAG 系统的核心是文本分块和向量化」
文本 D:「我今天吃了苹果和香蕉」
相似度排序:A 和 B 最像(向量距离最近)> A 和 C 有一定相似度 > A 和 D 完全无关(向量距离最远)
特性 3:归一化后,相似度计算极快
- 所有的 embedding 向量,都会做「归一化」处理,把向量的长度统一为 1
- 归一化后的向量,计算相似度只需要用「余弦相似度」,计算机几毫秒就能完成,哪怕是从 100 万条向量里找最像的,也能瞬间完成
- 核心作用:保证 RAG 系统的检索速度,用户提问后,能瞬间找到对应的文本内容,不会有卡顿
实操代码:
# -*- coding: utf-8 -*-
"""
@Created on : 2026/6/8 15:06
@creator : er_nao
@File :day_89.py
@Description :embedding向量概念通俗理解
"""
import numpy as np
# ====================== 第一步:安装依赖库(终端直接执行) ======================
# 复制下面的命令,在终端/命令提示符里执行,安装embedding核心依赖
# pip install modelscope sentence-transformers scikit-learn numpy -i https://pypi.tuna.tsinghua.edu.cn/simple
# ==================================================================================
# ====================== 第二步:导入核心库 ======================
from modelscope import snapshot_download
from sentence_transformers import SentenceTransformer
from sklearn.metrics.pairwise import cosine_similarity
# ====================== 第三步:加载中文embedding模型(零基础首选) ======================
# 从国内魔搭镜像下载模型,自动缓存到本地,后续运行不用重复下载
print("正在加载中文embedding模型。。。")
model_dir = snapshot_download('Xorbits/bge-small-zh-v1.5', local_files_only=False)
model = SentenceTransformer(model_dir)
print("模型加载完成")
# ====================== 核心函数1:生成单个文本的embedding向量 ======================
def generate_embedding(text: str) -> np.ndarray:
"""
给单个中文文本生成embedding向量
:param text: 输入的中文文本
:return: 生成的embedding向量(numpy数组,固定长度384维)
"""
# 模型生成向量,normalize_embeddings=True 自动做归一化处理
embedding = model.encode(text, normalize_embeddings=True)
return embedding
# ====================== 核心函数2:计算两个文本的余弦相似度 ======================
def calculate_similarity(text1: str, text2: str) -> float:
"""
计算两个中文文本的语义相似度,返回0-1之间的数值
数值越接近1,语义越相似;越接近0,语义越无关
:param text1: 第一个文本
:param text2: 第二个文本
:return: 两个文本的余弦相似度
"""
# 给两个文本分别生成向量
embedding1 = generate_embedding(text1).reshape(1, -1)
embedding2 = generate_embedding(text2).reshape(1, -1)
# 计算余弦相似度
similarity = cosine_similarity(embedding1, embedding2)[0][0]
# 保留四位小数方便查看
return round(similarity, 4)
# ====================== 实操1:直观感受向量的样子 ======================
print("\n" + "="*60)
print(" 实操1:直观感受embedding向量的样子")
print("="*60)
# 测试文本
test_text = "Day89的学习内容是embedding向量概念通俗理解"
# 生成向量
test_embedding = generate_embedding(test_text)
print(f"测试文本:{test_text}")
print(f"生成的向量维度:{len(test_embedding)}维")
print(f"向量前十个数字:{test_embedding[10:]}")
print(f"向量后十个数字:{test_embedding[:-10]}")
# ====================== 实操2:验证「语义越像,相似度越高」的核心规律 ======================
print("\n" + "="*60)
print(" 实操2:验证语义相似度与向量相似度的关联")
print("="*60)
# 测试文本组
text_group = [
("Day89的学习内容是embedding向量概念", "今天要学的是embedding向量的通俗理解", "语义高度相似"),
("Day89的学习内容是embedding向量概念", "RAG系统的核心是文本分块和向量化", "语义有一定关联"),
("Day89的学习内容是embedding向量概念", "我今天吃了苹果和香蕉", "语义完全无关"),
("苹果手机是智能手机", "苹果是一种好吃的水果", "同字不同义,语义无关"),
]
# 循环计算每组文本的相似度
for text1, text2, desc in text_group:
sim = calculate_similarity(text1, text2)
print(f"\n【{desc}】")
print(f"文本1:{text1}")
print(f"文本2:{text2}")
print(f"语义相似度:{sim}")
# ====================== 实操3:给你之前的文本分块结果生成向量(衔接RAG项目) ======================
print("\n" + "="*60)
print(" 实操3:给文本分块结果生成向量(衔接RAG项目)")
print("="*60)
# 这里替换成你Day88分好的文本块内容,示例用你之前的学习内容
chunk_list = [
"Day85的学习内容是pdfplumber安装与PDF文字提取,核心目标是掌握PDF读取,能独立提取PDF中的文字内容",
"Day86的学习内容是RAG核心文本分块逻辑与全流程实操,核心目标是掌握文本分块技术,能对长文档进行合理分块",
"Day87的学习内容是文档分段、切块策略,核心目标是了解文档分块,能对长文档进行合理的分块处理",
"Day88的学习内容是文本切分函数封装,核心目标是将文档分段、切块逻辑封装成可复用的工程化函数",
"Day89的学习内容是embedding向量概念通俗理解,核心目标是彻底搞懂embedding向量的本质、核心作用与RAG关联逻辑",
]
# 给每个文本块生成向量,保存「文本内容+向量」对
chunk_embedding_list = []
for idx, chunk in enumerate(chunk_list):
embedding = generate_embedding(chunk)
chunk_embedding_list.append({
"chunk_id": idx+1,
"chunk_content": chunk,
"embedding_vector": embedding.tolist() # 转成列表,方便后续保存到JSON
})
print(f" 第{idx + 1}个文本块向量生成完成,维度:{len(embedding)}")
print(f"\n 所有文本块向量生成完成,共生成 {len(chunk_embedding_list)} 个「文本+向量」对")
print(" 这些结果可直接用于后续的向量库搭建与相似度检索环节")
# ====================== 可选:保存向量结果到JSON文件 ======================
import json
save_path = "C:\\Users\\hp\\Desktop\\NLP学习数据\\文本向量结果.json"
with open(save_path, "w", encoding="utf-8") as f:
json.dump(chunk_embedding_list,f,ensure_ascii=False,indent=2)
print(f"\n 向量结果已保存至:{save_path}")
问题记录
问题一:
安装的时候遇到一个问题:ERROR: pip’s dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
googletrans 4.0.0rc1 requires httpx==0.13.3, but you have httpx 0.28.1 which is incompatible.
这个报错不是你操作错了,是 Python 里非常常见的「包版本冲突」问题,大白话解释:
- 你电脑里之前已经装了 googletrans 4.0.0rc1 这个翻译包,这个包有个硬性要求:必须搭配 httpx 0.13.3 这个版本,不能高也不能低
- 你现在电脑里的 httpx 版本是 0.28.1,版本太高了,和 googletrans 要求的版本完全不兼容
- pip 安装的时候,发现了这个冲突,就会报错终止安装,避免把你现有的包环境搞坏
推荐解决方案:
这是 Python 开发的标准做法,也是最安全的方案,完全不会影响你电脑里现有的任何包和项目,相当于给 Day89 的 RAG 学习单独开了一个「独立小房间」,里面的包和外面完全隔离,不会有任何冲突。
一步步操作(Windows/Mac/Linux 全适配)
步骤 1:打开终端 / 命令提示符
- Windows:按 Win+R,输入 cmd,回车打开命令提示符
- Mac/Linux:直接打开「终端」应用
步骤 2:创建虚拟环境(选一个你能找到的文件夹,比如桌面)
先通过 cd 命令进入你想放虚拟环境的文件夹,比如桌面:
# Windows 进入桌面命令
cd Desktop
# Mac/Linux 进入桌面命令
cd ~/Desktop
然后执行创建虚拟环境的命令,给虚拟环境起个名字,比如 rag-env:
python -m venv rag-env
执行完之后,你的桌面会出现一个叫 rag-env 的文件夹,虚拟环境就创建好了。
步骤 3:激活虚拟环境(进入这个独立小房间)
激活之后,所有的 pip 安装操作,都只会在这个虚拟环境里生效,完全不会影响外面的包。
# Windows 激活命令
rag-env\Scripts\activate
# Mac/Linux 激活命令
source rag-env/bin/activate
步骤 4:在虚拟环境里安装需要的依赖
现在虚拟环境里是完全干净的,没有任何包冲突,直接执行安装命令即可,用国内清华镜像,速度快,不会失败:
pip install sentence-transformers scikit-learn numpy -i https://pypi.tuna.tsinghua.edu.cn/simple
问题二:
代码执行以后报错了:[WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。’ thrown while requesting HEAD https://huggingface.co/BAAI/bge-small-zh-v1.5/resolve/main/./modules.json
Retrying in 1s [Retry 1/5].
这个报错不是你的代码写错了,也不是之前的安装有问题,是国内用户 90% 都会遇到的「Hugging Face 模型下载网络超时」问题,大白话解释:
- 你运行的代码里,SentenceTransformer(‘BAAI/bge-small-zh-v1.5’) 这一行,需要从国外的 Hugging Face 官网下载模型的配置文件、权重文件
- 你的电脑和 Hugging Face 的国外服务器之间,网络连接超时了,连不上、下载失败,所以代码报错重试
- 核心结论:代码完全没问题,安装也没问题,就是国内网络访问国外 Hugging Face 服务器不稳定导致的
解决方案:
用国内魔搭 ModelScope 镜像(一行代码替换,秒加载,零超时)
这是最适合零基础用户的方案,不用改任何其他代码,只需要替换模型加载的那一行,就能正常运行,完全不会超时。
核心说明
ModelScope(魔搭)是阿里达摩院做的国内 AI 模型平台,和 Hugging Face 完全兼容,所有主流模型都有国内镜像,下载速度拉满,国内访问完全稳定,不用任何额外配置。
步骤 1:先安装魔搭的模型加载依赖
pip install modelscope sentence-transformers scikit-learn numpy -i https://pypi.tuna.tsinghua.edu.cn/simple
步骤 2:替换代码里的模型加载行(只改这一行,其他完全不用动)
model = SentenceTransformer('BAAI/bge-small-zh-v1.5')
直接替换成下面这一行,用魔搭的国内镜像加载模型,完全兼容,功能一模一样:
from modelscope import snapshot_download
# 从国内魔搭镜像下载模型,自动缓存到本地,后续运行不用重复下载
model_dir = snapshot_download('Xorbits/bge-small-zh-v1.5', local_files_only=False)
# 用本地下载好的模型加载,完全和原来的功能一致
model = SentenceTransformer(model_dir)

799

被折叠的 条评论
为什么被折叠?



