# 意义即坐标

关于 embedding 与向量检索的速成课。20 个概念——embedding、向量空间、余弦相似度、最近邻搜索、vector database、ANN、semantic search、RAG retrieval、clustering、推荐、reranking、embedding evals 等——每个都配有英文名称、一幅图、一个例子和一张卡片。让意义变得可计算：「找出与此类似的东西」变成「找出邻近的点」。结尾附一页速查表，囊括所有概念。

- **Author:** Fedor Chishchin
- **Level:** intermediate
- **Reading time:** ~35 分钟阅读
- **Published:** 2026-06-13
- **Source:** https://fedorthinks.com/zh/learn/embeddings-express

---

## 1. 意义即坐标

整个领域都建立在一个优雅的想法上：如果你能把意义放进空间，你就能对它进行计算。领会了这一点，embedding 便不再神秘。

### 地图：七组共 20 个概念

> 一张地铁图：先看到整张网络，再一站一站地坐过去。

先是三个**基础**——为什么光有字符对计算机还不够、embedding 是什么、意义空间是什么。然后是六组，每章一组：**相似度**、**vector database**、**semantic search**、**检索之外**的用途、**陷阱**，以及如何**用好它**。

之后每个概念都得到同样的对待：它的**英文名称**（要记住——这就是术语）、一幅生活中的画面、一张**图**，以及一张带字段的**卡片**：_是什么_、_原理_、_例子_、*坑*和*关联*。

_Diagram: 上面是基础，然后是六组——第 2–7 章依次讲它们。_

### Lexical Gap — 计算机看到的是字符，而非意义

> 一台机器能逐像素地分辨出两张照片不同，却完全不知道它们都画着一只狗——表面有差异，意义却对它不可见。

对计算机来说，文本只是字符。它能检查两个字符串是否完全相同，但它天生就没有这种意识：「car」和「automobile」是同一个意思，或者「the bank approved my loan」和「my mortgage was accepted」说的是同一件事。这道文字与意义之间的鸿沟就是 **lexical gap**。逐字匹配（**exact match**）会完全错过意义。要让软件处理文本所*意味*的东西，而不是它如何拼写，你需要一种把意义变成计算机能度量之物的方法。

_Diagram: 对精确比对来说，这是两个不同的字符串。对人来说，是同一件事。_

#### Lexical Gap (文字与意义之间的鸿沟)

- **是什么:** 同一个意思可以用不同的词来说——而计算机只比较词。
- **例子:** 「Car」和「automobile」；「the bank approved my loan」和「my mortgage was accepted」。
- **坑:** 按精确词匹配的搜索，会悄悄漏掉所有换了说法的内容。
- **关联:** 这正是 **embedding** 要弥合的鸿沟。

### Embedding — 文本变成一个点

> 一张地图，每个想法都有一个位置，意义相近的想法彼此靠近——「dog」紧挨着「puppy」，两者都远离「tax return」。

**embedding** 是一串数字——一个 **vector**——它代表一段文本的意义。它由 **embedding model** 产生：模型读入文本，输出它的坐标。相近的文本得到相近的数字——也就是邻近的点。原本对计算机不可见的意义，变成了一个位置——而位置正是软件能够比较、排序和检索的东西。

_Diagram: 文本 → embedding model → vector。vector 就是意义的坐标。_

#### Embedding (vector)

- **是什么:** 一串数字（一个 vector），代表文本的意义。
- **原理:** embedding model 读入文本并输出坐标；意义相近，数字相近。
- **例子:** 「puppy」→ `[0.21, −0.83, 0.47, …]` ——紧挨着「dog」的 vector。
- **坑:** 整个空间的质量取决于构建它的那个模型。
- **关联:** 点位于 **vector space** 中；由 **vector database** 来存储。

### Vector Space — 邻近即相似的空间

> 一张地图，「dog」「puppy」「cat」聚成一团在一个角落，「spreadsheet」和「tax return」在另一个角落。

所有 embedding 都存在于同一个高维的 **vector space**（也叫 **embedding space**）里。它有几百个维度，但这个想法在一张平面纸上也很容易看明白：意义相近的点靠得近，无关的点离得远。「Dog」和「puppy」靠在一起，两者又都远离「spreadsheet」。这个空间本身就是一张意义的地图。

