夜雨聆风学习资料网

ARTICLE · 1312501

AI知识点拆解 · RAG 检索增强生成:给大模型外挂一个"随身资料库"

AI知识点拆解 · RAG 检索增强生成:给大模型外挂一个"随身资料库"

一、招聘市场怎么说

翻 BOSS 直聘上 大模型应用开发 / AI 算法 / RAG 方向 的近期 JD,RAG 已从"加分项"变成"必选项",且要求越来越细:

• 广州智慧驱动(大模型应用开发):"了解 RAG 技术(向量数据库、检索-生成流程),可对其进行性能调优"
• 中电金信(AI 大模型工程师·RAG 方向):"熟悉文档解析、向量化检索、大模型推理与应用,熟练掌握 LangChain/LlamaIndex"
• 北京万泰中联(大模型工程师):"精通 RAG 核心流程设计,包括文档加载、文本分割、向量化处理;能优化检索召回率和准确率;可通过重排策略优化"
• 中电信人工智能公司(35-55K):"优化全链路的检索技术,精通 Query 改写、多路召回、粗排、精排等检索流程"

注意关键词的变化:一年前 JD 只写"会用 LangChain 搭 RAG",现在写的是"调优、召回率、重排"——企业要的不是能跑 demo 的人,而是能把检索质量提上去的人。这是今天的主线。


二、RAG 是什么:让模型"开卷考试"

大模型有两个先天缺陷:训练数据有截止日期(不知道你们公司上周改的报销规则),没见过你的私有数据(不敢喂给外部 API)。

解决思路有三条,用一个考试类比:

方案
类比
成本
知识更新
塞进 Prompt
把书抄在小纸条上带进考场
低,但纸条有限(上下文窗口)
随时换
RAG允许带一本资料册,现场翻页
中
随时换
微调
考前把书背下来
高
重新背

RAG(Retrieval-Augmented Generation,检索增强生成)就是开卷考试:提问时先去你的资料库里检索相关内容,把检索结果和问题一起塞给模型,让它"照着资料答题"。承接前四天:用第 2 天的切分处理文档、第 3 天的 Embedding 算相似度、第 4 天的 Prompt 约束"只准依据资料作答"——RAG 是前四站知识的第一次总装。


三、五步流水线

前两步是离线的(建库,做一次),后两步是在线的(每次提问都走)。类比图书馆:①②③ 是"把书编目上架",④ 是"按索引找书",⑤ 是"管理员照着书回答你"。

• ② 切分是最容易被忽视的一步:切太碎,语义不完整;切太大,一块里混进多个主题,检索精度下降。常用 300500 字一块、相邻块重叠 10%20%(防止一句话被拦腰切断)。
• ④ 检索默认用向量检索(余弦相似度,第 3 天讲过),生产环境常叠加关键词检索(BM25/ES)做多路召回,因为型号、编号这类精确词向量反而抓不准。

四、本机实测:一个 mini RAG

我搭了个"星辰科技行政制度问答":15 条制度原文(差旅、报销、年假、调休等)作为知识库,8 个问题标注了正确出处,全部跑在 CPU 上。第一步先只测检索:

指标
结果
正确出处排名(向量检索)
8/8 个问题都排第 1 名
Recall@5
8/8
检索耗时
0.2 秒
加 Reranker 后 top-3 命中
8/8 → 8/8(零提升)
Rerank 耗时
7 秒(35 倍)

两个反直觉但真实的结论:

• 库小而干净时,向量检索已经足够强——Top-K 从 5 调到 20 毫无区别,全部第 1 名命中。新手常犯的错是效果不好就无脑加大 K、疯狂换模型,实际上先检查知识库干不干净(内容是否过时、一条里是否混多个主题)收益大得多。
• Rerank 不是免费午餐。重排模型(如 bge-reranker)要把"问题×候选"逐对送入模型精算,精度高但贵。它解决的是大库、难查询、多路召回混排的场景;在 15 条的小库上,它没救回任何一个 badcase,却把延迟放大了 35 倍。

五、端到端实测:一个惊喜和一个惊吓

接入 Qwen2.5-1.5B 生成答案(temperature=0),三组对照:

场景 1(库内问题)——RAG 大获全胜

问题:出差去上海住酒店,一晚上最多能报销多少钱?无 RAG:"您需要考虑住宿类型、酒店星级、地理位置……"(一段废话,不给数字)有 RAG:"根据第[2]条:一线城市每晚不超过500元……上海属于一线城市,最多报销 500 元。"(精准引用,还会推理)

场景 2(库外问题)——拒答指令生效

问题:公司股票在哪个交易所上市?无 RAG:一段委婉的推脱"建议您查阅公司官网或咨询投资顾问……"有 RAG:"资料中未找到相关规定。"(因为 System Prompt 里写了"资料中没有就只回答这句话")

场景 3(模拟检索失败)——RAG 最危险的时刻

我故意喂给模型一组与问题无关的检索结果(团建经费、会议室预订),再问"报销单最晚什么时候交":

有 RAG:"根据第[15]条团建经费规定……报销单最晚需要在活动结束后的一周内提交。"——一本正经地胡说八道,且引用了真实条目编号,看起来比无 RAG 时更可信!

这就是 RAG 最重要的失败模式:检索错了,模型会强行把无关资料硬凑成答案,幻觉反而更自信。对策:检索结果加相似度阈值过滤(低于阈值宁可拒答)、Prompt 中允许说"资料与问题无关"、上线后持续评测 badcase。


六、动手:30 行跑通完整链路

