Token、Embedding 与向量相似度
🔤 文本进入 AI 系统通常经历:文本 → Token → 模型表示 → 文本级 Embedding → 相似度检索。这几层都叫“向量”时很容易混淆,但它们的训练目标和用途不同。
一张图理解
Token
Token 是模型词表中的离散编号,不等于字、词或字符。Tokenizer 需要在词表大小和序列长度之间权衡。
常见算法
- BPE:反复合并高频符号对。
- WordPiece:按语言模型似然选择子词。
- Unigram:从大词表中逐步删除贡献低的子词。
- Byte-level:以字节为基础,几乎不会出现 OOV,但可读性较差。
为什么 token 数不稳定
- 空格、大小写、标点和前导换行都可能改变切分。
- 中文不保证“一字一 token”。
- UUID、Base64、随机字符串、代码和罕见字符通常更费 token。
- 不同模型的 Tokenizer 不同,不能用固定“字数比例”精确估算。
工程上应使用目标模型对应的 Tokenizer 实测,并分别统计输入、输出、缓存和工具结果 token。
Token Embedding 与上下文表示
Token ID 先在矩阵中查表得到初始向量:
E ∈ R^(vocab_size × d_model)
token_id → E[token_id]
初始 Token Embedding 不含当前句子语境。同一个“苹果”在输入层向量相同,但经过多层 Transformer 后,会根据“水果”或“公司”的上下文形成不同表示。
文本级 Embedding
RAG 使用的 Embedding 模型通常经过对比学习,把查询与相关文档拉近、与不相关文档推远。输出一般是一整句或一段文本的固定维向量。
非对称检索
Query 和 Document 的角色不同。部分模型要求:
query: 如何取消请求?
passage: 可以使用 AbortController 取消 fetch 请求……
或提供独立的 query/document 编码接口。忽略模型说明中的前缀会影响召回率。
向量归一化
L2 归一化:
v_norm = v / ||v||₂
归一化后只保留方向信息。对单位向量,点积与余弦相似度的排序等价。
相似度与距离
| 方法 | 直觉 | 适用条件 |
|---|---|---|
| 余弦相似度 | 比较方向 | 语义向量常用 |
| 点积 | 方向与模长共同影响 | 模型按 dot product 训练,或向量已归一化 |
| 欧氏距离 | 比较直线距离 | 聚类和几何距离模型 |
| 曼哈顿距离 | 各维绝对差之和 | 特定稀疏或鲁棒场景 |
**不要自行混用度量。**应遵循模型卡和索引实现的推荐;索引距离、离线评测和线上阈值必须一致。
为什么相似度高仍可能答错
- 向量表达的是训练目标下的相关性,不是逻辑蕴含或事实一致。
- 标题和概述可能与许多查询都“泛相关”。
- 否定、数字、版本号、代码符号在稠密向量中可能不够敏感。
- 固定阈值跨语言、跨领域和跨模型不可直接迁移。
因此生产检索通常组合:metadata 过滤 + BM25 + dense retrieval + reranker。
ANN 近似最近邻
精确扫描复杂度约为 O(N × d)。大规模系统通过 ANN 换取可控的召回损失。
HNSW
构建多层近邻图,查询时从稀疏高层逐步下降。核心参数:
M:每个节点连接数;越大召回更好、内存更高。efConstruction:建索引搜索宽度。efSearch:查询搜索宽度;越大召回更好、延迟更高。
IVF
先聚类,查询只探测最相关的若干簇。nprobe 控制探测簇数量。
PQ
把向量分段量化编码,显著降低内存,但会损失距离精度。常与 IVF 组合。
Embedding 选型与评测
不要只看维度或公开榜单。使用真实查询构建评测集,至少衡量:
- Recall@K、MRR、nDCG
- 不同语言、长度和领域切片
- 向量存储大小、索引构建时间、P95 延迟
- 模型调用与迁移成本
更换 Embedding 模型通常意味着全量重建索引。应记录 embedding_model、维度、归一化方式、文本预处理和索引版本。
阈值校准
相似度分数不是概率。用标注的正负样本绘制分布,根据“漏召回”和“误召回”的业务成本选择阈值;并为不同数据域分别校准。
常见误区
- Token 数等于字数或单词数
- Token Embedding 等于 RAG 文本 Embedding
- 向量维度越高一定越好
- 相似度 0.8 在所有模型中含义相同
- ANN 参数只影响速度,不影响召回
- 更换模型后可以继续复用旧索引
- 相似度高就代表答案被证据支持