_Diagram: 意义相近的聚在一起；无关的落在地图的另一头。_

#### Vector Space (embedding space)

- **是什么:** 一个高维空间，每段文本在其中都有一个位置。
- **原理:** 模型摆放这些点，使得邻近就意味着意义相似。
- **例子:** 「dog / puppy / cat」这一团远离「spreadsheet / tax return」那一团。
- **关联:** 其中的距离就是 **semantic similarity**。

### Meaning as Geometry — 一旦意义有了坐标，你就能对它进行计算

> 一旦每个城镇都成了地图上的一个点，「找出最近的城镇」就变成了简单的几何——地图把一个模糊的问题变成了可度量的问题。

这一步让其余一切成为可能：意义被表示成坐标之后，关于意义的模糊问题就变成了关于几何的精确问题。「哪些文档谈的是这个主题？」变成「哪些点靠近这个点？」「这个与那个相似吗？」变成「它们相距多远？」计算机无法理解意义，却能完美地度量距离——而 embedding 让它可以通过度量距离来回答关于意义的问题。这个转换就是全部的诀窍。

_Diagram: 左边是关于意义的模糊问题；右边是同样的问题，变成了精确的几何。_

> **框定问题:** 「我是否需要处理文本的*意义*，而不只是它的拼写——因为这正是 embedding 弥合的鸿沟，它把意义变成坐标？」

> 计算机看到的是字符，而非意义。embedding 把一段文本变成空间中的一个点，放置得让意义相近的靠得很近——于是意义成了软件可以度量的东西。

## 2. 相似即距离

意义被放进空间之后，按意义比较两样东西，就变成度量它们的点相距多远。这个简单的想法，是 embedding 所做一切的引擎。

### Semantic Similarity — 点靠得近，意义就相近

> 在地图上，两个相邻的城镇很容易往来；两个分处东西海岸的城镇则很远。地图上的远近，映照着现实中的远近。

由于 embedding 把相近的意义放在彼此附近，**点之间的距离度量的是意义的差异**：靠得近就相似，离得远就无关。这就是 **semantic similarity**。要问两段文本有多像，就把两者都做成 embedding，再度量它们 vector 之间的间隔——间隔小，说明它们意思几乎相同。一个你能计算的距离，替代了你原本无法衡量的相似度。

_Diagram: 查询「get my money back」靠近「refund policy」，远离「office hours」。_

#### Semantic Similarity (按意义的相似度)

- **是什么:** 两段文本在意义上有多接近。
- **原理:** 把两者都做成 embedding，再度量 vector 之间的距离。
- **例子:** 「How do I get my money back」靠近「refund policy」，尽管两者几乎没有共同的词。
- **坑:** 主题相似不等于有用——见 **similar ≠ relevant**。
- **关联:** 通常用 **cosine similarity** 来度量。

### Nearest-Neighbour Search — 找出最近的点

> 一位图书管理员，你递给他一本书，他立刻就能指给你看与它最相像的那一排书架——不是按书名，而是按内容。

核心操作是 **nearest-neighbour search（k-NN）**：给定一个点，找出离它最近的 _k_ 个点。「给我看看与此类似的东西」变成「在空间里找出这一项的最近邻」。把一个问题、一件商品、一份文档交给系统，它就返回意义上最相似的那些，并按远近排序。这一个操作驱动着 semantic search、推荐，以及后面的大部分内容。一切都是「找出邻近的点」的某种变体。

_Diagram: 查询的周围：最近的三个点，按远近排序。其余的都很远。_

#### Nearest-Neighbour Search (k-NN)

- **是什么:** 给定一个点，找出离它最近的 k 个点。
- **原理:** 计算相似度，按远近排序——前 k 个（top-k）就是答案。
- **例子:** 一个问题 → 意义上离它最近的三份文档。
- **坑:** 在数百万个点里逐一检查太慢——你需要 **ANN**。
- **关联:** 是 **semantic search**、**推荐**、**分类**的基础。

