Skip to content

K2 · 什么是 Embedding? - Embeddings ​

所属知识库:Agent 全栈技术地图
所属领域:01 · AI
所属章节:04 · AI 如何获取和利用外部知识? - Knowledge & Retrieval
文档类型:技术原理与工程实践研究
版本:v1.0
更新日期:2026 年 10 月 27 日
核心问题:Embedding 究竟是什么,为什么要将语言等信息转换为向量?向量的数值、维度、距离与语义有什么关系?Embedding 模型如何训练、编码和检索?怎样正确选择模型、实现语义搜索、评估质量,并将其接入知识库和 Agent?

专题导读 ​

计算机如何理解两段文字在语义上的关联?为什么用户提出的问题与文档中的表述并不相同,AI 系统仍然有可能找到相关内容?

本篇围绕 Embedding(向量嵌入)展开研究,从信息表示的基本问题出发,解释神经网络如何将文本等复杂信息映射为高维数值向量,以及 Token Embedding、上下文表示和 Sentence Embedding 之间的区别。

在技术原理部分,重点研究向量空间、维度、余弦相似度、点积和欧氏距离等数学概念,并进一步分析 Embedding 模型如何通过对比学习、正负样本训练和双编码器架构建立语义相关性。

在工程实践部分,研究文本编码、向量生成、相似度检索、模型选择、索引兼容和质量评估等关键问题,通过 Python 示例展示从文本到向量检索的基本过程。

最后结合 AI 知识库与 Agent 的应用场景,讨论 Embedding 如何为外部知识提供可计算的语义表示,以及它与向量数据库、信息检索和 RAG 之间的技术关系,为后续知识检索系统的研究建立基础。

一、研究定位与核心结论 ​

Embedding(嵌入表示)是将离散对象或复杂输入映射到连续数值空间的一类表示方法。对于文本检索,Embedding 模型通常将一句话、一段文字或一份文档编码为固定维度的向量,使相关内容在模型所学习的空间中具有可比较的几何关系。它将“如何比较两段自然语言”转化为“如何比较两个向量”,从而为语义搜索、聚类、推荐、分类和检索增强生成提供基础能力。[1][2]

本篇的主线是表示问题 → 编码机制 → 向量几何 → 训练目标 → 检索工作流 → 工程实现 → 质量评估 → Agent 接口。Embedding 不等于“把文字转成数字”这么简单:Token ID 也是数字,但通常只是离散标识;有效的语义嵌入还要求模型在训练中学到对目标任务有意义的空间结构。另一方面,Embedding 也不等于知识库、向量数据库或 RAG:它主要负责表示与相似性信号,其他系统负责存储、召回、证据管理和答案生成。

关键结论:向量相近表示模型在特定训练目标下认为输入相关,而不保证两个文本事实一致、答案正确、具有相同权限或适合直接作为证据。 语义检索的效果依赖训练数据、语言、领域、文本切分、查询/文档编码方式和评价指标,不能只凭一个余弦相似度分数判断正确性。

二、为什么需要 Embedding?从字符串匹配到语义匹配 ​

设知识库包含“公司员工申请出差报销,需要在返回后十个工作日内提交票据”,用户提问“差旅费用最晚什么时候报?”关键词检索可能因“差旅/出差”“费用/报销”“什么时候/十个工作日”的用词差异而漏掉相关内容。一个经过检索任务训练的文本嵌入模型,可以尝试把这两段文本映射到较近的向量区域,帮助系统发现词面不同但语义相关的内容。[2]

但反例同样重要:“报销必须在十天内完成”和“报销不必在十天内完成”包含大量相同词汇,某些 Embedding 模型可能给出较高相似度,却无法可靠区分否定关系。精确日期、合同编号、代码符号、专有名词和否定条件往往仍需要关键词检索、结构化过滤、重排序或生成模型进一步核验。Embedding 优化的是相关性表示,不是逻辑证明器。

从工程角度,向量化带来两项能力:其一,可以对海量文本构建向量索引,支持相似性查询;其二,可以把不同来源的内容映射到一个可统一比较的空间。但“统一比较”必须建立在兼容的模型、版本和编码约定上,不能随意混用不同模型生成的向量。

