基础篇

F28|检索入门:目录、倒排索引、向量与近似搜索

基础篇约 2.6 千字1 组分步图解

从具体对象与小例子开始,理解计算过程与适用条件。

本章目录
动态图解 · F28

检索先找候选,再判断能否回答

倒排索引和向量索引分别在帮什么忙?

倒排像书后索引:从一个词跳到包含它的页面。向量检索则尝试把表达相近的内容放得接近,帮助不知道精确名称时找候选。二者都不负责自动确认权限、版本和事实正确性,仍要读取与核对证据。

索引为快速找候选而建立的数据结构。
召回从大集合中找出可能相关的候选。
近似搜索以少检查部分候选换速度,可能漏掉真实近邻。

输入与适用条件:三个文档为本书构造;倒排关系可精确核验,语义搜索只作流程说明,不编造向量服务实测分数。

1 / 4 · 先有原文,不是先有向量

第1步,共4步

窄屏可左右滑动图形,或点击“放大图形”。文字解释紧随图后。

检索先找候选,再判断能否回答:先有原文,不是先有向量A部署 使用 DockerB测试 使用 pytestCDocker 镜像 构建

三份短文档都有自己的标识。索引是为查询服务的辅助结构,原文和版本仍应保留。

A/B/C是文档ID

默认静止。用“下一步”看完解释再继续;播放到最后一步自动停止。键盘聚焦播放器后,可用左右键逐步查看、空格播放/暂停。图中颜色辅助区分,含义同时用文字注明。

为什么需要

避免每次全库扫描,但保持原文可追溯。

怎样实现

按合适粒度建索引,保持文档ID、内容、版本和权限关联。

可能的代价与误解

切块丢标题条件、索引未更新、相似度与权限混用都会出错。

如何判断是否做对

用已知相关文档检查召回,并单独测试版本更新和撤权后的可见性。

检索先解决“从哪里找到候选”

检索retrieval是从一堆材料中找到可能与问题有关的条目。索引index是为此预先建立的组织结构,类似书末的词语索引,但可以包含位置、统计量和权限等信息。

离线建库指在查询前准备材料和索引,不意味着机器必须断网;在线查询指用户问题到来时执行的检索,也不等于一定上公网。

倒排索引为什么叫“倒排”

原始组织是“文档→包含哪些词”。倒排组织变成“词→出现在哪些文档”。例如:

D1:目录 排除 规则
D2:文件 路径 规则
D3:目录 权限 检查

目录 -> D1,D3
排除 -> D1
规则 -> D1,D2

查“目录 排除”可以先访问这些词对应的文档列表,而不每次从头读完所有文档。精确错误码、函数名和配置键,常适合这样的词项匹配。

TF、IDF与BM25先认识职责

TF(词频)描述某个词在一篇文档出现多少次。DF(文档频率)描述多少篇文档含这个词;IDF(逆文档频率)通常让罕见、区分度更高的词占更大权重。

若每篇都写“说明”,这个词不太能区分目标;只有少数文档写某个错误码,错误码更有定位价值。

BM25把词频、稀有程度和文档长度等组合成排序分数。词频收益常有饱和:出现10次不一定是出现1次价值的10倍;较长文档也要考虑长度影响。完整公式在高级Q058逐项展开。

排序分数不是概率。BM25得到8.2不代表82%正确,也不能保证不同查询的分数可直接比较。

向量检索为什么能找同义表达

一个检索模型把问题或文档变成一排数字,希望相关内容在向量空间中更接近。这样查询“程序崩溃”和写着“进程异常退出”的文档即使词不同,也有机会匹配。

最常见的比较之一是余弦相似度:点积除以两向量长度的乘积。长度是各分量平方求和后开方,即范数。若x=[1,0]、y=[2,0],余弦为1;若y=[0,1],余弦为0。零向量时需特殊处理,不能直接除零。

这比较的是表示方向,不是自动判定事实逻辑。“允许访问”和“不允许访问”可能话题很接近,但结论相反。

精确最近邻与近似最近邻

最近邻是按所选距离或相似度排名靠前的向量。逐个比较全部N条记录可得到精确结果,但规模很大时成本较高。

ANN(近似最近邻)用额外结构减少搜索范围,牺牲一定召回以换速度。HNSW通过分层近邻图导航:先在较稀疏层跳到接近区域,再在较细层扩大候选。具体过程高级章节展开。

近似算法的“召回率”是相对于精确邻居是否找全,不是答案是否真实正确;这些是两层不同的评估。

分块、清洗和版本为什么先于排名

长文档通常切成chunk(内容片段)。切得太小可能丢掉条件与例外;太大可能引入很多无关内容。标题、表头、适用日期和代码作用域都可能需要跟随片段。

若一条旧规定未删除或标失效,再好的检索也可能把它准确地找出来。若越权内容已经交给模型,再在最后隐藏引用,泄露仍可能发生。索引结构、权限与版本共同决定什么候选可以被使用。

运行示例 · F28

三份文档怎样变成一个倒排索引

输入与条件。教学文档A=排除 路径,B=排除 排除 路径 缓存,C=日志 输出。用空格分词,已经明确每个词项。

步骤与对象内部动作中间结果 / 新状态
1逐文档扫描记录词项出现在哪份文档排除→A、B;路径→A、B;缓存→B;日志→C;输出→C。
2保留词频“排除”在A为1,在B为2倒排表也可以记录位置和次数。
3提交查询查询“排除”直接定位A、B,不必把C当相关候选。
4计算区分度总文档3,含词文档2BM25示例IDF为 ln(1+1.5/2.5)≈0.470004。
5长度修正A长2,B长4,平均8/3B出现两次并不意味着得分正好两倍。

把过程连起来。索引是为了从词快速回到文档。向量搜索是另一种找候选的方法,不会自动取代精确词和版本条件。

边界与反例。空格分词仅用于明确可计算性;不把它称为生产中文分词器。

依据与适用范围:[BM25]。示例输入和场景由本书明确设定。

课后自检

自检 1

倒排索引和词表是同一个东西吗?

查看参考答案收起参考答案
不是。词表把Token映射到编号;倒排索引把词项映射到包含它的文档或位置,服务不同目的。
自检 2

向量余弦很高,是否可直接确认两句话的结论一致?

查看参考答案收起参考答案
不能。语义或话题接近可能掩盖否定、日期和适用条件差异,要读取原文核验。

机制依据:[BM25][DPR][HNSW][F-IR]。本节数值与情景除另注外均为原创教学示例;来源不代替中文讲解。

记录保存在本机浏览器。

输入关键词即可检索。

↑ ↓ 选择 Enter 打开Esc 关闭 · 仅本地搜索

阅读设置

阅读设置仅保存在本机浏览器,不上传任何数据。