### Cosine Similarity — 方向比原始距离更重要

> 两支指向同一方向的箭头是相像的，哪怕一支更长——重要的是它们指向哪里，而不是长度。

实际中，相似度通常用 vector 之间的*夹角*来度量，而不是直线距离——这种度量叫 **cosine similarity**。两个指向同一方向的 embedding 会被视为相似，即使其中一个「更长」，因为方向承载意义，而长度往往只反映文本长度之类的东西。使用 embedding 不需要懂这套数学，但值得知道：衡量「有多相似」的标准度量看的是方向，而不是原始距离。

_Diagram: A 和 B 指向同一方向——尽管长度不同，仍然相似。C 指向别处。_

#### Cosine Similarity (基于夹角的相似度)

- **是什么:** 按 vector 之间的夹角而非长度来衡量的相似度。
- **为什么:** 方向承载意义；长度往往只反映文本长度。
- **例子:** 同一主题的一则短笔记和一篇长文章——夹角小，相似度高。
- **关联:** **semantic similarity** 和 **k-NN** 的标准度量。

> **相似度问题:** 「我是不是想找出与某一项意义最相似的东西——因为那不过是在 embedding space 里找出它的最近邻？」

> 意义相近的靠得近，所以相似度变成了距离。核心操作是 nearest-neighbour search——找出最近的点——通常按方向来度量，也就是 cosine similarity。

## 3. vector database

找最近邻，点少的时候很容易，成百万个点的时候就难了。vector database 就是为在大规模下快速完成这件事而造的引擎——embedding 实际的栖身之所。

### Vector Database — 为最近邻搜索而建的存储

> 一座仓库，布置得让你给出任何一件物品，它都能立刻取来最相似的一百件——不是靠扫遍每个货架，而是靠它的摆放方式。

**vector database** 存储你的 embedding，并能快速回答「找出离这个点最近的点」这类查询，哪怕面对数百万个 vector。它专为 embedding 需要的那一个操作而造：按相似度做最近邻搜索。你把数据做一次 embedding，存下 vector，数据库就成了一个可搜索的意义索引。人们在 embedding 之上构建搜索、RAG 或推荐时，vector database 就是 vector 的住处，也是搜索发生的地方。

_Diagram: 应用把 vector 存进数据库，再取回最近的 k 个。_

#### Vector Database (vector store)

- **是什么:** 一个存放 vector 并支持快速最近邻搜索的存储。
- **原理:** 保存 vector、id 和元数据；给定一个查询 vector，返回最近的 top-k。
- **例子:** 一百万个文档片段；一次查询在几毫秒内找出最近的五个。
- **关联:** 内部是 **ANN** 索引；上面跑着 **semantic search** 和 **RAG**。

### ANN — 近似搜索让大规模变快

> 找最近的咖啡馆，你不会去量到地球上每一家咖啡馆的距离——你先看自己的街区。聪明的捷径胜过逐一检查。

把一次查询与每一个存储的 vector 都比一遍，在大规模下会慢得无法接受。所以 vector database 使用 **approximate nearest-neighbour（ANN）**搜索：巧妙的索引，不必逐一检查就能找到最近的点，用一点点精度换来巨大的速度提升。这就是为什么在数百万条目上做向量搜索只需几毫秒。你很少需要精确的最近邻——「非常近」和「最近」一样好用。

_Diagram: 上：精确搜索要与所有向量比较。下：ANN 直接去往正确的街区。_

#### ANN (近似最近邻)

- **问题:** 把一次查询与数百万个 vector 逐一比较，太慢了。
- **思路:** 索引直接跳到空间中正确的区域，只检查那里。
- **例子:** 在数百万个条目上搜索——只需几毫秒。
- **代价:** 偶尔会漏掉真正的最近邻——得到的是「非常近」而不是「最近」。
- **关联:** **vector database** 内部的引擎；加速 **k-NN**。

### Embed Once, Query Many — 嵌入一次，搜索多次

> 书到馆时你给图书馆编目一次，此后每次查找都是瞬间的——缓慢的索引工作发生在前面，快速的查找则永远继续。

