检索增强深拆:嵌入、索引、重排与知识仲裁

上篇收束时留了一条线:参数是训练时凝固的知识,上下文是现场提供的知识。检索增强(RAG)把后者工程化------知识从"重新训练才能更新"的参数,搬到"改一条记录就能更新"的外部系统。但这条路引入了一个新的失败面:检索错了,生成再强也是把不相干的内容忠实总结给你。RAG 系统的真实水平由链条最弱的一环决定,而这一环几乎总在检索侧。本文拆五节:嵌入怎么训、分块的物理、ANN 索引的工程、重排与混合检索、知识冲突的仲裁------最后把第 7 篇欠的"长上下文 vs RAG 边界经济学"算清。

一、嵌入:检索的坐标系

双塔结构与第 10 篇的 CLIP 完全同构------只不过对比的两侧从"图-文"换成了"query-文档":

python 复制代码
def embed_loss(q, d_pos, d_hard, temp=0.02):
    sim = lambda a, b: a @ b.T / temp
    neg = torch.cat([d_hard, shuffle(d_pos)])        # 硬负例 + 批内负例
    logits = torch.cat([sim(q, d_pos), sim(q, neg)], 1)
    labels = torch.zeros(len(q), dtype=torch.long)   # 第 0 列为正例
    return F.cross_entropy(logits, labels)

训练的成败在负例:随机负例太容易(模型学会的只是主题分类),硬负例------BM25 召回的词汇重叠项、LLM 合成的迷惑项------才逼出细粒度判别力。推理时 query 与文档独立编码,余弦相似度即相关性,亿级文档可以预计算离线入库------这就是双塔的经济学:检索精度换可扩展性。

工程细节三件:非对称性 (query 短、文档长,指令化嵌入用前缀声明任务来对齐两塔);Matryoshka 表示 (训练时让向量前缀截断仍可用,1536 维可砍到 256 维,精度换内存与缓存);域漂移(通用嵌入在垂直域常失效------法律条文、医疗术语的"语义距离"与通用语料不同,微调嵌入往往是 RAG 项目里性价比最高的一步)。

二、分块的物理

分块是信息瓶颈问题:嵌入把一段文本压成单个向量,块越大,单向量要概括的语义越多,稀释越重;块越小,检索命中后上下文越残缺。这不是超参数玄学,是压缩率的物理。三条出路:

结构感知 :按 markdown 标题、代码 AST 切,让块的边界与语义边界对齐。上下文注入 :Anthropic 的 contextual retrieval 给每块前置一段 LLM 生成的文档语境摘要------块"知道自己属于谁",实验报告 top-20 检索失败率从 5.7% 降到 2.9%,叠加重排再到 1.9%。Late chunking :反过来,先编码整篇文档再按块池化,让每个块的向量自带全文语境(代价是必须整篇编码)。共同思想:块向量应该携带"它在哪里"的信息,而不只是"它是什么"。

三、ANN 索引:HNSW 与量化的三角

暴力检索在规模上死掉:千万级文档 × 1536 维 float 是 60GB 内存和逐条点积的延迟。近似最近邻(ANN)的核心交易:放弃小概率的正确答案,换数量级的速度。

HNSW 是当前主流:多层稀疏图,上层长边粗跳、下层短边细找,查询时贪心下探------

python 复制代码
def hnsw_search(q, index, ef=64):
    node = index.entry                     # 从顶层入口贪心下降
    for layer in reversed(index.layers):
        node = greedy_descend(q, node, layer)
    # 底层放宽候选队列: 精度-延迟的主旋钮就是 ef
    return beam_search(q, node, index.layer0, width=ef)

参数 MMM(图的度)定内存与建图质量,efsearchef_{search}efsearch 运行时调精度-延迟曲线------把 ef 从 64 拉到 256,召回率涨几个点,QPS 跌一半。内存侧用 IVF/PQ 量化把向量压 16~32 倍,代价又是召回:工程惯例是"量化索引 + 过采样候选 + 精确重排"级联,每层用便宜的误差换贵的精度。这是第 6 篇 MoE 之后第二个"精度-内存-带宽不可能三角",解法也同款:分层近似。

四、重排与混合:最后一公里

双塔为了可扩展性牺牲了交互------query 与文档从未"见过面"。重排器是 cross-encoder:query 和文档拼进同一个序列做满注意力,精度高一截,但每对都要一次前向------所以只对 ANN 召回的 top-100 做精排,最终取 top-10 进上下文。两级结构是信息检索三十年不变的骨架(召回→精排),LLM 只是换了两个部件的内核。

单路向量检索有系统性盲区:型号、代码标识符、罕见专名------这些词汇精确匹配是嵌入的弱项、BM25 的强项。混合检索用 RRF 融合两路排名:

python 复制代码
def rrf(rankings, k=60):                   # 不比分数, 只比名次: 免归一化
    scores = defaultdict(float)
    for ranking in rankings:               # [bm25_ranks, dense_ranks, ...]
        for rank, doc in enumerate(ranking):
            scores[doc] += 1 / (k + rank)
    return sorted(scores, key=scores.get, reverse=True)

