RAG实战:给AI接上私有知识库的完整方案
2026/5/15 9:55:08 网站建设 项目流程

RAG 是什么:一句话+类比

RAG(Retrieval-Augmented Generation)= 先检索,再生成。

类比:RAG 就像开卷考试。模型本身是那个能写文章的学生,知识库是那一堆参考书。考试时不靠死记硬背,而是先翻书找到相关段落,再用自己的理解写答案。

没有 RAG 的 AI 是闭卷考——它只能答它训练时见过的内容。


为什么不直接 Fine-tuning?

这是大家最常问的问题。Fine-tuning 训练的是「风格和能力」,不是「知识」。

维度RAGFine-tuning
知识更新改向量库,秒级生效重新训练,几小时到几天
成本低(API + 向量DB)高(GPU 算力)
幻觉风险可溯源,能引用原文模型可能「记错」
适用场景私有知识、频繁更新专业语气、特定格式输出

结论:知识库类需求,首选 RAG;想让模型说话更像你们品牌,才考虑 Fine-tuning。


RAG 完整流程拆解

RAG 分两个阶段:索引阶段(离线)和查询阶段(在线)。

索引阶段(一次性/更新时): 文档 → 分块(Chunking) → 向量化(Embedding) → 存入向量数据库 查询阶段(每次对话): 用户提问 → 向量化 → 相似度检索 → 取出 Top-K 段落 → 拼进 Prompt → LLM 生成回答

第一关:文档分块(Chunking)

分块策略直接决定检索质量,但大多数人第一次都搞错了。

固定长度分块(最常见,但有问题)

fromimport# 最常见写法:按字符数切分1000# 每块最多1000字符200# 相邻块重叠200字符(防止语义断裂)"\n\n""\n""。""!""?"" """

❌ 常见错误:chunk_overlap=0
→ 一个完整句子被切成两半,检索时两半都不完整,模型无法理解

✅ 正确做法:chunk_overlap设为chunk_size的 10%-20%
→ 语义完整,相邻块有重叠保护

语义分块(效果更好,稍复杂)

fromimportfromimport# 按语义相似度自动切分,不按字符数硬切"percentile"# 超过85%相似度阈值才切分85# 输出的每个 chunk 语义上都是完整的

✅ 语义分块在技术文档、法律合同这类强结构文本效果明显更好
❌ 但速度更慢(每次都要调用 Embedding),适合离线批量处理


第二关:向量化(Embedding)

Embedding 是把文本变成一串数字向量,语义相近的文本向量距离更近。

类比:把每段文字映射到一个 1536 维的空间里,「苹果手机」和「iPhone」在这个空间里距离很近,和「橙子」距离远。

选 Embedding 模型

# 方案A:OpenAI text-embedding-3-small(性价比最高,推荐)fromimport"text-embedding-3-small"# 1536维,比 ada-002 便宜5倍# model="text-embedding-3-large", # 精度更高,贵3倍,一般用不到# 方案B:本地模型(零成本,但精度稍差)fromimport"BAAI/bge-m3"# 多语言,中文效果好"device""cpu"# 测试一下:两段近义句,向量距离应该很小"如何重置密码""忘记密码怎么办"# 这两个向量的余弦相似度应该 > 0.9

关键原则:索引时用什么 Embedding,查询时必须用同一个——不能混用。

向量数据库选型

数据库适用场景特点
Chroma本地开发、原型验证零配置,纯 Python
Qdrant生产环境推荐性能好,支持过滤
Pinecone云服务,快速上线全托管,按量付费
pgvector已有 PostgreSQL不用新增基础设施
# Chroma 本地版(开发用)fromimport"./chroma_db"# 本地持久化"my_knowledge_base"# Qdrant 生产版fromimportimport"http://localhost:6333""my_knowledge_base"

第三关:检索策略

大多数 RAG 系统检索效果差,不是因为 Embedding 模型不好,而是检索策略太简单。

基础检索:相似度搜索

# 最基础:返回最相似的4个chunk"如何申请年假"4# 带分数:能看到每个 chunk 的相似度(0-1,越高越相关)"如何申请年假"4forinprintf"相似度: {score:.3f} | 内容: {doc.page_content[:50]}..."

进阶检索:MMR(最大边际相关性)