embedding 系统的形态是：先**把数据嵌入一次**并存下 vector（**index time**），然后每次查询都**低成本地搜索**（**query time**）。计算 embedding 是有成本的，但这笔成本在数据加入时支付，而不是每次搜索时。昂贵的一步是一次性的索引；每次查询的成本只是一个 vector 加一次快速查找。了解这种划分，有助于你推断 embedding 系统的成本和新鲜度。

_Diagram: 上：对所有文档做一次性索引。下：每次查询的低成本路径。_

#### Embed Once, Query Many (index time 与 query time)

- **思路:** 数据加入时就预先嵌入；查询时只嵌入查询本身。
- **例子:** 文档在上传时做 embedding；用户的问题只是一个 vector 加一次查找。
- **坑:** 新增或改动的数据也必须做 embedding，否则搜索看不到它们。
- **关联:** 存放在 **vector database** 中；换模型 = 把所有数据重新嵌入（**same model**）。

> **数据库问题:** 「我的 vector 存在哪里？在我的规模下搜索够快吗——我用的是带近似搜索的 vector database，而不是扫描一切？」

> vector database 存储 embedding 并快速找出最近邻，靠近似搜索（ANN）扩展到数百万条。把数据在前面嵌入一次；每次查询时低成本地搜索。

## 4. semantic search

embedding 最直接的用途，是能理解意义的搜索。值得把它看清楚，因为它既是最常见的应用，也是 RAG 的基础。

### Semantic Search — 按意义搜索，而不是匹配字词

> 一个帮手，即使你用自己的话描述，他也能找到你想要的——「那个让饮料保持冰凉的东西」就把你带到冰箱前，不需要精确匹配。

**semantic search** 按意义而不是按匹配关键词（**keyword search**）来找结果。你把用户的查询做成 embedding，再搜索 vector 与之最近的文档片段。所以搜索「how do I get my money back」能找到标题为「refund policy」的页面，因为它们的意义靠得近——尽管几乎没有共同的词。keyword search 会漏掉这个；semantic search 就是为此而生。它找到的是你*想表达*的，而不只是你字面上输入的。

_Diagram: keyword search 什么也没找到。按意义搜索找到了「refund policy」。_

#### Semantic Search (按意义搜索)

- **问题:** 用户用自己的话来写——关键词对不上。
- **思路:** 把查询做成 embedding，找出最近的文档 vector。
- **例子:** 「How do I get my money back」→「Refund policy」页面。
- **代价:** 需要一个模型、一个 vector database，并且换模型时要重新做 embedding。
- **关联:** 跑在 **k-NN** 和 **vector database** 上；是 **RAG** 里的 retrieval。

### Same Model, Same Space — 查询要和数据用同样的方式嵌入

> 要比较两个测量值，必须用同一把尺——一个用英寸量、另一个用厘米量，数字就对不上。

要让搜索行得通，查询和存储的文档必须由**同一个模型**嵌入到同一个空间——否则它们的坐标没有可比性，「最近」也就毫无意义。你用某个模型嵌入文档，查询时就用同一个模型嵌入问题。这听起来显而易见，却是常见的 bug：混用 embedding 模型，或者换了模型却没有把一切重新嵌入，会悄悄地弄坏搜索，因为这些点已经不在同一个空间里了。

_Diagram: 左：一个模型，一个空间。右：混用模型——距离毫无意义。_

#### Same Model, Same Space (查询和数据用同一个模型)

- **是什么:** 查询和文档由完全相同的模型嵌入。
- **为什么:** 不同的模型造出不同的空间；它们的坐标无法比较。
- **例子:** 你换了查询用的模型，却保留了旧的文档 vector——搜索悄悄坏了。
- **坑:** 不会报任何错；结果只是变差了。
- **关联:** 换模型 = 把所有数据重新嵌入（又一次 **embed once**）。

### RAG Retrieval — 这是 RAG 底下的 retrieval

> 开卷考试：semantic search 就是你在作答之前找到该翻哪几页的方法——让有依据的回答成为可能的那次查找。