名次倒数相加的朴素公式,免去了分数尺度归一化的全部麻烦。更激进的查询侧改造:HyDE 让模型先写一篇"假设性答案文档"再拿去检索(答案与文档的语义距离比问题与文档更近);多查询分解处理一题多义的 query;意图路由判断该走向量、SQL 还是图。查询理解的收益通常大于索引侧调参------失败的大多数 RAG,是问法和存法根本不在一个语义空间里。

五、知识层:结构与仲裁

平面检索的天花板在"全局问题":问"这批报告的共同主题是什么",没有单块能回答。GraphRAG 的方案是先花重金建知识索引------实体关系抽取、社区聚类、逐层摘要------查询时在摘要层回答全局问题、在实体层做局部溯源。代价直白:建库成本线性于语料且需重跑更新,适合"读多写少"的企业语料。

另一端的进化是把检索本身变成工具(第 9 篇的 JIT 路线):Agent 自己决定搜什么、搜几轮、何时停------检索从管线固定段变成循环里的可组合动作,多跳问题("A 的作者引用过谁")从"祈祷一次检索命中"变成"拆成两次查询"。

最后是冲突仲裁,第 7 篇欠的另一半:上下文信源 vs 参数记忆冲突时,现代模型多数偏向信源(第 7 篇已拆);信源间冲突是新问题------时间戳、权威权重、多数投票是三种工程解,共同前提是检索结果必须携带元数据。没有时间戳的检索系统,在"知识会过时"的真实世界里是裸奔的。

六、评测与边界经济学

RAG 的评测必须拆开链条:检索侧看 context precision/recall(该召回的召回没、召回的准不准),生成侧看 faithfulness(答案是否忠于上下文)------RAGAS 这类框架的指标设计全在这个原则上。失败分布的经验顺序:域漂移的嵌入 > 分块不当 > ANN 召回损失 > 生成不忠实。一条铁律贯穿:答案在上下文里,模型基本忠实;不在,模型开始幻觉------所以 RAG 调优的主战场永远是检索,不是提示词。

现在算清第 7 篇留下的账。三种知识形态的对价:

参数知识 长上下文 RAG
规模 无限(蒸馏进权重) ≤ 数百 K token GB~TB 语料
更新 重新训练 换文档即生效 改库即生效
每查询成本 零(但凝固) 全量 token 费 检索费 + k×块费
独有失败面 过时、幻觉 context rot 稀释 检索误差链
缓存命中 模型即缓存 前缀缓存(第 5 篇) 块可缓存
python 复制代码
def cost(query_count, corpus_tokens, k=10, chunk=512):
    long_ctx = query_count * corpus_tokens        # 每次全量付费
    rag = index_build(corpus_tokens) + query_count * k * chunk
    return rag / long_ctx    # 语料越大、查询越多, RAG 的摊薄优势越悬殊

边界由两个量决定:信源规模 (超过百万 token,长上下文的每查询全量付费不可持续)与查询密度(查询次数多,长上下文的前缀缓存优势才摊得开)。中间地带是最实际的答案:先检索召回相关块,再把块连同其上下文装进长窗口深读------检索管"找哪里",长上下文管"读多深",参数管"怎么想"。

一句话收束:RAG 买的不是"让模型知道更多",而是知识的产权变更------从训练时凝固的参数搬到运行时可增删的索引;付出的对价是一整条误差链,换回的是规模、新鲜度与治理权。

相关推荐
jimmyleeee1 小时前
Agent安全之二:Tool Misuse & Exploitation(ASI02)----当合法工具被用来做错事
人工智能·安全
Jsundoku1 小时前
第八章 机器学习 -- 集成学习
人工智能·机器学习·集成学习
Shulex1 小时前
2026 出海企业 AI 客服选型指南:智齿、七鱼与 Shulex,谁是跨境业务的真解?
人工智能·智能客服·跨境电商
pigdreams1 小时前
Google 官方 Android CLI:让AI直接读布局结构而不是用adb截图验证
android·人工智能·adb
Highcharts.js2 小时前
2026年,AI正在重写技术:“工具思维”正在失效?
人工智能·echarts·客户端·highcharts·可视化图表·企业级图表
林伽一2 小时前
训练断网、部署上门槛:AI 基础设施的两道新闸门|2026年10月25日
人工智能·科技·安全·ai·1024程序员节
在所不辞兄2 小时前
【零基础学智能仿真-62】从应变—应力计算弹性常数
人工智能·深度学习·神经网络·机器学习·有限元·智能仿真
二宝哥2 小时前
02.springboot项目对接国内模型实现对话聊天
数据库·人工智能·spring boot
kaixin_啊啊2 小时前
【零基础学AI】第 17 章——一个机器学习项目怎样完成
人工智能·机器学习