F28|检索入门:目录、倒排索引、向量与近似搜索
从具体对象与小例子开始,理解计算过程与适用条件。
本章目录
检索先找候选,再判断能否回答
倒排索引和向量索引分别在帮什么忙?
倒排像书后索引:从一个词跳到包含它的页面。向量检索则尝试把表达相近的内容放得接近,帮助不知道精确名称时找候选。二者都不负责自动确认权限、版本和事实正确性,仍要读取与核对证据。
输入与适用条件:三个文档为本书构造;倒排关系可精确核验,语义搜索只作流程说明,不编造向量服务实测分数。
1 / 4 · 先有原文,不是先有向量
窄屏可左右滑动图形,或点击“放大图形”。文字解释紧随图后。
三份短文档都有自己的标识。索引是为查询服务的辅助结构,原文和版本仍应保留。
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(内容片段)。切得太小可能丢掉条件与例外;太大可能引入很多无关内容。标题、表头、适用日期和代码作用域都可能需要跟随片段。
若一条旧规定未删除或标失效,再好的检索也可能把它准确地找出来。若越权内容已经交给模型,再在最后隐藏引用,泄露仍可能发生。索引结构、权限与版本共同决定什么候选可以被使用。
三份文档怎样变成一个倒排索引
输入与条件。教学文档A=排除 路径,B=排除 排除 路径 缓存,C=日志 输出。用空格分词,已经明确每个词项。
| 步骤与对象 | 内部动作 | 中间结果 / 新状态 |
|---|---|---|
| 1逐文档扫描 | 记录词项出现在哪份文档 | 排除→A、B;路径→A、B;缓存→B;日志→C;输出→C。 |
| 2保留词频 | “排除”在A为1,在B为2 | 倒排表也可以记录位置和次数。 |
| 3提交查询 | 查询“排除” | 直接定位A、B,不必把C当相关候选。 |
| 4计算区分度 | 总文档3,含词文档2 | BM25示例IDF为 ln(1+1.5/2.5)≈0.470004。 |
| 5长度修正 | A长2,B长4,平均8/3 | B出现两次并不意味着得分正好两倍。 |
把过程连起来。索引是为了从词快速回到文档。向量搜索是另一种找候选的方法,不会自动取代精确词和版本条件。
边界与反例。空格分词仅用于明确可计算性;不把它称为生产中文分词器。
依据与适用范围:[BM25]。示例输入和场景由本书明确设定。
课后自检
倒排索引和词表是同一个东西吗?
查看参考答案收起参考答案
向量余弦很高,是否可直接确认两句话的结论一致?
查看参考答案收起参考答案
延伸阅读:相关系统问题
15|检索离线链路:文档怎样变成可查询索引16|检索在线链路:召回、融合、重排与证据充足性
17|代码智能:从文本搜索到符号、版本与运行证据
18|长期记忆:写入、检索、冲突、失效与遗忘
23|Evaluation:怎样证明一次优化真有收益
机制依据:[BM25][DPR][HNSW][F-IR]。本节数值与情景除另注外均为原创教学示例;来源不代替中文讲解。