semantic search 是 **retrieval-augmented generation**（RAG 课程）中的 **retrieval** 步骤。当 RAG 系统依据你的文档作答时，embedding 就是它找出相关片段、放进模型上下文的方式。所以 RAG 系统的质量在很大程度上取决于它的 embedding 搜索质量——让正确的片段靠近查询，回答就有依据；让错误的片段靠近，模型就会依据垃圾作答。

_Diagram: 问题 → embedding → 搜索 → 最佳片段进入上下文 → 有依据的 LLM 回答。_

#### RAG Retrieval (RAG 中的 retrieval 步骤)

- **是什么:** RAG 为模型的上下文找出片段的那一步。
- **原理:** 嵌入问题 → 找出最近的片段 → 它们进入 prompt。
- **例子:** 客服机器人从帮助文档里找出三段话，并依据它们作答。
- **坑:** 片段不对 → 模型信心十足地依据垃圾作答。
- **关联:** 它就是 **semantic search**；质量取决于 **garbage in** 和模型。

> **搜索问题:** 「我是不是用同一个模型嵌入查询和文档，来匹配意义——还是在指望用户恰好敲出了我的文档所用的那些关键词？」

> semantic search 按意义而非关键词来找——用与数据相同的方式嵌入查询，找出最近的 vector。它是 RAG 底下的 retrieval 引擎。

## 5. 检索之外

搜索是显而易见的用途，但同样的「意义即坐标」思想，也在悄悄驱动着一大批其他任务。看看它们，就知道 embedding 为什么是如此基础的工具。

### Clustering & Deduplication — 按意义分组

> 把一堆混杂的文档按主题分成几摞——把意思相近的放在一起，无需读每一个字。

因为意义相近的在空间里聚在一起，你可以自动按意义**分组**数据——这就是 **clustering**：把客户反馈归成主题、按话题整理文章、在一堆文本中找出天然的类别。同样的想法还能抓出**重复和近似重复（deduplication）**——两张用不同的话描述同一个问题的工单靠得很近，所以你能发现并合并它们。任何本质上是「这些里哪些意思相同？」的任务，都是 embedding 任务。

_Diagram: 工单自己落成几个主题；两个几乎相同的点就是要合并的重复项。_

#### Clustering & Deduplication (分组，近似重复检测)

- **问题:** 一堆文本，不知道里面有哪些主题，也不知道哪些重复。
- **思路:** 靠近的点形成一组；几乎相同的点就是重复项。
- **例子:** 客户反馈自动归成主题；两张关于同一问题的工单被合并。
- **关联:** 与 **semantic similarity** 是同一种邻近关系。

### Recommendations — 更多你喜欢的

> 一位店员，看到你买了什么，就把品味相近的人喜欢的其他东西指给你——输入相似度，输出建议。

**推荐**其实是伪装起来的 nearest-neighbour search：把物品（商品、文章、歌曲）做成 embedding，让相似的靠得近，「多推荐些类似的」就变成「找出离用户喜欢的东西最近的物品」。找出与查询相似的文档所用的同一套机制，也能找出与一次购买相似的商品。每当你看到「你可能还喜欢」，背后很可能就悄悄地有 embedding。

_Diagram: 这次购买充当查询；它的最近邻就是推荐。_

#### Recommendations (「你可能还喜欢」)

- **问题:** 怎样建议用户还会想要的其他东西。
- **思路:** 被喜欢的物品就是查询；它的最近邻就是建议。
- **例子:** 买了登山靴 → 徒步袜、雨衣、背包。
- **关联:** 是 **k-NN**，只不过对象是商品而不是文档。

### Classification & Anomaly Detection — 谁属于，谁不属于

> 一位保安，知道正常是什么样子，并注意到那个举止与众不同的人——离群者在空间里单独站着。

embedding 驱动着 **classification**——新的物品很可能与离它最近的、已有标签的物品属于同一类别——以及 **anomaly detection**——某个东西的 embedding 离一切正常的都很远，就是值得标记的离群点。发现欺诈、跑题内容或异常输入，都变成了「找出离那一团很远的东西」。反复出现的模式是一样的：把东西变成点，再就邻近和距离来推理。