三、Embedding 的数学定义与表示层级 ​

抽象地,嵌入函数可写为:

fθ:X→Rd,z=fθ(x)

其中 x 是输入对象,θ 是编码模型参数,d 是向量维度,z 是输出的实数向量。模型训练的目的不是为每个坐标指定人类可读含义,而是使向量整体的几何关系有利于下游目标。例如一个 768 维向量中的“第 137 维”通常不能稳定解释为“法律相关性”,即使个别研究能够探测到可解释方向,也不能将全部维度视为独立语义标签。

需要区分四种常见层级:

层级对象典型作用注意事项
Token ID词表中的离散整数索引词表项ID 大小不表示语义距离
Token Embedding每个 Token 对应的可学习向量模型输入的连续表示不是直接可用于整篇文档检索的通用句向量
Contextual Token RepresentationTransformer 在上下文中计算的 Token 隐状态体现词语的上下文含义同一词在不同语境下可有不同表示
Sentence/Document Embedding对整段输入编码、汇聚、投影得到的向量语义搜索、聚类、相似度计算质量依赖专门训练目标、池化策略及任务匹配

大语言模型内部的 Token Embedding 与面向检索的文本 Embedding 并不是同一产品接口。一个生成式语言模型具备内部隐藏状态,并不意味着直接对隐藏状态做平均就能获得高质量语义检索向量。Sentence-BERT 等工作表明,为句对比较设计的训练目标与架构能够改善句向量的实用性。[3]

3.1 从文本到向量的计算流程 ​

一个典型双编码器(bi-encoder)文本嵌入管线可以表示为:

text
原始文本
   ↓ 文本预处理(按模型要求;保留重要标点、数字)
Tokenizer → token_ids / attention_mask
   ↓
Transformer Encoder(或其他编码架构)
   ↓
逐 Token 的上下文隐藏状态
   ↓ Pooling(CLS / mean pooling / 模型指定策略)
固定维度文本表示
   ↓ 可选投影、L2 归一化、维度缩减
Embedding 向量 → 相似度计算 / 向量索引

Pooling 的选择不能脱离模型训练方式。若模型要求 CLS 向量,擅自改用 mean pooling 可能破坏检索质量;反之亦然。注意 mean pooling 应按有效 Token 的 attention mask 计算,不能把 padding token 等权平均。模型还可能使用最后一个 Token、专门的投影头,或者针对长文档采用分块与聚合。

3.2 单向量、稀疏向量与多向量 ​

“Embedding”不是只能表示一个稠密向量。Dense embedding 通常用固定维度的浮点向量压缩整段语义;sparse representation 使用大量可能为零的词项或学习权重,保留更明确的词面线索;multi-vector representation 则为一个文档保留多个 token/片段向量,并在检索时执行更细粒度的匹配。BGE-M3 的论文和文档展示了稠密、稀疏和多向量检索功能可以在同一模型体系中结合。[4]

这三者的代价不同:单向量通常索引紧凑、召回快速,但容易丢失细节;稀疏表示擅长精确词项与罕见实体;多向量有更细的交互能力,却增加存储、索引和评分成本。后续 K4 将详细研究混合检索与重排序。

四、向量空间与相似度:到底在比较什么? ​

给定两个向量 a,b∈Rd,常见比较方式包括:

余弦相似度(Cosine Similarity):

cos(a,b)=a⋅b∥a∥2∥b∥2

它比较向量夹角,取值在 [−1,1](非零向量条件下)。余弦值越高,方向越接近;但“0.8”没有跨模型、跨领域通用的语义概率含义。

点积(Dot Product):

a⋅b=∑i=1daibi

点积同时受到方向和模长影响。如果向量经过 L2 归一化(∥a∥=∥b∥=1),点积与余弦相似度相等。Sentence Transformers 官方文档指出,对已归一化的嵌入,使用点积可以避免重复归一化。[1]

欧氏距离(Euclidean Distance):

∥a−b∥2=∑i(ai−bi)2

