"向量数据库""Embedding"这些词无处不在——它是连接人类语言与计算机数字世界的桥梁。下面这张星图里,每一个词、每一段话,最终都会变成空间中的一个坐标点。
想象你开了一家水果店,想用两个特征给水果打分:甜度和酸度,分值范围 0~1。把两个分数连起来,就得到一串数字——这就是一个「二维向量」。
点击下面的水果,看看它在「甜度 × 酸度」空间里的位置:
大模型做的事情一模一样,只不过特征不是 2 个,而是成千上万个——OpenAI 的 Embedding 模型有 1536 维,Llama-3 甚至有 4096 维。每一维都在刻画情感、词性、主题、语境……最终生成一串几千个数字的数组,这就是特征向量。
在几何学中,向量最直观的解释是:有方向和长度的箭头。一维是数轴上的点,二维、三维是坐标系里的箭头;到了 1536 维,人脑虽然想象不出图形,但数学公式依然成立。
"很高兴认识你"和"认识你我真开心",字面完全不同,但转化为高维向量后,两个箭头几乎指向同一个方向。衡量这种相似度,用的是余弦相似度 —— 计算两个箭头夹角 θ 的余弦值。拖动下面的滑块,感受夹角如何影响相似度:
最经典的向量例子。用「国王」的向量减去「男人」,抽离出男性属性,只剩下"皇室统治者"的概念;再加上「女人」的女性特征,结果就极度接近「女王」的真实坐标——语义可以做数学加减法。
初学者容易把 Embedding 模型和 GPT-4、Claude 这样的 LLM 混为一谈。实际上它们分工完全不同:
| 模型类别 | 代表模型 | 核心优化目标 | 最终输出物 |
|---|---|---|---|
| 大语言模型 LLM | GPT-4o / Claude / Llama-3 | 预测下一个 Token | 自然语言文本 |
| Embedding 模型 | text-embedding-3-small / bge-large-zh | 将语义投影到高维坐标系 | 高维浮点数数组 |
Embedding 模型的训练用的是对比学习:准备相似文本对(正样本)和不相似文本对(负样本),训练中拉近正样本、推远负样本,最终学会给任意文本做精确的"语义定位"。
把文本转化为向量的过程叫 Embedding(嵌入),需要借助专门的 Embedding 模型。以下是调用 OpenAI API 的例子:
from openai import OpenAI # 1. 初始化客户端 client = OpenAI(api_key="your-api-key-here") text_content = "人工智能正在改变世界。" # 2. 调用 Embedding 模型 response = client.embeddings.create( input=[text_content], model="text-embedding-3-small" ) # 3. 提取生成的向量数组 vector = response.data[0].embedding print(f"维度数: {len(vector)}") # 输出类似: [-0.01254, 0.03451, -0.00789, ...]
① Transformer 内部:输入的每个字词一开始就被映射为向量,注意力机制本质上就是向量之间的矩阵乘法。
② RAG 检索增强:大模型上下文有限、无法实时联网,AI Agent 用向量数据库做"外接硬盘":
用户问题 → Embedding 模型 → 生成"提问向量"
向量数据库匹配 → 取出 Top-K 最相关的原始文本块
原始文本拼接进 Prompt → 发送给 LLM → 生成最终回答
搜"汽车",关键词搜索漏掉"越野车";向量搜索能感知 car / vehicle / 越野车 是同类事物。
纯向量搜索分不清 iPhone 15 与 16;关键词检索(BM25)+ 向量检索结合,兼顾精确度与泛化度。
向量库先捞出高召回的 Top-20,再用 Cross-Encoder 重排序模型精选出最相关的 Top-3 给大模型。
Agent 把历史聊天记录切片、向量化存储,提问时自动检索相关记忆合并进 Prompt。
传统数据库全表扫描计算相似度效率太低,向量数据库用 ANN 近似最近邻算法(如 HNSW、IVF),毫秒级从数亿向量中找到最接近的几个。一条典型记录长这样:
常见方案:轻量本地型 Chroma / Faiss;企业分布式 Pinecone / Milvus / Qdrant;传统数据库扩展 pgvector(给 PostgreSQL 加 HNSW / IVF 索引)。
需要说明的是,现代 Embedding 的单个维度通常并没有人类可读的明确含义——语义特征由成百上千个维度共同编码,这叫分布式表示。而且维度并非越高越好:过高的维度会拖慢检索、占用更多存储,很多 384 维的小模型在垂直场景反而更好用。
长文章不能整段塞进 Embedding 模型,需要先切片(Chunking)。为了避免完整意思被"拦腰截断",相邻分块之间会设置重叠区间。下面是 Chunk Size = 24 字、Overlap = 8 字的滑动窗口切分:
更进阶的做法是语义分块:通过分析相邻句子余弦相似度的突变,识别出段落或语义转折的真实边界,让每个分块天然对应一个完整的思想。
套娃嵌入(Matryoshka Representation Learning)允许把 1536 维向量直接截断,只保留前 256 维,语义信息几乎不丢失,但存储和检索开销降低数倍:
秘密在于训练阶段就针对多个尺度联合优化损失函数,模型在一次前向传播中同时学好"从粗到细"所有尺度的表示——因此截断不需要重新训练,是非常实用的工程调优手段。