跳到主要内容

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 参数只影响速度,不影响召回
  • 更换模型后可以继续复用旧索引
  • 相似度高就代表答案被证据支持