❌ 纯相似度搜索的问题:Top-4 可能都是在说同一件事(高度重复)

✅ MMR 在保证相关性的同时,最大化结果多样性:

# MMR 检索:相关 + 不重复"如何申请年假"4# 返回4个20# 先取20个候选,再从中选4个最多样的0.7# 0=最多样,1=最相关,0.5-0.7 效果最好

混合检索:向量 + 关键词(生产推荐)

fromimportfromimport# 关键词检索(BM25,对专有名词、型号特别有效)4# 向量检索"k"4# 混合:各取 50%0.50.5# 可调,专有名词多时提高 BM25 权重"iPhone 14 的电池容量是多少"# BM25 精准匹配「iPhone 14」,向量找到语义相关段落,两者互补

第四关:完整 RAG Chain 搭建

把前面所有环节串起来,搭一个可以直接上生产的 RAG Chain:

fromimportfromimportfromimportfromimportfromimport# 1. 初始化组件"gpt-4o-mini"0"text-embedding-3-small""./chroma_db""my_knowledge_base""mmr""k"4"fetch_k"20# 2. RAG Prompt(关键:要求模型基于上下文回答)"""你是一个专业的知识库助手。请根据以下检索到的上下文回答用户问题。**规则:**- 只基于提供的上下文回答,不要编造- 如果上下文中没有相关信息,直接说「根据现有资料,我找不到这个问题的答案」- 回答要简洁直接,引用原文时用引号**检索到的上下文:**{context}**用户问题:**{question}"""# 3. 格式化检索结果(多个 chunk 拼在一起)defformat_docsdocsreturn"\n\n---\n\n"f"[来源: {doc.metadata.get('source', '未知')}]\n{doc.page_content}"forin# 4. 组装 Chain(LCEL 写法)"context"# 检索 → 格式化"question"# 问题直接传入# 5. 使用"我们公司的年假政策是什么?"print

带来源引用的版本

fromimport# 同时返回答案和来源文档"answer""source_documents"# 保留原始 chunk"年假怎么申请?"print"答案:""answer"print"\n引用来源:"forin"source_documents"printf" - {doc.metadata.get('source', '未知')}: {doc.page_content[:80]}..."

第五关:文档入库(工程化)

把文档批量处理入库,这才是生产中最麻烦的部分:

importfromimportfromimportfromimportdefload_documentsdocs_dir: strlist"""支持 PDF、Word、TXT、Markdown 混合入库"""".pdf"".docx"".txt"".md"forin"*"ifinstr# 给每个 chunk 打上来源标记forin"source""file_path"strprintf"✅ 已加载: {file_path.name} ({len(docs)} 段)"returndefbuild_knowledge_basedocs_dir: str, persist_dir: str"""一键构建知识库"""# 加载文档printf"\n共加载 {len(raw_docs)} 个文档片段"# 分块800150"\n\n""\n""。""!""?"printf"分块后共 {len(chunks)} 个 chunk"# 向量化入库(分批处理,避免 API 限流)"text-embedding-3-small"# 批量处理,每批 100 个100Noneforinrange0lenifisNone"knowledge_base"elseprintf"进度: {min(i+batch_size, len(chunks))}/{len(chunks)}"printf"\n✅ 知识库构建完成,共 {len(chunks)} 个向量"return# 使用"./docs""./chroma_db"

常见坑(踩过才知道)

坑1:Chunk 太大,检索噪音多

chunk_size=3000:一个 chunk 包含了太多无关内容,检索出来的段落「离题」

✅ 推荐chunk_size=600-1000,回答简单问题用小 chunk,需要完整上下文时用k=6


坑2:相同文档重复入库

# ❌ 每次启动都重新入库,向量越来越多# ✅ 检查是否已有数据,有就直接加载ifandprint"加载已有向量库"elseprint"新建向量库"

坑3:提问语言和文档语言不一致

❌ 文档是中文,用英文查询 → 相似度打分错乱

✅ 用多语言 Embedding(BAAI/bge-m3)或在检索前把提问翻译成文档语言


坑4:Top-K 太少,关键信息检索不到

k=2:覆盖太少,问题涉及多个段落时漏答

✅ 生产环境推荐k=4~6,token 允许的情况下宁多不少


坑5:Prompt 没有「只基于上下文回答」约束