对于单位长度向量,有 ∥a−b∥22=2−2(a⋅b),因此余弦相似度、点积和欧氏距离在单位向量上的排序等价(同一查询、相同候选集合)。未归一化时,三者不一定给出相同排序。

不要把相似度分数解释成置信概率。 例如 cosine=0.84 只表示两个向量的方向关系;它不意味着“84% 概率为正确答案”。实际阈值应在特定模型、语料、任务、查询分布和负样本上标定,并持续监测漂移。

4.1 维度越高越好吗? ​

维度 d 影响表示容量、向量存储和搜索开销,但更高维度并不自动意味着更好的检索效果。模型训练质量、语言覆盖、任务分布、长文本处理、编码提示以及索引方法都可能比维度本身更重要。OpenAI 的嵌入文档提供了可指定输出维度的模型示例,说明在一定训练设计下可通过降维权衡成本与性能;但这种能力不能推广为“所有模型都可直接截断向量”。[5]

存储的理论原始成本为:

bytes=N×d×b

其中 N 是向量数,d 是维度,b 是每个分量的字节数。以 100 万条、768 维、float32 为例:106×768×4=3,072,000,000 字节,约 3.072 GB(十进制)或 2.861 GiB。该数字仅包含原始向量,不包含 ANN 索引、元数据、文本、数据库开销、副本或缓存。若采用 float16,原始向量体积理论上约减半,但精度、支持范围和性能应实际评测。

五、Embedding 模型如何学会“相似”? ​

Embedding 的语义几何不是人工逐项指定,而是由训练目标塑造。现代文本检索模型常采用对比学习:给定查询 q、相关文档 d+ 和负例 d−,优化相关对得分高于不相关对。

一种简化的 InfoNCE / softmax 对比损失形式为:

L=−log⁡exp⁡(s(q,d+)/τ)exp⁡(s(q,d+)/τ)+∑jexp⁡(s(q,dj−)/τ)

其中 s 是相似度函数,τ 是温度参数。实际训练可能采用批内负例、困难负例挖掘、蒸馏、对称损失、排序损失或多阶段训练。该公式是帮助理解的典型形式,并非所有 Embedding 模型统一采用的训练目标。

正例质量决定模型学到何种“相关”:在问答检索中,相关可能意味着文档能够回答问题;在相似句检索中,相关可能意味着两个句子表达相近意思;在商品推荐中,相关可能意味着行为上的共同兴趣。这些关系并不等价。因此,通用语义相似度模型不一定适合“短问题 → 长技术文档”的非对称检索任务。Sentence Transformers 官方资料特别区分 symmetric 与 asymmetric semantic search,并提供 encode_query、encode_document 接口。[2]

负例质量同样关键。随机负例通常容易区分,但与查询主题接近、答案却错误的困难负例,更能训练模型识别细粒度差异。另一方面,误把实际上相关的文档当作负例会损害训练。模型在公开基准上排名靠前,也不意味着对某企业内部缩写、专业术语或中英混合代码库表现最好。

5.1 为什么要区分 Query Encoder 与 Document Encoder? ​

在双编码器架构中,查询与文档分别编码,再计算向量相似度。二者可以共享参数,也可以使用不同参数或不同前缀/提示。例如某些模型要求为查询添加任务指令,为文档使用另一种编码路径;如果忽略模型指定格式,查询与文档虽然维度相同,也可能落入不匹配的表示分布。部署前必须阅读具体模型卡的编码约定。[2]

双编码器的优势是文档向量可提前离线计算,查询时只编码新问题;缺点是查询和文档之间的细粒度交互受压缩表示限制。Cross-encoder 在同一输入中联合处理查询与文档,通常用于较小候选集的精排,不适合像双编码器那样直接为全部文档独立预计算一个可检索向量。两者往往协同而非互斥。

六、Embedding 与 LLM、Tokenizer、向量数据库、RAG 的边界 ​

