RAG 原理与实践:让 LLM 用上「你的知识」
大模型的训练数据有截止日期,也不知道你公司文档、你的代码库、你的知识库。RAG(Retrieval-Augmented Generation,检索增强生成) 就是在回答前,先从你的数据里查出相关内容,再塞进提示词里让模型「基于这些材料」生成答案,从而减少瞎编、并支持引用来源。
下面先给一张流水线总览,再分步骤说切块、向量、检索和 Prompt 怎么拼。
为什么需要 RAG
Section titled “为什么需要 RAG”同一句话问「满 3 年年假几天」:没有 RAG 时模型只能靠训练记忆猜,容易编;有 RAG 时先从你的文档里捞出条款再答,可引用出处。
| 对比项 | 纯 LLM | RAG |
|---|---|---|
| 知识来源 | 训练数据(过时、不包含你内部数据) | 你提供的文档/数据库 |
| 幻觉风险 | 高(容易编造) | 低(有据可查) |
| 可追溯性 | 难 | 可引用原文/来源 |
| 更新方式 | 重新训练/微调 | 更新检索库即可 |
RAG 整体流程(对应上图)
Section titled “RAG 整体流程(对应上图)”四个关键步骤:切块 → 向量化 → 检索 → 拼进 Prompt 再生成。上图从左到右是入库链路,从用户问题回到向量库是检索,再经 Prompt 组装交给 LLM。
第一步:切块(Chunking)
Section titled “第一步:切块(Chunking)”目的:把长文档拆成一段段「适合检索」的小块。块太大:一篇几页纸算一个块,检索不精准;块太小:一句一句,上下文不足。
常见策略:
| 策略 | 做法 | 适用 |
|---|---|---|
| 按长度 | 每 N 个字符(如 500~800)切一块,可重叠 50~100 字 | 通用,实现简单 |
| 按段落 | 按 \n\n 或段落标签切,不足再合并到目标长度 | 自然段落清晰时 |
| 按语义 | 用模型或规则做「语义边界」切分(如按标题、小节) | 长文档、手册 |
重叠(overlap):相邻块之间保留几十到一百字重叠,避免一句被拦腰截断导致检索不到。
实用建议:先从「按长度 + 一定重叠」开始(如 512 token 或 600 字一块,重叠 80 字),再根据效果调。
第二步:向量化(Embedding)
Section titled “第二步:向量化(Embedding)”目的:把每一块文本变成一个「向量」(一串数字),这样可以用「向量相似度」来检索「意思相近」的块,而不只是关键词匹配。
谁来做:用 Embedding API(如 OpenAI、Cohere、开源 sentence-transformers)对每个 chunk 算一次向量,和问题向量一起存进向量库。
要点:问题和文档块要用同一套模型向量化,否则相似度没意义。
第三步:检索(Retrieval)
Section titled “第三步:检索(Retrieval)”目的:用户提问时,把问题也向量化,在向量库里找出和问题最相似的 K 块(Top-K),通常 K 取 3~10。常见做法是余弦相似度排序,取前几段原文拼进 Prompt。
过滤(可选):若你的文档带元数据(如部门、日期),可先按元数据筛再按向量排序,减少无关文档混入。
第四步:拼进 Prompt 再生成
Section titled “第四步:拼进 Prompt 再生成”目的:把检索到的几段原文,清晰标成「参考材料」,让 LLM 只基于这些内容回答,并鼓励引用来源。
Prompt 结构示例:
【参考材料】---材料 1(来源:员工手册 第3节):年假规定。满 1 年 5 天,满 3 年 10 天,满 5 年 15 天。---材料 2:……
【用户问题】我司年假政策里满 3 年几天?
【要求】仅根据上述参考材料回答;若材料中有,请注明来源(如「根据材料 1」)。若材料中无相关信息,请明确说「参考材料中未找到」。这样模型会倾向于「按材料说」,并减少编造。
实践要点小结
Section titled “实践要点小结”| 环节 | 建议 |
|---|---|
| 切块 | 500~800 字/块 + 50~100 字重叠起步;长文档可考虑按标题/小节切 |
| 向量化 | 文档与问题用同一 Embedding 模型;选成熟 API 或开源模型即可 |
| 检索 | Top-K 一般 3~5;有元数据时先过滤再向量检索 |
| Prompt | 明确写「仅根据下列材料」「注明来源」「没有就说没有」 |
和 Function Call / Agent 的关系
Section titled “和 Function Call / Agent 的关系”- RAG:解决「答案从哪来」——从你的知识库检索,再生成。
- Function Call / Agent:解决「动作从哪来」——查库、调 API、读文件、执行代码。
可以组合:Agent 在需要时调用「检索工具」(例如你的 RAG 接口),把检索结果当一次 Tool 的返回,再让模型基于该结果生成回复。这样既用上 RAG 的知识,又保留 Agent 的多步与工具能力。详见 AI 能力体系:Function Call 到 Agent。
- OpenAI Embeddings 文档
- LangChain 文本切块说明
- 向量库选型:Chroma、Milvus、pgvector、Qdrant 等,按规模与运维能力选择即可