文本切分好之后,要把每块文字转成向量才能存进向量数据库。这篇讲 Embedding 是什么、怎么用。
一、什么是 Embedding?
Embedding 就是把文字转换成一串数字(向量)。
比如:
- “猫” → [0.12, -0.34, 0.56, …, 0.78](1536个数字)
- “狗” → [0.11, -0.33, 0.55, …, 0.77]
- “汽车” → [-0.5, 0.8, -0.2, …, 0.1]
关键特性:语义越相近的文字,向量距离也越近。
"猫"和"狗"都是动物,向量很接近;"汽车"是交通工具,向量离得远。这样我们就能用向量来衡量文字的相似度了。
二、为什么需要向量?
计算机不认识文字,只认识数字。你要算两段文字像不像,没法直接比。但转成向量之后,算两个向量的距离就很简单了——余弦相似度、欧氏距离,都是数学公式,一秒算完。
整个 RAG 流程里:
- 存文档的时候:每块文本 → Embedding → 向量 → 存进数据库
- 检索的时候:用户问题 → Embedding → 向量 → 在数据库里找最近邻
两边用同一个 Embedding 模型,向量空间才一致,检索才有意义。
三、OpenAI Embedding
最常用的就是 OpenAI 的 Embedding 模型:
from langchain_openai import OpenAIEmbeddings
embeddings = OpenAIEmbeddings(
model="text-embedding-ada-002",
openai_api_key="你的API Key",
)
# 把一段文字转成向量
vector = embeddings.embed_query("你好世界")
print(len(vector)) # 1536维
print(vector[:5]) # 前5个数字
特点:效果好、调用方便、按 token 收费。
四、本地开源 Embedding 模型
不想花钱调 OpenAI?可以用开源模型本地跑,比如 BGE、M3E:
from langchain_huggingface import HuggingFaceEmbeddings
embeddings = HuggingFaceEmbeddings(
model_name="BAAI/bge-small-zh-v1.5", # 中文效果好
)
vector = embeddings.embed_query("你好世界")
print(len(vector)) # 512维
特点:免费、本地运行、数据不出内网。缺点是需要自己的显卡或CPU跑,效果比OpenAI稍差一点。
中文场景推荐 BGE 系列,开源模型里中文效果算很好的。
五、相似度怎么算?
两个向量算相似度,最常用的是余弦相似度:
- 方向完全一样 → 相似度 1
- 方向垂直 → 相似度 0
- 方向相反 → 相似度 -1
import numpy as np
def cosine_similarity(vec1, vec2):
dot = np.dot(vec1, vec2)
norm1 = np.linalg.norm(vec1)
norm2 = np.linalg.norm(vec2)
return dot / (norm1 * norm2)
向量数据库内部已经帮你算好了,你不用自己写。但理解原理有助于你理解为什么检索结果是这样的。
六、选 Embedding 模型的建议
| 中文为主、追求效果 | OpenAI text-embedding-3-small |
| 中文为主、免费本地跑 | BAAI/bge-small-zh-v1.5 |
| 英文为主 | OpenAI text-embedding-ada-002 |
| 多语言 | multilingual-e5-large |
注意:存文档和检索问题必须用同一个模型,换了模型向量空间就不一样了,检索全乱。
本篇小结
- Embedding 就是把文字转成向量,语义相近的文字向量距离也近
- RAG 流程里:文档要向量化存库,问题也要向量化检索
- 常用模型:OpenAI Embedding(效果好)、BGE(开源免费中文好)
- 相似度常用余弦相似度衡量
- 存文档和检索必须用同一个 Embedding 模型