技术核心职责输入与输出本篇关注点
Tokenizer文本拆分为 token 标识文本 → token IDs影响长度、截断和编码输入
Embedding Model学习可比较的表示文本/对象 → 向量本篇核心
Vector Database存储、索引和查询向量及元数据向量 → 近邻候选K3 详述
Information Retrieval从语料中召回和排序相关内容查询 → 相关文档K4 详述
RAG将检索证据引入生成过程问题+检索结果 → 回答K5 详述
Knowledge Base管理知识来源、解析、索引、更新和权限多源内容 → 可维护知识资产K6 详述
LLM理解、生成、推理与综合上下文 → 模型输出不应与 Embedding 编码器混淆

一个常见误区是“把资料 Embedding 以后,模型就学会了这些知识”。实际上,生成嵌入通常不会修改生成式 LLM 的参数。向量是外部索引资产;只有在检索后把相关内容放入上下文,或通过工具将信息提供给 Agent,生成模型才有机会利用这些信息。另一个误区是“向量数据库自动理解文档”:数据库主要按给定向量与检索配置执行索引和近邻查询,语义结构首先来自编码模型及数据处理。

七、完整工程链路:从资料到语义检索 ​

以一个技术项目文档库为例,目标是让用户输入“哪个模块负责 Agent 失败重试”,系统能找到描述重试策略的设计说明。

text
资料采集(Markdown/PDF/网页)
  → 解析文本、保留来源及权限
  → 按语义/标题/段落切分,生成稳定 chunk_id
  → 使用固定版本 Embedding 模型编码文档
  → 保存 {chunk_id, vector, text, source, version, ACL}
  → 用户提问 → 规范化查询 → Query Embedding
  → 相似度召回(可结合关键词与权限过滤)
  → 候选去重/重排序
  → 返回原文片段和来源
  → (可选)进入 RAG 生成答案并附引用

这个流程有几个不能省略的工程契约。

第一,模型版本契约。 同一索引中的向量必须采用兼容的编码器、维度、预处理、查询/文档提示和归一化策略。模型升级通常需要新建索引并重新编码语料,通过双写或影子索引逐步切换,而不能把新旧向量混合后直接比较。

第二,文本切分契约。 一个长文档被编码成单向量时,关键细节可能被平均或压缩;切分太短又会丢失上下文。合理的做法是根据标题、段落、代码块、表格和问答单元切分,并保留 parent document 与 chunk 的关系。具体 chunk 大小需要通过目标任务评估,而非采用跨场景固定的“最佳 Token 数”。

第三,权限与证据契约。 文档权限应在检索候选可见性层面执行,不能仅在生成提示里要求模型“不泄露”。Embedding 向量及其索引也可能暴露敏感语义或成员信息,不应因为它们不是原文就视为匿名数据。输出结果必须能够追溯到原始文档、版本、页码或段落位置。

第四,更新契约。 当源文件改变时,需识别受影响的片段、重新生成向量、删除过期记录,并保证索引与文本的一致性。建议记录 source_id、chunk_id、content_hash、embedding_model_id、embedding_model_version、index_version 和更新时间。

八、可复现示例 A:不依赖模型 API 的向量数学与 Top-K 检索 ​

以下示例仅演示已有向量的相似度计算,不声称这些手写数值具有真实文本语义。它使用 Python 标准库,可离线执行。

python
from math import sqrt


def normalize(v):
    norm = sqrt(sum(x * x for x in v))
    if norm == 0:
        raise ValueError("zero vector cannot be normalized")
    return [x / norm for x in v]


def cosine(a, b):
    if len(a) != len(b):
        raise ValueError("dimension mismatch")
    a, b = normalize(a), normalize(b)
    return sum(x * y for x, y in zip(a, b))


# 仅为几何示意;不是真实模型的输出。
query = [1.0, 0.0, 0.0]
items = {
    "retry_policy": [0.9, 0.1, 0.0],
    "logging": [0.2, 0.9, 0.0],
    "deployment": [0.0, 0.1, 1.0],
}
ranked = sorted(items, key=lambda k: cosine(query, items[k]), reverse=True)
print([(key, round(cosine(query, items[key]), 4)) for key in ranked])
assert ranked == ["retry_policy", "logging", "deployment"]
assert abs(cosine([1, 2], [2, 4]) - 1) < 1e-12

