Embedding 与向量检索底层图谱
解释“语义向量到底是什么、为什么能检索、为什么会检错”,补上底层理解线与 RAG 工程之间的机制桥
原始文档
PDF / Wiki / DB
→
解析与切分
Parse / Chunk
→
Embedding
编码成向量
→
索引
ANN / BM25
→
召回与重排
Retrieve / Rerank
→
上下文证据
Answer / Citation
| 环节 | 核心问题 | 底层直觉 | 常见风险 |
| 解析 | 原文结构能否被保留下来 | 标题、表格、列表、页码和权限都是检索信号 | 表格断裂、层级丢失、旧版本混入 |
| Chunking | 什么才是最小可检索单元 | chunk 太大不聚焦,太小会断上下文 | 证据被切碎,引用无法闭环 |
| Embedding | 文本如何变成可比较的坐标 | 相似文本在向量空间里距离更近 | 相似不等于正确,语义近邻可能答非所问 |
| 索引 | 如何在海量向量里快速找近邻 | 用近似搜索换速度和规模 | 近似误差、内存压力、过滤条件失效 |
| Rerank | 如何从“像”里选出“更该用” | 召回追求覆盖,重排追求排序质量 | 只召回不重排,模型拿到低质量上下文 |
| 类型 | 在哪里出现 | 输入 / 输出 | 解决什么问题 | 容易误解的点 |
| Token Embedding |
Transformer 模型内部 |
token id → 模型隐藏向量 |
让离散 token 进入神经网络计算,前提是 tokenizer 已经把文本映射成 token id |
它不是完整句意,只是上下文计算的起点 |
| Sentence / Document Embedding |
语义搜索、聚类、推荐、去重 |
句子 / 段落 / 文档 → 固定长度向量 |
让不同文本可以按语义相似度比较 |
压缩后的向量会丢细节,尤其是数字、否定和条件 |
| RAG Embedding |
知识库索引与查询召回 |
query 和 chunk → 同一向量空间 |
把用户问题和候选证据放到同一坐标系里匹配 |
召回到相关段落不代表答案已经成立 |
一句话区分
Token embedding 是模型“读入 token”的内部表示,依赖 Tokenizer / 词表 给出的 token id;sentence / document embedding 是把一段文本压缩成可比较的语义坐标;RAG embedding 是把 query 和知识块放到同一个检索空间里做召回。
向量空间
文本被编码成高维坐标后,系统不再直接比较字面内容,而是比较坐标关系。语义、风格、主题、实体和任务意图会被压缩进这些维度的组合里。
余弦相似度
更关心两个向量“方向是否一致”。常用于文本语义匹配,因为它弱化了向量长度差异,直觉上像是在问“这两段话指向的主题像不像”。
内积
同时受方向和长度影响。很多向量库会把向量归一化后用内积近似余弦,也有系统会让向量长度携带置信或强度信息。
相似度不是“正确性打分”
cosine(query, chunk) 高,只说明两段文本在 embedding 模型学到的空间里接近;它不保证 chunk 包含答案、不保证答案时效正确,也不保证能支撑用户问题里的全部约束。
| 策略 | 适合什么 | 优点 | 风险 |
| 固定长度切分 | 快速原型、格式较统一的文档 | 简单、稳定、容易批处理 | 标题和表格容易被切断 |
| 按标题 / 结构切分 | 产品文档、制度、技术手册 | 语义完整,引用更自然 | 依赖解析质量,结构混乱时效果不稳 |
| 滑动窗口 | 需要保留邻近上下文的长文 | 减少边界处信息丢失 | 索引膨胀,重复召回更多 |
| Parent-Child | 问答、复杂文档、长章节 | 用小块召回,用大块提供上下文 | 实现复杂,需要维护父子关系 |
| 语义切分 | 段落主题变化明显的材料 | 更贴近语义单元 | 成本更高,容易受模型和阈值影响 |
切得太大
- 一个向量被多个主题污染
- 召回看似相关,但答案位置很稀薄
- 上下文预算被无关内容占用
切得太碎
- 定义、条件、例外和结论被拆开
- 模型看到片段却看不到完整证据链
- 引用粒度细,但忠实回答更难
好的 chunk
- 能独立表达一个可核对事实或段落主题
- 带有标题路径、来源、时间和权限元数据
- 既能被召回,也能被引用和审计
| 方法 | 匹配依据 | 强项 | 弱点 | 适合场景 |
| BM25 | 词项匹配、词频、逆文档频率 | 精确词、编号、错误码、专有名词,可解释 | 同义表达和自然语言改写能力弱 | 制度编号、SKU、API 名、异常码、标题搜索 |
| 向量检索 | embedding 空间里的近邻 | 同义表达、语义相似、长文本问题 | 容易误召回“像但不对”的内容 | 自然语言问答、知识库语义搜索、相似案例 |
| 混合检索 | 关键词 + 向量 + 过滤 + 业务规则 | 兼顾精确召回和语义召回 | 融合权重、去重和排序策略更复杂 | 生产级 RAG、企业知识平台、复杂搜索 |
| Rerank | query 与候选 chunk 的深度相关性判断 | 从候选里重新排优先级,提升 Top-K 质量 | 增加延迟和成本,仍需评测校准 | 召回多但排序不稳、引用质量要求高的场景 |
召回和重排是两个目标
第一阶段检索更像“尽量别漏掉可能相关的材料”,第二阶段 rerank 更像“把最可能回答问题的证据排到前面”。只优化召回数量,可能让 LLM 拿到更多噪声;只追求排序精度,又可能漏掉关键证据。
全量精确搜索
准但慢
→
近似近邻
ANN
→
索引结构
HNSW / IVF / PQ
→
候选召回
Top-K
→
过滤 / 重排
Metadata / Rerank
| 工程变量 | 它影响什么 | 直觉 | 典型取舍 |
| Recall | 关键证据是否被找回来 | 索引越激进越快,但可能漏近邻 | 召回率 vs 延迟 |
| Latency | 用户等待时间和系统吞吐 | 向量维度、索引参数、过滤条件都会影响查询速度 | P95 延迟 vs 检索质量 |
| Memory | 索引成本和扩展能力 | 高维向量、重复 chunk、HNSW 图结构都吃内存 | 内存成本 vs 查询性能 |
| Approximation Error | 近似搜索带来的漏召回 | ANN 是用“足够接近”换“足够快” | 索引参数越保守,越准但越慢 |
| Metadata Filter | 权限、时间、业务域过滤 | 先过滤还是后过滤会改变结果质量和性能 | 安全边界 vs 搜索空间 |
实践提醒: 向量库不是一个“存进去就会搜准”的黑盒。索引参数、向量模型、chunk 粒度、过滤顺序、Top-K、rerank 深度,都会共同决定最终答案质量。
问题约束被忽略
query 问的是“2026 年企业版退款规则”,召回结果可能是“个人版退款说明”。主题相似,但版本、对象和时间不对。
否定和例外被压缩掉
Embedding 可能把“可以申请退款”和“除非超过 30 天否则可以退款”放得很近,但业务判断恰恰取决于条件和例外。
相似案例不是同一事实
客户 A 的历史工单与客户 B 的问题很像,但合同条款、权限、地区和版本可能不同,不能直接套用。
召回证据不完整
模型拿到一个相关段落,却缺少前置定义、适用范围或后续例外,生成时就可能把局部事实说成全局结论。
更可靠的判断链
生产 RAG 不是只问“检索结果像不像”,而要继续问:它是否覆盖问题约束、是否来自可信来源、是否在有效期内、是否有足够上下文、最终回答是否忠实引用。
| 指标 | 看什么 | 怎么理解 | 适合发现的问题 |
| Recall@K | 前 K 个结果是否包含正确证据 | 关键材料有没有被捞上来 | 漏召回、chunk 太碎、索引参数过激 |
| MRR | 第一个正确结果排在多靠前 | 用户和下游模型能不能尽快看到关键证据 | 排序差、Top-1 不稳 |
| NDCG | 多个结果的相关性排序质量 | 越重要的证据越应该靠前 | 多证据问题、排序质量波动 |
| Faithfulness | 答案是否忠实于给定证据 | 模型有没有基于上下文回答,而不是自己补全 | 幻觉、过度推断、断章取义 |
| 引用正确性 | 引用是否真的支撑回答 | 链接、页码、段落和结论是否能互相核对 | 引用错位、来源过期、证据不充分 |
最小评测闭环: 准备一批真实问题和标准证据,记录 query、召回列表、rerank 排序、最终上下文、模型回答和引用来源;每次改 chunk、embedding、索引、Top-K 或 prompt,都跑回归。
| 证据节点 | 必须记录的字段 | 用来排查什么 |
| 查询向量 | query_id、query_text_hash、embedding_model、embedding_version、vector_norm | 同一问题为什么召回漂移,是否由模型升级、归一化或改写造成? |
| 语料向量 | doc_id、chunk_id、chunk_version、chunk_tokens、index_build_id | 正确材料是否已经入库,chunk 是否过期、过碎或缺少上下文? |
| 检索配置 | index_type、distance_metric、top_k、filter_policy、hybrid_weight | 漏召回来自索引参数、权限过滤、BM25 / 向量权重还是 Top-K 太小? |
| 重排与过滤 | reranker_version、rerank_score、acl_snapshot、dedupe_reason | 关键证据是否被 rerank、权限或去重规则压掉? |
| 回答连接 | retrieval_snapshot_id、context_pack_id、citation_ids、faithfulness_result | 召回到的材料是否真的进入上下文,并支撑最终回答? |
误区:Embedding 越新越好
模型升级可能改变向量空间,历史索引需要重建,评测也要重新跑。真正关键是领域适配、稳定性和回归表现。
误区:向量检索可以替代关键词
编号、术语、错误码、日期和人名常常需要精确匹配。生产系统通常更适合混合检索。
误区:Top-K 调大就会更准
Top-K 变大可能提高召回,也可能把噪声塞进上下文。没有 rerank、压缩和证据选择,更多不一定更好。
误区:检索到了就等于回答对了
LLM 还可能误读、混合多段证据、忽略限定条件或生成不存在的推论。检索评测和生成评测必须分开看。
这张图在主线里的位置
如果说 Token / Attention 解释模型如何在上下文内部计算,
那么这一页解释外部知识如何被压缩成可检索坐标;再往后,RAG 负责把检索、重排、引用和生成组织成可治理系统。