❌ 没加限制 → 模型结合自己训练知识和检索结果混答,无法区分哪些是你的文档里有的

✅ 明确写:「只基于以下上下文,没有就说没有」——这一句能把幻觉降低 80%


发布前自查清单

  • Embedding 模型索引和查询时一致
  • chunk_overlapchunk_size的 10%
  • 每个文档 chunk 打了来源 metadata
  • Prompt 中有「只基于上下文」约束
  • 检索数量k≥ 4
  • 重复入库已做幂等检查
  • 混合检索(BM25 + 向量)用于专有名词多的场景

​最后

我在一线科技企业深耕十二载,见证过太多因技术更迭而跃迁的案例。那些率先拥抱 AI 的同事,早已在效率与薪资上形成代际优势,我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在大模型的学习中的很多困惑。

我整理出这套 AI 大模型突围资料包:

  • ✅AI大模型学习路线图
  • ✅Agent行业报告
  • ✅100集大模型视频教程
  • ✅大模型书籍PDF
  • ✅DeepSeek教程
  • ✅AI产品经理入门资料

完整的大模型学习和面试资料已经上传带到CSDN的官方了,有需要的朋友可以扫描下方二维码免费领取【保证100%免费】👇👇
​​

为什么说现在普通人就业/升职加薪的首选是AI大模型?

人工智能技术的爆发式增长,正以不可逆转之势重塑就业市场版图。从DeepSeek等国产大模型引发的科技圈热议,到全国两会关于AI产业发展的政策聚焦,再到招聘会上排起的长队,AI的热度已从技术领域渗透到就业市场的每一个角落。


智联招聘的最新数据给出了最直观的印证:2025年2月,AI领域求职人数同比增幅突破200%,远超其他行业平均水平;整个人工智能行业的求职增速达到33.4%,位居各行业榜首,其中人工智能工程师岗位的求职热度更是飙升69.6%。

AI产业的快速扩张,也让人才供需矛盾愈发突出。麦肯锡报告明确预测,到2030年中国AI专业人才需求将达600万人,人才缺口可能高达400万人,这一缺口不仅存在于核心技术领域,更蔓延至产业应用的各个环节。

​​

资料包有什么?

①从入门到精通的全套视频教程⑤⑥

包含提示词工程、RAG、Agent等技术点

② AI大模型学习路线图(还有视频解说)

全过程AI大模型学习路线

③学习电子书籍和技术文档

市面上的大模型书籍确实太多了,这些是我精选出来的

④各大厂大模型面试题目详解

⑤ 这些资料真的有用吗?

这份资料由我和鲁为民博士共同整理,鲁为民博士先后获得了北京清华大学学士和美国加州理工学院博士学位,在包括IEEE Transactions等学术期刊和诸多国际会议上发表了超过50篇学术论文、取得了多项美国和中国发明专利,同时还斩获了吴文俊人工智能科学技术奖。目前我正在和鲁博士共同进行人工智能的研究。

所有的视频教程由智泊AI老师录制,且资料与智泊AI共享,相互补充。这份学习大礼包应该算是现在最全面的大模型学习资料了。

资料内容涵盖了从入门到进阶的各类视频教程和实战项目,无论你是小白还是有些技术基础的,这份资料都绝对能帮助你提升薪资待遇,转行大模型岗位。


智泊AI始终秉持着“让每个人平等享受到优质教育资源”的育人理念‌,通过动态追踪大模型开发、数据标注伦理等前沿技术趋势‌,构建起"前沿课程+智能实训+精准就业"的高效培养体系。

课堂上不光教理论,还带着学员做了十多个真实项目。学员要亲自上手搞数据清洗、模型调优这些硬核操作,把课本知识变成真本事‌!

​​​​

如果说你是以下人群中的其中一类,都可以来智泊AI学习人工智能,找到高薪工作,一次小小的“投资”换来的是终身受益!

应届毕业生‌:无工作经验但想要系统学习AI大模型技术,期待通过实战项目掌握核心技术。

零基础转型‌:非技术背景但关注AI应用场景,计划通过低代码工具实现“AI+行业”跨界‌。

业务赋能 ‌突破瓶颈:传统开发者(Java/前端等)学习Transformer架构与LangChain框架,向AI全栈工程师转型‌。

👉获取方式:

😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓**

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询