Skip to content

RAG 原理与实践:让 LLM 用上「你的知识」

大模型的训练数据有截止日期,也不知道你公司文档、你的代码库、你的知识库。RAG(Retrieval-Augmented Generation,检索增强生成) 就是在回答前,先从你的数据里查出相关内容,再塞进提示词里让模型「基于这些材料」生成答案,从而减少瞎编、并支持引用来源。

下面先给一张流水线总览,再分步骤说切块、向量、检索和 Prompt 怎么拼。

RAG 流水线:切块、入库、检索、再生成

同一句话问「满 3 年年假几天」:没有 RAG 时模型只能靠训练记忆猜,容易编;有 RAG 时先从你的文档里捞出条款再答,可引用出处。

有无 RAG 时的知识来源与可追溯性对比

对比项纯 LLMRAG
知识来源训练数据(过时、不包含你内部数据)你提供的文档/数据库
幻觉风险高(容易编造)低(有据可查)
可追溯性可引用原文/来源
更新方式重新训练/微调更新检索库即可

四个关键步骤切块 → 向量化 → 检索 → 拼进 Prompt 再生成。上图从左到右是入库链路,从用户问题回到向量库是检索,再经 Prompt 组装交给 LLM。


目的:把长文档拆成一段段「适合检索」的小块。块太大:一篇几页纸算一个块,检索不精准;块太小:一句一句,上下文不足。

常见策略

策略做法适用
按长度每 N 个字符(如 500~800)切一块,可重叠 50~100 字通用,实现简单
按段落\n\n 或段落标签切,不足再合并到目标长度自然段落清晰时
按语义用模型或规则做「语义边界」切分(如按标题、小节)长文档、手册

重叠(overlap):相邻块之间保留几十到一百字重叠,避免一句被拦腰截断导致检索不到。

相邻块共享一段重叠文本,避免边界切在关键句中间

实用建议:先从「按长度 + 一定重叠」开始(如 512 token 或 600 字一块,重叠 80 字),再根据效果调。


目的:把每一块文本变成一个「向量」(一串数字),这样可以用「向量相似度」来检索「意思相近」的块,而不只是关键词匹配。

文本块经同一套 Embedding 模型变成稠密向量

谁来做:用 Embedding API(如 OpenAI、Cohere、开源 sentence-transformers)对每个 chunk 算一次向量,和问题向量一起存进向量库。

要点:问题和文档块要用同一套模型向量化,否则相似度没意义。


目的:用户提问时,把问题也向量化,在向量库里找出和问题最相似的 K 块(Top-K),通常 K 取 3~10。常见做法是余弦相似度排序,取前几段原文拼进 Prompt。

问题向量化后与各块算相似度,取 Top-K 进入下一步

过滤(可选):若你的文档带元数据(如部门、日期),可先按元数据筛再按向量排序,减少无关文档混入。


目的:把检索到的几段原文,清晰标成「参考材料」,让 LLM 只基于这些内容回答,并鼓励引用来源。

Prompt 结构示例

【参考材料】
---
材料 1(来源:员工手册 第3节):
年假规定。满 1 年 5 天,满 3 年 10 天,满 5 年 15 天。
---
材料 2:……
【用户问题】
我司年假政策里满 3 年几天?
【要求】
仅根据上述参考材料回答;若材料中有,请注明来源(如「根据材料 1」)。
若材料中无相关信息,请明确说「参考材料中未找到」。

这样模型会倾向于「按材料说」,并减少编造。


环节建议
切块500~800 字/块 + 50~100 字重叠起步;长文档可考虑按标题/小节切
向量化文档与问题用同一 Embedding 模型;选成熟 API 或开源模型即可
检索Top-K 一般 3~5;有元数据时先过滤再向量检索
Prompt明确写「仅根据下列材料」「注明来源」「没有就说没有」

  • RAG:解决「答案从哪来」——从你的知识库检索,再生成。
  • Function Call / Agent:解决「动作从哪来」——查库、调 API、读文件、执行代码。

可以组合:Agent 在需要时调用「检索工具」(例如你的 RAG 接口),把检索结果当一次 Tool 的返回,再让模型基于该结果生成回复。这样既用上 RAG 的知识,又保留 Agent 的多步与工具能力。详见 AI 能力体系:Function Call 到 Agent