这个例子可以验证“归一化—相似度—排序”的数学过程,但不能验证模型能否正确理解‘失败重试’。要测试语义质量,必须调用实际嵌入模型并在带标注的检索数据上评估。

九、可复现示例 B:用真实 Embedding 模型检索文档 ​

下面以 Sentence Transformers 的公开接口为例。该示例需要 Python 环境、安装依赖并首次下载模型文件;它展示真实的文本编码和排序,但本文没有在当前环境实际下载权重并运行,因此属于“依据官方接口编写、尚未实机验证”的工程示例。所用模型 sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2 仅作为易理解的多语言演示选择,不代表它是当前中文企业检索任务的最佳模型。

bash
python -m venv .venv
source .venv/bin/activate  # Windows 请使用对应激活命令
pip install sentence-transformers
python
from sentence_transformers import SentenceTransformer

model = SentenceTransformer(
    "sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2"
)

corpus = [
    "系统遇到临时 API 错误时,按退避策略进行有限次数重试。",
    "系统通过日志与 Trace ID 追踪各 Agent 的执行状态。",
    "服务部署前需要完成容器镜像构建和健康检查。",
]
query = "Agent 失败后如何自动重试?"

# 此演示模型使用通用 encode;针对检索专门训练的模型,
# 应遵循其文档使用 encode_query / encode_document 或指定前缀。
doc_vecs = model.encode(corpus, normalize_embeddings=True)
query_vec = model.encode([query], normalize_embeddings=True)[0]

# 已归一化:点积等于余弦相似度。
scores = doc_vecs @ query_vec
ranking = sorted(range(len(corpus)), key=lambda i: float(scores[i]), reverse=True)
for i in ranking:
    print(f"{scores[i]:.4f}  {corpus[i]}")

预期的合理结果是“错误重试”段落位于较高位置,但不承诺具体分数或排序,因为它们应由实际执行结果决定。真实系统还应添加超长输入处理、批处理、模型版本锁定、异常处理、缓存、超时、日志和权限过滤。若生产部署选择 BGE-M3、E5 等专用检索模型,必须使用其对应的查询指令与模型卡约定,不能直接照搬此示例的编码路径。

十、API 方式:Embedding 请求与版本契约 ​

云端 Embedding API 适合快速构建原型和免维护编码服务,但涉及调用费用、数据出境/合规、供应商限额和服务可用性。以下是以 OpenAI 官方 Embeddings API 为例的请求结构示意,模型标识与字段基于本次核对的官方文档;未实际发起带凭证的网络请求。[5]

python
from openai import OpenAI

client = OpenAI()  # 读取环境变量 OPENAI_API_KEY
response = client.embeddings.create(
    model="text-embedding-3-small",
    input=["Agent 如何管理任务状态?", "失败重试策略如何配置?"],
)
vectors = [item.embedding for item in response.data]
print(len(vectors), len(vectors[0]))

官方文档在本次核对时给出的默认维度为 text-embedding-3-small 的 1536 和 text-embedding-3-large 的 3072,并支持在特定模型上使用 dimensions 参数控制输出维度。[5] 这些属于供应商特定实现,不是 Embedding 的通用属性;价格、速率限制和 SDK 版本也可能变化,应在实际部署时再次核验。任何输入截断、批量请求、重试、速率限制、数据保存和错误处理都应通过统一的 Embedding Service 封装。

10.1 建议的 Embedding Service 接口 ​

text
embed_documents(texts, model_version, tenant_id) -> vectors + usage
embed_query(query, model_version, tenant_id) -> vector + usage
health() -> model / dimension / normalization / status

接口需强制验证:空输入、输入最大长度、维度一致性、NaN/Inf、零向量、模型版本、租户隔离、权限与日志脱敏。查询缓存键至少包含文本规范化结果、模型 ID、版本、编码类型(query/document)及编码指令;只按文本内容缓存可能造成跨版本错配。模型更新时优先采用“新索引构建 → 影子评测 → 灰度切换 → 旧索引回收”的迁移策略。

十一、如何选择 Embedding 模型? ​

选型不是“看一个榜单选第一名”,而是一个多约束决策:

