【干货收藏】RAG技术详解:让本地大模型不再“凭空捏造“,实时检索生成答案
发布时间:2026/8/27 15:42:43 作者:尧图编辑部 阅读量:1,286

前言RAG 「先查资料再写答案」的 AI 工作模式。它把「检索系统」和「大模型」结合起来让模型不用全靠记忆而是实时查找外部知识再生成回答从而更准确、更可信。为什么建议在本地化的大模型中增加RAG叠加就是这样原因。在Deepseek使用过程中也会有联网查询这一个功能如果本地化部署没有增加数据库训练和RAG叠加后续的回答只能基于原来训练的内容进行回答会导致回答空洞、无法接入企业/个人知识没有达到本地化部署、细分领域专用的效果。RAG的工作流程可以总结如下核心结构用户问题 → 检索器Vector DB / BM25→ 文本片段 → 组装 Prompt → 大模型 → 回答目前RAG的检索方式主要为以下三种举个简单的例子问题“写一个R函数按组计算均值和95%CI。”传统模型 → 可能瞎写也可能不是很准确存在一定的误差RAG → 检索数据库中已有的 R 代码片段如 dplyr / broom / summarise 函数示例然后拼接 Prompt参考以下代码片段 [1] file/path/stats_utils.R#3 # 计算均值和置信区间 calc_ci - function(vec, conf0.95) { ... } 现在回答问题 写一个R函数按组计算 mean 和 95% CI输入 dataframe 和 group 列→ 模型输出会更加准确 风格一致 易维护特别是个人使用时越用越贴近自己的风格前提是提供RAG的内容是个人的代码或者个人风格的内容。接下来举例LLM-Coder代码助手的RAG叠加的操作流程语料收集 → 清洗切块 → 向量化BM25→ 检索 → 交叉重排 → 拼接上下文 → 本地小模型生成第 1 步准备语料代码 文档1.拉你要用的 GitHub 仓库或拷贝企业内部仓2.只保留.py、.R、.ipynb抽代码单元、.md、.Rmd、设计文档 / 指南 PDF可先转文本3.去重同内容哈希过滤dist/ build/ .ipynb_checkpoints/ 之类生成物代码分块原则很重要按“函数/类/文件内标题”切块而不是盲目固定长度每块附文件路径起止行号元数据R 的 roxygen2 注释、Python 的 docstring 作为上下文优先保留第 2 步创建本地向量库FAISS安装必要的库pip install sentence-transformers faiss-cpu rank_bm25 unstructured pypdf接下来使用python脚本进行创建# build_index.py import os, json, re, faiss from pathlib import Path from rank_bm25 import BM25Okapi from sentence_transformers import SentenceTransformer from tqdm import tqdm SRC_DIR corpus # 你整理好的语料根目录 IDX_DIR rag_index # 索引输出目录 EMB_NAME BAAI/bge-small-zh-v1.5 # 中文场景英文用 bge-small-en-v1.5 os.makedirs(IDX_DIR, exist_okTrue) # -------- 1) 收集并“按函数/段落”切块 -------- def split_code_blocks(text, lang): # 极简切块按函数/类/roxygen 标题等你可换成更强的 AST 切块器 if lang python: pat r(?m)^(def |class ) elif lang r: pat r(?m)^(#|[a-zA-Z0-9_]\s*-function) else: pat r(?m)^#{1,6}\s|^$ chunks, buf [], [] for line in text.splitlines(): if re.search(pat, line) and buf: chunks.append(\n.join(buf)); buf[line] else: buf.append(line) if buf: chunks.append(\n.join(buf)) # 限长再切 out[] for c in chunks: if len(c) 2000: out.append(c) else: for i in range(0, len(c), 1500): out.append(c[i:i1800]) return out def walk_corpus(): docs[] for p in Path(SRC_DIR).rglob(*): if p.suffix.lower() in [.py,.r,.md,.rmd,.txt]: txt p.read_text(errorsignore, encodingutf-8, newlineNone) lang python if p.suffix.py else (r if p.suffix.r else md) blocks split_code_blocks(txt, lang) for bi, b in enumerate(blocks): docs.append({ text: b.strip(), meta: {path: str(p), block_id: bi, lang: lang} }) return docs docs walk_corpus() with open(f{IDX_DIR}/corpus.jsonl,w,encodingutf-8) as f: for d in docs: f.write(json.dumps(d,ensure_asciiFalse)\n) print(chunks:, len(docs)) # -------- 2) 向量化 FAISS -------- model SentenceTransformer(EMB_NAME) # 默认走 CPU可用 .to(cuda)显存允许 embs model.encode([d[text] for d in docs], batch_size64, show_progress_barTrue, normalize_embeddingsTrue) d embs.shape[1] index faiss.IndexFlatIP(d) # 归一化后用内积余弦 index.add(embs) faiss.write_index(index, f{IDX_DIR}/faiss.index) with open(f{IDX_DIR}/meta.json,w,encodingutf-8) as f: json.dump({emb_model:EMB_NAME, count:len(docs)}, f, ensure_asciiFalse, indent2) # -------- 3) BM25可选混合检索-------- bm25 BM25Okapi([d[text].split() for d in docs]) import pickle; pickle.dump({bm25:bm25, docs:docs}, open(f{IDX_DIR}/bm25.pkl,wb)) print(done.)第 3 步检索 重排 调用本地 LLM先装一个轻量重排器可关掉以换速度pip install cross-encoder查询脚本支持向量检索 可选 BM25 混合 重排# query_rag.py import json, faiss, numpy as np, pickle from sentence_transformers import SentenceTransformer, CrossEncoder from pathlib import Path import requests IDX_DIR rag_index OLLAMA_URL http://localhost:11434/api/generate # 先启动 ollama meta json.load(open(f{IDX_DIR}/meta.json,r,encodingutf-8)) docs [json.loads(l) for l in open(f{IDX_DIR}/corpus.jsonl,r,encodingutf-8)] index faiss.read_index(f{IDX_DIR}/faiss.index) emb_model SentenceTransformer(meta[emb_model]) try: bm25_pack pickle.load(open(f{IDX_DIR}/bm25.pkl,rb)) bm25, bm_docs bm25_pack[bm25], bm25_pack[docs] except: bm25None # 可选重排CPU 也能跑慢时可关闭 try: reranker CrossEncoder(BAAI/bge-reranker-base) except: reranker None def retrieve(query, topk6, mix_bm25True): qv emb_model.encode([query], normalize_embeddingsTrue) D,I index.search(qv, topk) cand [docs[i] for i in I[0]] if mix_bm25 and bm25: bm bm25.get_top_n(query.split(), bm_docs, ntopk) cand cand bm # 重排 if reranker: pairs [(query, c[text]) for c in cand] scores reranker.predict(pairs) ranked [c for _,c in sorted(zip(scores,cand), keylambda x:-x[0])] return ranked[:topk] return cand[:topk] PROMPT 你是代码助手。请仅依据“参考上下文”用{lang}给出解决方案并简短解释。 问题{question} 参考上下文可能不完整请择要引用文件路径 {context} 要求 1) 先给核心代码2) 再解释关键点3) 如引用到文件请标注 path#blockid。 def ask_llm(model_tag, prompt): resp requests.post(OLLAMA_URL, json{model: model_tag, prompt: prompt, stream: False}) return resp.json()[response] if __name____main__: question 用R写一个函数分组计算均值和95%CI并返回整洁表tidy。 lang R cands retrieve(question, topk8, mix_bm25True) ctx \n\n---\n.join([f[{i}] {c[meta][path]}#b{c[meta][block_id]}\n{c[text][:1200]} for i,c in enumerate(cands)]) prompt PROMPT.format(langlang, questionquestion, contextctx) print(ask_llm(deepseek-r1:1.5b, prompt))先起 LLM# 个人电脑安装的1.5B模型CMD输入 ollama pull deepseek-r1:1.5b ollama run deepseek-r1:1.5b第 4 步提高检索高命中Hybrid 检索向量 BM25 混合上面已示范代码类问题对关键字很敏感代码块切分更智能有余力的话用 AST/语法树分块器按函数、类、导出对象去噪与权重README、示例/测试、roxygen/docstring 给予更高“候选优先级”重排器可选小型交叉编码器离线即可嫌慢就把重排改成轻量如 Cosine HeuristicPrompt 模板固定始终要求“先代码、后解释、引用路径”可极大降低幻觉缓存对 embeddings 和检索结果做本地缓存SQLite/磁盘多次问答更快第 5 步评估与迭代小题集自建 50–200 条“问题→期望代码/断言”的集合Python 用pytestR 用testthat三类指标检索命中率是否找到包含答案的块重排质量相关块是否排在前 3执行通过率生成代码跑单测是否通过闭环错误样本加入“补充语料/FAQ/模板代码” → 重新嵌入 → 索引刷新最后为什么要学AI大模型当下⼈⼯智能市场迎来了爆发期并逐渐进⼊以⼈⼯通⽤智能AGI为主导的新时代。企业纷纷官宣“ AI ”战略为新兴技术⼈才创造丰富的就业机会⼈才缺⼝将达 400 万DeepSeek问世以来生成式AI和大模型技术爆发式增长让很多岗位重新成了炙手可热的新星岗位薪资远超很多后端岗位在程序员中稳居前列。与此同时AI与各行各业深度融合飞速发展成为炙手可热的新风口企业非常需要了解AI、懂AI、会用AI的员工纷纷开出高薪招聘AI大模型相关岗位。最近很多程序员朋友都已经学习或者准备学习 AI 大模型后台也经常会有小伙伴咨询学习路线和学习资料我特别拜托北京清华大学学士和美国加州理工学院博士学位的鲁为民老师给大家这里给大家准备了一份涵盖了AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频全系列的学习资料这些学习资料不仅深入浅出而且非常实用让大家系统而高效地掌握AI大模型的各个知识点。这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】AI大模型系统学习路线在面对AI大模型开发领域的复杂与深入精准学习显得尤为重要。一份系统的技术路线图不仅能够帮助开发者清晰地了解从入门到精通所需掌握的知识点还能提供一条高效、有序的学习路径。但知道是一回事做又是另一回事初学者最常遇到的问题主要是理论知识缺乏、资源和工具的限制、模型理解和调试的复杂性在这基础上找到高质量的学习资源不浪费时间、不走弯路又是重中之重。AI大模型入门到实战的视频教程项目包看视频学习是一种高效、直观、灵活且富有吸引力的学习方式可以更直观地展示过程能有效提升学习兴趣和理解力是现在获取知识的重要途径光学理论是没用的要学会跟着一起敲要动手实操才能将自己的所学运用到实际当中去这时候可以搞点实战案例来学习。海量AI大模型必读的经典书籍PDF阅读AI大模型经典书籍可以帮助读者提高技术水平开拓视野掌握核心技术提高解决问题的能力同时也可以借鉴他人的经验。对于想要深入学习AI大模型开发的读者来说阅读经典书籍是非常有必要的。600AI大模型报告实时更新这套包含640份报告的合集涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师还是对AI大模型感兴趣的爱好者这套报告合集都将为您提供宝贵的信息和启示。AI大模型面试真题答案解析我们学习AI大模型必然是想找到高薪的工作下面这些面试题都是总结当前最新、最热、最高频的面试题并且每道题都有详细的答案面试前刷完这套面试题资料小小offer不在话下这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】