_Diagram: 左：新物品落在「spam」旁边。右：离正常很远的点就是异常。_

#### Classification & Anomaly Detection (按邻居打标签，离群点检测)

- **分类:** 新物品取其最近的、已有标签的邻居的标签。
- **异常:** 离一切正常的都很远的点，是值得标记的离群点。
- **例子:** 一封邮件落在 spam 旁边 → 是 spam；一笔奇怪的交易 → 去审查。
- **关联:** 邻近是 **k-NN**；离那一团的距离是 **similarity**。

> **检索之外的问题:** 「这个任务其实是在问哪些东西意思相同，或者哪些与其余的不同吗——因为如果是，解决它的是 embedding 和距离，而不只是搜索？」

> embedding 驱动的远不止搜索：clustering 和 deduplication 按意义分组，推荐找出相似的物品，classification 和 anomaly detection 则就邻近与距离来推理。

## 6. 那些陷阱

embedding 很强大，却容易以悄悄毁掉结果的方式被误用。少数几个陷阱，就解释了大多数令人失望的 embedding 系统。

### Model Mismatch — embedding 模型决定质量

> 一位只懂一半某门语言的译者，画出的是一张有缺陷的意义地图——之后的每一次比较都继承了这种扭曲。

一切都取决于生成 embedding 的那个模型。好模型能准确地放置意义，所以相似的东西确实靠得近；弱的或不匹配的模型（**model mismatch**）则造出一个扭曲的空间，其中的距离会误导你。在通用网络文本上训练的模型，可能对你的专门领域（法律、医疗、代码）嵌入得很差，因为它抓不住那里要紧的细微区别。

_Diagram: 左：模型懂这个领域——法律术语聚在一起。右：通用模型——一切都散落各处。_

#### Model Mismatch (模型与领域不匹配)

- **是什么:** 模型不理解你的领域，于是构建出一个扭曲的空间。
- **例子:** 通用模型几乎分不清法律或医疗术语，也分不清代码。
- **坑:** 不会报错——距离只是悄悄地在撒谎。
- **怎么做:** 审慎地选模型，并用你自己的数据检验。
- **关联:** 靠 **model choice** 和 **embedding evals** 来解决。

### Similar ≠ Relevant — 相似不等于相关

> 两段文字可以谈同一个主题，却回答不同的问题——「如何取消」和「人们为什么取消」靠得很近，但只有一个是被问到的。

embedding 相似度捕捉的是*主题*上的接近，这通常是相关性的良好替代——但并不总是。两段文本可能在意义上相近，而只有一段真正回答了需求。这就是为什么原始的 embedding 搜索是强有力的第一遍，却不是最终结论：它找到的是*关于*正确事物的内容，这与*有用*的内容并不完全相同。于是有了 **reranking** 这样的改进——第二步，按结果回答问题的程度重新排序。

_Diagram: 相似度搜索把「why users cancel」排第一。reranker 把真正回答问题的抬上来。_

#### Similar ≠ Relevant (reranking)

- **是什么:** 「最近」意味着「最相似」，而不是「最有用」。
- **例子:** 对于「how do I cancel」，搜索返回了「why users cancel」——同一主题，答非所问。
- **坑:** 很容易过分相信排在最前的结果。
- **怎么做:** 把搜索当作第一遍；再加上 **reranking** 作为第二步。
- **关联:** 是 **semantic similarity** 和 **semantic search** 的一个局限。

### Garbage In — 垃圾进，垃圾空间

> 如果你用草率、不一致的标签来归档文件，哪怕对文件柜做完美的搜索，得到的也是一团糟——索引的好坏，取决于放进去的是什么。

embedding 系统的质量，受限于你所嵌入内容的质量。糟糕的 **chunking**（来自 RAG 课程）、嘈杂的文本，或嵌入了错误的字段，都会造出这样一个空间：即使搜索完美，返回的结果也很差——距离是在垃圾上算出来的。所以大部分工作不在搜索，而在准备干净、切分得当的文本。在怪罪搜索之前，先修好输入。

_Diagram: 同样的搜索：嘈杂的输入得到垃圾，干净的输入得到好结果。_