维度需要核实的事项常见误区
任务匹配相似句、短查询到长文档、代码、问答、分类用相似句模型替代检索专用模型
语言与领域中文、英文、跨语言、行业术语、专业缩写多语言支持即每种语言表现一致
输入长度最大 token、截断行为、长文档效果能输入 8K token 就能准确记住所有细节
向量形式dense、sparse、multi-vector;输出维度维度越大质量一定越高
评分约定cosine/dot、归一化、query/document 提示不看模型卡随意更换评分函数
运行环境CPU/GPU、吞吐、批量、显存、API 费用只比较单条延迟,不考虑建库成本
数据与许可商用许可、数据传输、隐私、安全开放权重即无限制商用
运维版本、可复现性、索引迁移、监控模型升级后继续沿用旧向量

可参考的技术路线包括:通用句向量模型、面向问答检索的双编码器、多语言检索模型、同时支持 dense/sparse/multi-vector 的模型,以及托管 Embedding API。BGE-M3 论文展示了多语言、多功能、多粒度的研究方向,但它的具体表现仍需在实际中文语料和业务问题上验证。[4] 模型排行榜(例如 MTEB)可作为候选筛选工具,不能代替私有测试集上的召回率、排序指标和成本评估。

十二、如何评估 Embedding?从模型分数到任务结果 ​

首先建立测试集:为真实查询收集候选文档,并由领域人员标注相关等级(如完全相关、部分相关、不相关)。测试集应覆盖同义改写、缩写、否定、数字、时间、跨语言、罕见实体、无答案查询和权限边界;还应包含与答案主题相近但事实错误的困难负例。

检索层指标:Recall@K 关注相关文档是否进入前 K 名;MRR 衡量第一个相关结果的位置;nDCG@K 支持多等级相关性并考虑排序;Precision@K 衡量前 K 个结果的相关比例。评估时必须明确相关性标注口径、查询数量、K 值和统计区间。对于只有一个正确文档的测试集,Recall@K 容易理解;多相关文档时必须明确分母和覆盖目标。

系统层指标:编码延迟 P50/P95、索引构建速度、查询吞吐、CPU/GPU 使用、向量存储成本、失败率、缓存命中率,以及重建索引耗时。任务层指标:RAG 的证据覆盖率、回答忠实性、引用正确性和最终任务成功率。一个 Embedding 模型即使 Recall@10 较高,也可能因返回冗余或错误证据导致最终答案变差。

12.1 推荐的离线评估实验 ​

  1. 固定文档快照、查询集、标注和权限过滤条件。
  2. 设立 BM25 关键词检索作为基线,并选择两个以上 Embedding 候选。
  3. 固定分块策略、Top-K、索引类型和评分函数;分别比较向量模型。
  4. 再引入混合检索与重排序,测量增益,避免把不同组件效果混为一谈。
  5. 按中文/英文、短/长查询、实体密集度、文档新旧程度分组分析。
  6. 记录平均值、分位数与失败样例;必要时用 bootstrap 对查询级指标构建置信区间。
  7. 只有当质量、延迟、成本和治理要求同时满足,才批准生产切换。

阈值校准:对于“相似度低于 X 就拒绝回答”的设计,应使用带正负样本的验证集计算 Precision–Recall 曲线、误拒绝率与误接受率,按模型与语料版本分别校准。不存在一个跨模型通用的 cosine > 0.8 正确性阈值。

十三、常见失败模式与排查路径 ​

查不到本来存在的内容:先检查文档是否解析成功、是否被截断、分块是否遗漏、权限过滤是否误排除,再检查查询/文档编码方式和模型适配性。不要第一时间归因于向量数据库。

相似结果很多但不回答问题:Embedding 可能只捕捉主题相似,没有区分“能回答问题”与“提到同一主题”。需要使用问答检索训练模型、困难负例、重排序或证据判定。

升级模型后检索突然变差:核对向量维度、模型版本、归一化策略、查询提示、文档索引是否完整重建。即使维度相同,不同模型的向量空间也不应直接混用。

长文档命中主题却遗漏关键细节:检查 chunk 粒度、父子文档映射、表格解析、章节标题是否保留,考虑多粒度检索、窗口扩展或精排。