环境:pip install sentence-transformers(模型国内从魔搭下载;SSL 报错时设 export SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt)。

import torchfrom sentence_transformers import SentenceTransformerfrom transformers import AutoModelForCausalLM, AutoTokenizerE = "/root/.cache/modelscope/models/BAAI--bge-small-zh-v1.5/snapshots/master"Q = "/root/.cache/modelscope/models/Qwen--Qwen2.5-1.5B-Instruct/snapshots/master"PFX = "为这个句子生成表示以用于检索相关文章:"# bge 官方要求的查询前缀docs = ["住宿报销标准:一线城市每晚不超过500元,其他城市不超过400元;超出部分自理。","所有费用发票须在消费后30天内提交报销系统,逾期不予报销。","报销单经直属主管、财务初审、财务总监三级审批,通常3个工作日到账。"]emb = SentenceTransformer(E)                                # ①②③ 建库dvec = torch.from_numpy(emb.encode(docs, normalize_embeddings=True))tok = AutoTokenizer.from_pretrained(Q)llm = AutoModelForCausalLM.from_pretrained(Q, dtype=torch.float32).eval()defrag(question, k=3):    qvec = torch.from_numpy(emb.encode([PFX + question], normalize_embeddings=True))    top = (qvec @ dvec.T).argsort(descending=True)[0][:k].tolist()      # ④ 检索    ctx = "\n".join(f"[{i+1}] {docs[i]}"for i in top)    sys = ("你是公司行政助理。仅依据《制度资料》回答并引用条目编号,""资料中没有相关内容就只回答'资料中未找到相关规定'。")           # ⑤ 生成    msgs = [{"role": "system", "content": sys},            {"role": "user", "content": f"《制度资料》\n{ctx}\n\n问题:{question}"}]    ids = tok(tok.apply_chat_template(msgs, tokenize=False, add_generation_prompt=True),              return_tensors="pt")    out = llm.generate(**ids, max_new_tokens=120, do_sample=False,                       pad_token_id=tok.eos_token_id)return tok.decode(out[0][ids["input_ids"].shape[1]:], skip_special_tokens=True)print(rag("出差住宿一晚最多报多少?"))# 实测输出:根据第[1]条:一线城市每晚不超过500元……最多报销500元。

一次提问的完整时序:


七、企业级 RAG 的进阶招式(面试拉分项)

真实生产环境在五步流水线上还会叠这些层,对应开头 JD 里的关键词:

• Query 改写:用户问"发票晚交了怎么办",先让 LLM 改写成规范查询"报销时限规定",口语转检索语言,召回率立刻不一样。
• 多路召回:向量检索管语义、BM25 管精确词(型号、条款号)、知识图谱管关联,三路结果合并去重。
• 粗排 + 精排:先向量粗排出 Top-50(快),再 Reranker 精排出 Top-3(准)——这就是"重排策略"的正确打开方式,也是 Rerank 真正该花的钱。
• 评测闭环:固定一批"问题 + 正确出处 + 标准答案",每次改动回归一遍,看 Recall@K、答案忠实度(是否忠于检索内容)、拒答准确率。没有评测集的 RAG 优化全是盲调。

一句话:RAG 的天花板不在生成模型,而在检索质量。 生成模型只负责"照着念",念得好不好取决于递到它手里的资料。


八、面试三连问

Q1:RAG 和微调怎么选?RAG 解决"不知道"(知识时效、私有数据),微调解决"不会说"(固定风格、输出格式、领域术语)。默认先 RAG:成本低、知识可随时更新、答案可溯源。需要上千条标注数据且追求极致降本时再上微调,两者常组合使用。

Q2:RAG 系统答不准,怎么排查?先定位坏在哪一环:检索返回的 Top-K 里有没有正确内容(没有→检索问题:切分、Embedding 模型、Query 改写);有但模型没用上→生成问题:上下文太长被稀释、关键信息放结尾、Prompt 约束不够。九成问题出在检索。

Q3:为什么加了 RAG 还是幻觉?三种情况:检索没召回正确内容但模型硬答;召回了相似但过时的版本;Prompt 没给"拒答退路"。对策:相似度阈值、知识库版本管理、允许说"资料中未找到"。


九、总结

今天记住五句话:

• RAG = 开卷考试:先检索资料,再让模型照着答,知识可随时更新、答案可溯源。
• 五步流水线:加载 → 切分 → 向量化 → 检索 → 生成;前两步离线,后两步在线。
• 实测:库小而干净时向量检索已够强(8/8 全第 1 名命中),别急着堆复杂度;Rerank 在简单场景零提升、延迟×35,它该花在大库多路召回的精排上。
• RAG 最危险的不是找不到,而是检索错了模型还强行引用——我实测它把团建条款硬凑成报销答案,且带着"可信"的引用编号。
• 优化顺序:先建评测集,再查知识库质量,再调检索(Query 改写/多路召回/Rerank),最后才动 Prompt 和模型。

一句话记住 RAG:"答案的上限,在你递给模型的那几页资料里。"


明日预告:Function Calling——RAG 让模型"读得到",但模型还不能"动得了手":查库存、下单、发邮件这些真实操作,得让模型学会调用你的 API。明天拆解 Function Calling 的协议设计,并让 Qwen 真实调用一个天气接口。

本文考点参考自 BOSS 直聘等平台 AI 应用开发 / AI 算法 / 大模型开发 / AI Infra 岗位近期公开要求。

回首页,搜索你想要的文档

在首页搜索框输入关键词,快速定位资料

文库首页搜索指引 立即搜索

相关学习资料