#### Garbage In (输入糟糕，空间糟糕)

- **是什么:** 进来的糟糕文本会毁掉整个空间。
- **例子:** 在句子中间被切断的片段、嘈杂的文本、嵌入了错误的字段。
- **坑:** 明明是输入坏了，人们却去怪搜索。
- **怎么做:** 先把文本清理干净、切分好，再做 embedding。
- **关联:** 直接冲击 **RAG retrieval**；靠 **embedding evals** 发现。

> **陷阱问题:** 「我的 embedding 模型适合这些数据吗？我是不是过于轻信地把『相似』当成了『相关』？我嵌入的文本干净吗——还是我正建在一个扭曲的空间上？」

> embedding 会以已知的方式令人失望：弱的或不匹配的模型会扭曲空间，「相似」并不总是「相关」，嘈杂的输入会让哪怕完美的搜索也返回垃圾。选好模型，清理好输入。

## 7. 用好它

用好 embedding，归结起来就是：选对模型、喂给它干净的数据，并度量这个空间是否真的反映了你在意的意义。

### Model Choice — 为你的数据选 embedding 模型

> 你雇的是一位真正懂你所用方言的译者——通才可能恰恰漏掉对你最要紧的那些区别。

影响最大的选择是 **embedding model**，而合适的那一个取决于你的数据和任务。通用模型处理通用文本没问题；专门的领域可能需要一个理解该领域的模型，或在其上微调（fine-tune）过的模型。要考虑**语言、领域、vector 大小和成本**。别只是随手拿个默认的——要选那个能为*你的*意义构建出准确空间的模型，因为你将来做的每一次比较都建立在它之上。

_Diagram: 语言、领域、vector 大小和成本 → 选定模型 → 在你自己的数据上测试。_

#### Model Choice (选择 embedding 模型)

- **思路:** 按你的数据来挑模型，而不是直接拿默认的。
- **标准:** 语言、领域、vector 大小、成本。
- **例子:** 对于法律文本——选一个理解法律语言的模型，或在其上微调过的模型。
- **代价:** 以后换模型 = 把你所有的数据重新嵌入。
- **关联:** 解决 **model mismatch**；由 **embedding evals** 验证。

### Embedding Evals — 度量空间是否反映真实的意义

> 你检验一张新地图的方法，是看你熟悉的、彼此相近的地方在图上是否真的挨在一起——如果不是，这张地图就是错的。

别假定 embedding 的配置行得通——要检查它。对于一组你知道*应该*相似的案例，验证搜索是否真的把它们排在最近的那些之中。这就是 embedding 版本的 evals（**embedding evals**）：在你的真实数据上，这个空间是否把正确的东西放得很近？度量这一点，能在一个糟糕的模型、领域不匹配或 chunking 问题悄悄拖垮建在其上的一切之前，把它们揪出来。一个你没测试过的 embedding 空间只是猜测；一个你度量过的空间才是你能信任的工具。

_Diagram: 测试用例「查询 → 期望的文档」；命中 top-k 的比例就是得分。_

#### Embedding Evals (retrieval 评估)

- **思路:** 一组「查询 → 应该找到什么」的配对，检查它是否落在 top-k 之内。
- **例子:** 50 个真实的客服问题，各配上正确的文章——它出现在前 5 里的频率有多高？
- **能发现什么:** 糟糕的模型、领域不匹配、chunking 问题。
- **关联:** 检验 **model choice**、**garbage in** 和整条链路。

### 这些概念如何相连

> 一条传送带：文本进去，搜索、推荐和分组出来。每个陷阱都是传送带可能出错的地方。

整门课就是一条链。**干净的文本**进入 **embedding model**，输出 **vector**，它们存放在带 **ANN** 索引的 **vector database** 里。一次查询用 **cosine similarity** 找出它的**最近邻**——而 **semantic search 和 RAG**、**推荐**、**clustering** 和 **classification** 都建立在这一个操作之上。陷阱就在各个环节上：输入处是 **garbage in**，模型处是 **model mismatch**，搜索处是 **similar ≠ relevant**。而 **embedding evals** 度量整条链。