中文专业术语与英文缩写召回差:建立领域测试集,尝试混合检索、术语同义词表、查询扩展或领域适配,而非仅盲目提高维度。

线上检索结果泄露其他租户内容:权限过滤必须在检索候选与结果访问阶段强制执行,检查索引分区、元数据 ACL、缓存隔离及日志。模型提示词不是访问控制机制。

索引成本超预算:估算原始向量、索引结构、副本、文本与元数据的总成本;考虑维度、量化、分层存储和索引方案,并在质量回归后再优化。不能把原始向量字节数误当数据库总成本。

十四、Embedding 在 Agent 技术体系中的位置 ​

对单个 Agent 而言,Embedding 不是“思考模块”,而是一种支持外部信息发现的基础表示能力。Agent 可以在需要事实、规范或历史资料时调用检索工具;工具使用 Embedding Service 将查询向量化,再从知识索引中找出候选片段,并将原文及来源返回给 Agent。是否检索、检索几次、如何处理证据冲突,属于 Agent 的规划与执行逻辑,而非 Embedding 模型本身。

在 Agent System 中,Embedding Service 更适合设计成可共享的基础能力:统一模型注册、编码版本、缓存、限额、鉴权、计费和监控。知识库服务负责文档摄取、权限、索引与生命周期;检索服务负责多路召回和排序;Agent Runtime 负责工具调用和上下文装配。这种职责划分有利于多个 Agent 共享基础设施,同时避免每个 Agent 重复实现文档向量化逻辑。

需要明确三条边界:Embedding 不是长期记忆本身(记忆还涉及写入选择、时间、更新和遗忘);Embedding 不是事实校验器(检索结果需核对原始证据);Embedding 不是完整的 RAG(RAG 还涉及查询规划、检索、上下文构建、生成和评估)。

十五、工程实施路线:从原型到生产 ​

阶段一:验证可用性。 选取约几十到几百条代表性文档与真实问题,运行一个本地或 API Embedding 模型,先用穷举余弦相似度实现 Top-K。目标是验证数据解析、编码、排序和基础检索质量;此时通常不必引入复杂向量数据库。

阶段二:建立可比较基线。 增加关键词检索、不同 Embedding 模型、困难负例和 Recall@K/MRR/nDCG 等评估。为每条查询保留失败样例和来源信息。明确最低质量与延迟预算。

阶段三:服务化与索引化。 封装统一 Embedding Service,增加模型版本、批处理、缓存、队列、速率限制与错误处理;根据语料规模和更新频率选择向量索引或数据库,实施增量更新和权限过滤。

阶段四:接入 Agent/RAG。 将检索封装为有输入输出契约的工具,返回原文、位置、来源、权限和检索得分;在生成阶段执行证据引用与无答案处理。评估端到端回答质量,而不是仅评估向量距离。

阶段五:持续治理。 建立模型升级与索引迁移流程,监控查询分布漂移、召回质量、编码费用、数据更新滞后与权限异常,定期回归测试。

十六、容易混淆的判断题 ​

  1. “Embedding 向量中的每个数字对应一个明确语义。” 通常错误;意义主要来自整体表示及训练目标。
  2. “余弦相似度 0.9 表示答案有 90% 概率正确。” 错误;它不是概率校准结果。
  3. “使用同维度的两个模型可以直接混合向量。” 通常错误;维度相同不代表坐标系兼容。
  4. “Embedding 可以取代关键词检索。” 不普遍成立;精确实体、代码符号、数字和否定常需要混合策略。
  5. “向量化后 LLM 就永久记住文档。” 错误;通常只是在外部保存表示,未修改生成模型权重。
  6. “向量库是实现语义搜索的唯一方法。” 错误;小规模数据可直接遍历向量,规模增大后再考虑索引。
  7. “Embedding 维度越高,检索越准确。” 不必然成立;需结合模型训练、任务与评估。
  8. “检索分数最高的段落必然能回答问题。” 错误;相关性、可回答性与事实正确性不同。

十七、研究总结与下一篇衔接 ​

