模块 04 · 用大模型做东西

RAG,让模型读你的资料

从零搭一个检索增强生成系统:切分文档、向量检索、关键词检索、查询改写、重排、带引用的回答和评估,最后让 RepoBot 读懂 httpx 的文档。

各课

  1. 01
    为什么需要 RAG

    同一个问题,不给资料时模型答错,把相关的一段文档放进提示词后就答对了。讲清楚 RAG 的基本流程、它解决什么问题,以及它不适合的场景。

    25 分钟 · 进阶
  2. 02
    文档切分

    用 httpx 的文档实际比较三种切分方法:按固定长度、按标题、按标题并限制长度。还会遇到一个真实的坑:代码块里的注释被当成了标题。

    35 分钟 · 进阶
  3. 03
    从零写一个向量检索

    用 numpy 写一个几十行的向量检索:把文档块变成向量矩阵,查询时算相似度取前几名。再用 20 道题评估它,结果只有一半能找对,看看问题出在哪。

    45 分钟 · 进阶
  4. 04
    混合检索和重排

    从零写一个 BM25 关键词检索,用 RRF 把它和向量检索融合,先把中文问题改写成英文检索词,最后加一个重排模型。每一步都用同一套 20 道题量化效果。

    50 分钟 · 进阶
  5. 05
    带引用的回答

    把检索到的文档块编号交给模型,要求它每句话注明出处、资料里没有就说没有。再用程序检查引用是否有效,并看看它在文档没有答案的问题上会不会编。

    35 分钟 · 进阶
  6. 06
    怎么知道 RAG 好不好

    把 RAG 的评估拆成检索和回答两半。检索看命中率,回答让另一个模型当评委,对照参考答案判断对错、对照资料判断是否忠实。评委判了 60 次,我逐条核对,发现它自己也会错。

    45 分钟 · 进阶
  7. 07
    项目:让答疑助手读懂项目文档

    把切分、混合检索、查询改写、带引用的回答装进 RepoBot,做出 v2。它在 v1 答错的问题上答对了,还解决了多轮对话里"那异步呢"这种追问的检索问题。

    60 分钟 · 进阶

RepoBot v1 答错了"httpx 默认会不会跟随重定向",还编了一段版本历史。这个模块解决这个问题:让它在回答之前,先去 httpx 的官方文档里找到相关的段落,照着文档回答,并告诉用户出处。

整个模块几乎不用框架。切分、向量检索、BM25、融合、引用检查,都是自己写的,每个几十行。所有检索方法都用同一套 20 道题评估,你会看到每加一样东西,数字具体变了多少。其中有些结果和常见的说法不一样,比如在我们的数据上,混合检索并没有比单用关键词检索更好,最大的提升来自一次便宜的查询改写。

为什么是这个顺序

第 1 课先用一个手动的例子证明"给资料就能答对",并讲清楚 RAG 的流程和适用范围。第 2 到 4 课按流程的顺序,把"找资料"这一步做好:先切分,再检索,再改进检索。第 5 课处理"用资料"这一步:让模型带着引用回答,不知道时老实说不知道。第 6 课评估整个系统,不只是检索,还有回答本身。第 7 课把这些装进 RepoBot。

学完的标准

  • 能按文档的结构切分,并能发现和修正切分中的问题(比如代码块被切断)。
  • 不用任何框架,写出向量检索和 BM25,并用 RRF 把它们融合。
  • 能为自己的文档准备一套检索评估题,算出命中率和 MRR,并据此选择检索方法。
  • 能让模型只根据检索到的资料回答、注明出处,并用程序检查引用是否有效。
  • RepoBot v2 能正确回答 v1 答错的问题,并给出文档来源。

本模块的代码