RAG 知识库搭建:让 AI 回答你的私有数据
为什么直接问模型效果差
把公司 wiki 导出丢给模型,问"我们的退款流程是什么",大概率得到两种结果之一:一本正经地编一个流程,或者回答"我无法访问你的内部文档"。原因有三层:
- 训练数据里根本没有:内部文档、私人笔记从未进入任何模型的训练集
- 上下文塞不下:动辄几十万字的文档库,远超模型的上下文窗口
- 就算塞得下也不可靠:长上下文里模型会"看漏"关键段落,而且幻觉是统计式生成的本性,不是修个 bug 就能解决的
RAG(检索增强生成)的思路是反过来:先从你的知识库里检索出相关段落,再让模型"看着资料回答"。事实来自检索,模型只负责组织语言——这正是它擅长的分工。
三件套:切块、Embedding、向量库
RAG 的离线部分由三个组件构成:
- 切块(Chunking):把文档切成 300-500 字的段落,块与块之间保留 10%-20% 的重叠,防止关键句子被切断。切块大小没有万能值:问答类知识偏小块,需要通读上下文的长文档偏大块
- Embedding(向量化):用 Embedding 模型把每个块变成高维向量——语义相近的文本向量距离也相近,这是"按意思搜"而不是"按关键词搜"的基础
- 向量库:存向量并支持相似度检索,个人轻量级用 FAISS、Chroma,团队级再考虑 Milvus 一类
切块是最容易被低估的一步。策略不必凭感觉定,直接拿真实文本做实验:把一篇文档粘进文本分割合并工具,按字数或自定义分隔符切几版,检查有没有把表格、条款从中间切断——检索质量的瓶颈通常在这里,不在模型。
搭建步骤:离线入库 + 在线问答
RAG 系统分两条流水线。
离线入库,文档变化时跑一次:
- 清洗文档:去掉页眉页脚、乱码和无效字符
- 按上面的策略切块
- 全部块过一遍 Embedding 模型算出向量
- 向量连同原文一起存入向量库,并给每个块附上元数据(来源文件、章节、更新日期)——有了元数据,检索时就能先按条件过滤再搜,比如只查 2026 年之后修订的制度文件
入库前用 Token 计数工具估一下总 Token 量:500 份文档、平均 5000 字,合计约 250 万字,折算成 Token 后再对比按量计费的 Embedding API 和本地部署模型的单价,哪个划算一目了然。文档后续更新时,只对改动部分重新切块入库、替换旧块即可——知识更新不需要碰模型,这正是 RAG"外脑"的意义。
在线问答,每次提问执行:
- 用户问题向量化
- 在向量库里检索最相似的 3-5 个块
- 把块拼进提示词,交给模型生成答案
核心提示词:“仅根据给定资料回答”
在线问答的质量,一半取决于检索,另一半取决于提示词。底版如下:
| |
两个细节比模板本身更重要:一是明确允许模型说"不知道",不给台阶它就会硬编;二是要求标注引用,让用户能点回原文核验。调好的版本存进 Prompt 提示词库——它覆盖写作、编程、翻译、学习、办公五类模板,支持变量占位填充与自定义、导入导出,团队里谁搭新知识库都能直接复用同一套提示词。
调优清单
调优前先建立基线:固定 20 个有标准答案的测试问题,每改一处就重跑一遍——凭感觉调,效果只会来回震荡。之后按这个顺序排查,从最常见的问题开始:
- 检索不到 → 先人工确认资料确实入库了;再检查切块是否太大被稀释,或文档本身质量太差
- 检索到了但答案不用资料 → 提示词约束不够硬,或 top-k 太多挤占了注意力,降到 3 个试试
- 答案笼统 → 切块太小,单块信息量不够,加大到 500 字上下
- 专业词搜不准 → 上混合检索:关键词匹配 + 向量检索双路召回再合并
- 问题太口语导致检索不准 → 加一层查询改写:先让模型把用户的问题改写成适合检索的完整表述,再拿去搜
- 答案存疑 → 保留引用标注让人能核验,这是抑制幻觉最实用的一招
常见问题
RAG 和微调到底选哪个?
知识频繁更新选 RAG——改文档就行,不用重训;要解决输出风格与固定格式选微调。两者不冲突:微调管"怎么说",RAG 管"说什么"。微调的适用边界与完整流程见《LoRA 微调入门》。
不写代码能搭吗?
可以。笔记软件内置的"AI 问答"、各种低代码知识库产品,本质都是 RAG,原则完全相同:切块别太碎、提示词要限死"仅根据资料回答"。本文的调优清单照样适用。
能全程本地化吗?
可以。本地大模型(Ollama 等)加本地 Embedding 模型,文档和问题都不出网。硬件怎么选、模型怎么装,见《16G 内存 Mac 怎么跑本地大模型》。
小结
RAG 的本质是给模型配一个随时可更新的外脑:切块决定找得准不准,提示词决定答得实不实。先用几十份文档跑通最小闭环,再扩规模。本地跑大模型场景专题里收集了配套的提示词库与成本估算工具,搭建过程中随时用得上。