Embedding 的本质是学习一种便于计算相似性或相关性的连续表示。它把复杂文本映射为向量,使外部知识能够参与高效检索,但不保证事实正确,也不负责生成最终答案。要在工程中可靠使用 Embedding,必须同时理解表示层级、训练目标、相似度数学、查询/文档编码契约、索引版本、数据权限和离线评估。

与 K1 的衔接:K1 讨论模型训练后形成的参数知识;K2 则研究如何对模型外部的内容建立可计算的表示。与 K3 的衔接:当向量数量、更新频率和查询并发增长时,需要进一步研究如何存储、索引和查询向量,以及 ANN 检索的质量—性能权衡。与 K4—K7 的衔接:Embedding 是语义检索的一个组件,最终要通过检索策略、RAG 管线、知识库治理和端到端评估才能成为可靠的 AI 知识能力。

十八、资料来源与核验范围 ​

以下以官方技术文档与原始研究为主;链接于 2026 年 10 月 27 日检索。经典论文用于解释长期稳定的机制,现行官方文档用于确认接口、编码约定与模型能力。本篇未穷尽 2025—2026 年所有新模型与排行榜,也未执行真实 GPU/API 性能测试。

[1] Sentence Transformers, Semantic Textual Similarity. 官方文档,解释 cosine、dot product、欧氏距离及归一化关系。https://sbert.net/docs/sentence_transformer/usage/semantic_textual_similarity.html

[2] Sentence Transformers, Semantic Search. 官方文档,解释 symmetric/asymmetric search、encode_query、encode_document 与向量检索示例。https://www.sbert.net/examples/sentence_transformer/applications/semantic-search/README.html

[3] Reimers, N., & Gurevych, I. (2019). Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks. EMNLP-IJCNLP. https://aclanthology.org/D19-1410/

[4] Chen, J., et al. (2024). M3-Embedding: Multi-Linguality, Multi-Functionality, Multi-Granularity Text Embeddings Through Self-Knowledge Distillation. Findings of ACL 2024. https://aclanthology.org/2024.findings-acl.137/ ;BGE-M3 官方模型文档:https://bge-model.com/bge/bge_m3.html

[5] OpenAI, Vector embeddings. 官方 API 文档,说明 Embedding 用途、模型输出维度、dimensions 参数和归一化。https://developers.openai.com/api/docs/guides/embeddings

[6] Karpukhin, V., et al. (2020). Dense Passage Retrieval for Open-Domain Question Answering. EMNLP. https://aclanthology.org/2020.emnlp-main.550/

[7] Muennighoff, N., et al. (2023). MTEB: Massive Text Embedding Benchmark. EACL. https://aclanthology.org/2023.eacl-main.148/

[8] Khattab, O., & Zaharia, M. (2020). ColBERT: Efficient and Effective Passage Search via Contextualized Late Interaction over BERT. SIGIR. https://arxiv.org/abs/2004.12832

验证状态与后续工作 ​

  • 资料核验:已检索并核对 Sentence Transformers 官方相似度/语义检索文档、OpenAI Embeddings 官方文档及 BGE-M3 原始论文和项目文档。部分经典论文以原始出处列示,未逐页重新核读全部实验细节。
  • 代码验证:示例 A 为可离线运行的标准库数学演示;示例 B 与云 API 示例属于基于官方接口的示意实现,未下载权重、未发起 API 调用,未进行线上基准测试。
  • 研究局限:没有在真实企业中文语料上进行召回率、排序、吞吐与成本对比;具体模型选型和生产阈值须经项目实测确定。
  • 建议补充实验:在中文技术文档数据集上对比 BM25、两种 Embedding 模型及混合检索;测试模型升级前后的索引兼容、权限过滤和无答案查询。

研究与验证说明:本文以能够查阅的官方技术文档、原始研究和既有研究稿为基础。文中数学示例为可离线运行的教学演示;涉及 Sentence Transformers / 云 API 的代码为基于官方接口的示意实现,未下载模型权重、未发起真实 API 调用,也未进行线上基准或生产负载测试。具体模型选型、阈值与索引方案须经项目实测确定;部署前须再次核对对应版本与编码约定。