_Diagram: 文本 → 模型 → vector → 数据库 → 最近邻 → 各种用途。红色：出问题的地方。_

#### 在 embedding 之上构建之前

- **任务是否关乎意义**——相似、分组、检索——也就是 embedding 真正适合的？
- **embedding 模型对吗**——适合你的数据、领域和语言？
- **查询和文档是否由同一个模型嵌入**，进入同一个空间？
- **有没有 vector database**，带适合你规模的近似搜索？
- **你嵌入的文本是否干净**、切分得当，而不是噪音？
- **你是否度量过**，在真实案例上这个空间把正确的东西放得很近？

#### 你用好 embedding 的迹象

- 当任务关乎**意义**而非精确匹配时，你才会想到 embedding。
- 你**为你的数据选了 embedding 模型**，并以**同样的方式**嵌入查询和文档。
- 你在大规模下使用带**近似搜索**的 **vector database**。
- 你嵌入的是**干净、切分得当**的文本，并把「相似」当作相关性的一个有力但不完美的替代。
- 你**度量过**这个空间反映的是真实的意义，而不是想当然。

## 速查表：全部 20 个概念

### 基础

- **Lexical Gap** (词与意义): 意思相同，用词不同；exact match 看不见。
- **Embedding** (vector): 一串数字——文本意义的坐标。
- **Vector Space** (embedding space): 一张意义的地图：点靠得近就意味着相似；关于意义的问题变成关于距离的问题。

### 相似度

- **Semantic Similarity** (按意义的相似度): 意义相近 = vector 之间距离小。
- **Nearest-Neighbour Search** (k-NN): 找出最近的 k 个点。核心操作。
- **Cosine Similarity** (基于夹角): 按夹角衡量相似度：看方向，不看长度。

### vector database

- **Vector Database** (vector store): 存储 vector，并快速找出最近的那些。
- **ANN** (近似最近邻): 用一丁点精度，换来数百万条数据上的毫秒级响应。
- **Embed Once, Query Many** (index time / query time): 前面付一次嵌入的成本；每次查询都低成本地搜索。

### Semantic search

- **Semantic Search** (按意义搜索): 按意义找，而不是按关键词。
- **Same Model, Same Space** (同一个模型): 查询和文档用同一个模型，否则距离毫无意义。
- **RAG Retrieval** (RAG 中的 retrieval): embedding 找出模型据以作答的那些片段。

### 检索之外

- **Clustering & Deduplication** (分组，近似重复): 靠近的点形成一个主题；几乎相同的是重复项。
- **Recommendations** (「你可能还喜欢」): 用户所喜欢之物的最近邻。
- **Classification & Anomaly Detection** (标签与离群点): 取最近邻的标签；离正常很远就是异常。

### 陷阱

- **Model Mismatch** (模型不懂这个领域): 一个扭曲的空间——距离在悄悄撒谎。
- **Similar ≠ Relevant** (reranking): 最近是最相似，而不是最有用。reranking 能帮上忙。
- **Garbage In** (糟糕的输入): 糟糕的片段和噪音会毁掉整个空间。

### 用好它

- **Model Choice** (选择模型): 语言、领域、vector 大小、成本——然后在你自己的数据上测试。
- **Embedding Evals** (retrieval 评估): 「查询 → 期望结果」配对：命中 top-k 的比例。

> embedding 把意义变成坐标，于是相似度变成了距离。用好它的方式是：选对模型、一致地嵌入、喂入干净的文本，并度量这个空间真的把相似的东西放得很近。

速成课终 · 7 章 · 20 个概念

接下来是练习：取一小批你自己的文本，把它们嵌入，再检索——用你自己的话给它一个查询，看看最近的结果是否就是那些真正意思相同的。然后试一个非搜索的用途：按意义把它们 clustering，或找出近似重复。当一次检索找到了正确的文档、哪怕它与你的查询不共用任何关键词时，这个想法就在那一刻变得具体。但有一个想法要置于其余之上：embedding 把意义变成坐标，而一旦意义有了坐标，「找出相似的」便不过是几何。那一次转换，正是搜索、RAG、推荐，以及远不止于此的一切背后的引擎。
