本文介绍了RAG(检索增强生成)技术,旨在解决大语言模型的时效性不足和知识覆盖缺陷问题。文章详细阐述了RAG的核心工作流程,包括索引阶段的文档分块、向量化及存入向量数据库,以及检索生成阶段的用户问题向量化、相似度计算、Top-k文档检索和LLM生成。Naive RAG作为基础实现方式,通过“索引-检索-生成”三步流程,为构建更高级的RAG系统奠定基础。

一、RAG 简介

1.1 什么是 RAG

RAG(Retrieval-Augmented Generation,检索增强生成) 是结合信息检索与大模型生成的 AI 技术,核心逻辑是让大模型先从专属知识库中检索相关信息,再基于检索到的内容生成答案,类比为给大模型开卷考试,避免其仅凭自身训练数据作答。

1.2 为什么需要 RAG

大语言模型存在两大核心局限性

  • 时效性不足:大模型的训练数据有时间截止点,无法回答最新的实事、热点或实时数据类问题。如:实时天气、近期企业制度更新。
  • 知识覆盖性缺陷:训练数据无法涵盖所有专业领域深度知识和私有数据,易出现生成幻觉,导致答案缺乏可信度。

面对大模型的局限性,微调、提示词工程是常见方案,但与 RAG 相比差异显著:

  • 大模型微调:需基于专属数据集对模型重新训练,成本高、周期长,且更新知识需再次微调,适合静态、高频使用的专属知识场景。
  • 提示词工程:仅通过优化提问方式引导模型作答,无法补充模型未学习的知识,解决幻觉问题的能力有限。
  • RAG:无需修改模型本身,仅通过外挂知识库补充信息,知识更新成本低、实时性强,适合动态更新的私有/专业知识场景,是解决大模型幻觉和时效性问题的轻量化最优解。

RAG 的研究范式一直在持续演进,我们将其发展过程分为三个阶段:朴素 RAG(Naive RAG)、高级RAG(Advanced RAG) 和模块化 RAG(Modular RAG)

1.3 核心工作流程

论文:https://arxiv.org/pdf/2312.10997

RAG 的完整工作流程分为索引阶段和检索生成阶段,核心是将 “用户问题” 与 “知识库文档” 进行语义匹配,再让大模型基于匹配结果作答

  • 索引阶段:将知识库中的文档进行加载→分块→向量化→存入向量数据库,为后续检索做准备。
  • 检索生成阶段:用户输入问题→问题向量化→在向量数据库中检索语义相似的文档块→将问题 + 检索结果拼接为增强提示词→送入大模型→生成精准答案。

简单来说,无 RAG 时大模型 “凭记忆作答”,有 RAG 时大模型 “先翻书,再答题”。

二、Naive RAG

2.1 概述

2.1.1 Naive RAG 简介

Naive RAG(朴素 RAG) 是指 RAG 的最基本、最经典的实现方式,没有引入复杂的优化或额外模块。它遵循最直接的“索引-检索-生成”三步流程,是理解和构建更高级 RAG 系统的基础。

2.1.2 Naive RAG 流程

2.2 索引阶段

2.2.1 文档分块

为什么要分块

大模型有上下文窗口限制,且长文档直接检索易丢失关键信息,分块是将大文档切分为大小合适的文本片段,保证检索的精准性和效率。

分块策略

按固定字符数切分、按句子切分

# 按固定字符数切分
def split(text, count):
return [text[i:i + count] for i in range(0, len(text), count)]
# 按句子切分
import re
def split(text):
"""
re.findall 是 Python re 模块中的一个函数,它返回字符串中所有匹配的列表。
r'...':原始字符串,防止反斜杠被转义
正则含义:匹配由任意多个非句末标点字符组成的序列,后面紧跟一个句末标点。
"""
return re.findall(r'[^。?!]+[。?!]', text)

固定字符数 + 重叠窗口切分

# 即按照固定字符数切分,但是要保留上一段的部分内容
def split_window(text, count, stride):
return [text[i:i + count] for i in range(0, len(text), count - stride)]

RecursiveCharacterTextSplitter 通过递归应用不同粒度的分隔符切分,在满足块大小约束的同时,尽可能保留文本的自然边界(段落、句子、词语)。这是 RAG 应用中对文档进行预处理的标准工具,能有效提升后续检索与生成的质量。

# 从 langchain 导入递归字符文本分割器
from langchain.text_splitter import RecursiveCharacterTextSplitter
# 待分割的长文本(包含多个段落和句子)
text = """
人工智能(AI)是计算机科学的一个分支,致力于创建能够执行通常需要人类智能的任务的系统。
机器学习是AI的核心子领域,它使计算机能够从数据中学习而无需明确编程。
深度学习则是机器学习的一个子集,基于人工神经网络。
自然语言处理(NLP)使计算机能够理解、解释和生成人类语言。
计算机视觉则赋予机器“看”和识别图像的能力。
如今,AI已广泛应用于医疗、金融、教育、交通等各个领域。
然而,AI的发展也带来了伦理和隐私方面的挑战,需要全社会共同应对。
"""
# 初始化递归文本分割器
text_splitter = RecursiveCharacterTextSplitter(
# 每个块的最大字符数
chunk_size=100,
# 相邻块之间的重叠字符数,用于保持上下文连贯,避免切分边界丢失信息
chunk_overlap=20,
# 用于计算文本长度的函数,默认 len 表示按字符数计算;也可替换为 token 计数函数
length_function=len,
# 自定义分隔符优先级列表(从高到低):
# 首先尝试用双换行符 "\n\n" 切分(段落边界)
# 如果某个块仍太大,则对该块改用单换行符 "\n" 切分(行边界)
# 接着尝试用中文句号 "。" 切分(句子边界)
# 再用逗号 "," 切分(短语边界)
# 然后用空格 " " 切分(单词边界)
# 最后如果还是太大,就用空字符串 "" 按字符强制切分,保证块大小不超 chunk_size
separators=["\n\n", "\n", "。", ",", " ", ""]
)
# 对文本执行分割,返回字符串列表,每个元素是一个文本块
chunks = text_splitter.split_text(text)
# 遍历并打印每个块的内容和长度,展示分割结果
for i, chunk in enumerate(chunks):
print(f"块 {i+1} (长度 {len(chunk)}):\n{chunk}\n{'-'*50}")

2.2.2 文档向量化

向量化(Embeddings) 是将文本、图片、音频等非结构化数据转换为数值向量的过程,向量由一组浮点数组成,对应 n 维空间的一个点,向量的维度代表语义特征的丰富度。用户查询和文档块必须使用同一个嵌入模型。如果模型不一致,向量就处于不同的语义空间,相似度比较将毫无意义。

2.2.3 向量数据库

作为 RAG 技术的关键组件,向量数据库解决了 AI 时代非结构化数据的高效存储、检索和相似度匹配问题,是连接海量数据与大模型的桥梁。

常见向量数据库

Chroma 使用

安装与初始化

# 安装必要的库# pip install chromadbimport chromadb

存储向量

# 当前配置中,数据保存在内存中
client = chromadb.Client(Settings(allow_reset=True))
# 如果需要持久化到磁盘,需使用 PersistentClient创建客户端
# client = chromadb.PersistentClient(path="./my_chroma_db")
# 创建一个 Collection。可以指定距离计算方法(默认为余弦相似度)
collection = client.create_collection(
name="my_rag_docs",
metadata={"hnsw:space": "cosine"} # 指定使用余弦相似度
)
# 将数据添加到 collection 中
collection.add(
# 每个文档的向量
embeddings=embeddings,
# 每个文档的原文
documents=chunks,
# 每个文档的 id
ids=chunk_ids
)
print(f"Collection 中现在有 {collection.count()} 个数据块")

2.3 检索阶段

2.3.1 相似度计算

在 RAG 的检索阶段,相似度计算是核心环节。它用于衡量用户查询向量与知识库中文档向量之间的相似程度, 从而筛选出最相关的文档,为后续的生成提供高质量的上下文。

相似度计算本质上就是在向量空间中衡量两个向量之间的"距离"或"角度":

  • 向量夹角越小,相似度越高
  • 向量距离越近,相似度越
  • 相似度值通常在 [0 , 1] 或 [-1, 1]

欧氏距离计算示例

import numpy as np
def euclidean_distance(a, b):
"""
计算两个向量 a 和 b 之间的欧氏距离。
参数:
a:第一个向量(NumPy数组)
b:第二个向量(NumPy数组)
返回:
两个向量之间的欧氏距离(标量值)
"""
# a - b: 对应元素相减,得到差值向量
# np.linalg.norm(...): 计算该差值向量的长度(即欧氏距离)
return np.linalg.norm(a - b)
# 示例使用
if __name__ == "__main__":
# 模拟文本向量
query_vec = np.array([0.1, 0.2, 0.3, 0.4, 0.5])
doc_vec = np.array([0.15, 0.25, 0.35, 0.45, 0.55])
# 计算相似度
ecul_dist = euclidean_distance(query_vec, doc_vec)
print(f"欧氏距离: {ecul_dist:.4f}")
# 输出: 欧氏距离: 0.1118

余弦相似度计算示例

import numpy as np
def cosine(a, b):
"""
计算两个向量之间的余弦相似度。
参数:
a: 第一个向量 (numpy array)
b: 第二个向量 (numpy array)
返回:
float: 余弦相似度 [-1, 1]。如果向量为零向量,返回 0.0。
"""
# 计算向量 a 和向量 b 的点积(内积)
dot_product = np.dot(a, b)
# 计算向量 a 的 L2 范数(模长)
norm_a = np.linalg.norm(a)
# 计算向量 b 的 L2 范数(模长)
norm_b = np.linalg.norm(b)
# 计算余弦相似度:点积除以两个向量模长的乘积
cos_sim = dot_product / (norm_a * norm_b)
return cos_sim
# 示例使用
if __name__ == "__main__":
# 模拟文本向量
query_vec = np.array([0.1, 0.2, 0.3, 0.4, 0.5])
doc_vec = np.array([0.15, 0.25, 0.35, 0.45, 0.55])
# 计算相似度
cosine = cosine(query_vec, doc_vec)
print(f"余弦相似度: {cosine:.4f}")
# 输出: 余弦相似度: 0.9984

2.3.2 Chroma 检索

查询向量化:对用户输入的查询使用同一个嵌入模型转换成向量。

相似度计算:计算查询向量与所有文档块向量的相似度(通常用余弦相似度或欧氏距离)。

返回 Top-k 块:选出最相似的 k 个文本块作为检索结果。

collection.query(
# 查询条件向量
query_embeddings=query_embeddings,
# 最相关的个结果
n_results=top_k
)

2.4 生成阶段

2.4.1 构建 Prompt

将检索到的上下文信息与用户原始查询进行结构化组合,构建一个清晰、明确的提示模板。优秀的提示设计能够引导 LLM 正确理解任务目标,有效利用上下文信息。

上下文信息:[检索到的块1][检索到的块2]...根据以上上下文,请回答:用户问题
def basic_template(context, question):
prompt = f"""
上下文信息:
{context}
根据以上上下文,请回答:
{question}
"""
# 示例使用
if __name__ == "__main__":
# 模拟检索到的上下文
context_blocks = [
"人工智能(AI)是一门旨在创建智能代理的计算机科学分支...",
"未来十年,AI预计将在以下领域取得重大突破..."
]
# 用户问题
question = "人工智能的发展前景如何?"
# 构建提示
prompt = basic_template(context_blocks, question)
print(prompt)

2.4.2 LLM 生成

将提示输入给大语言模型,模型基于提供的上下文生成自然语言回答。

import os
from openai import OpenAI
client = OpenAI(
api_key=os.getenv("DASHSCOPE_API_KEY"),
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)
completion = client.chat.completions.create(
model="qwen-plus",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": prompt},
]
)
print(completion.model_dump_json())

如何学习大模型 AI ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。

但是具体到个人,只能说是:

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

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

  • ✅ 从零到一的 AI 学习路径图
  • ✅ 大模型调优实战手册(附医疗/金融等大厂真实案例)
  • ✅ 百度/阿里专家闭门录播课
  • ✅ 大模型当下最新行业报告
  • ✅ 真实大厂面试真题
  • ✅ 2026 最新岗位需求图谱

所有资料 ⚡️ ,朋友们如果有需要 《AI大模型入门+进阶学习资源包》下方扫码获取~
在这里插入图片描述

① 全套AI大模型应用开发视频教程

(包含提示工程、RAG、LangChain、Agent、模型微调与部署、DeepSeek等技术点)
在这里插入图片描述

② 大模型系统化学习路线

作为学习AI大模型技术的新手,方向至关重要。 正确的学习路线可以为你节省时间,少走弯路;方向不对,努力白费。这里我给大家准备了一份最科学最系统的学习成长路线图和学习规划,带你从零基础入门到精通!
在这里插入图片描述

③ 大模型学习书籍&文档

学习AI大模型离不开书籍文档,我精选了一系列大模型技术的书籍和学习文档(电子版),它们由领域内的顶尖专家撰写,内容全面、深入、详尽,为你学习大模型提供坚实的理论基础。
在这里插入图片描述

④ AI大模型最新行业报告

2025最新行业报告,针对不同行业的现状、趋势、问题、机会等进行系统地调研和评估,以了解哪些行业更适合引入大模型的技术和应用,以及在哪些方面可以发挥大模型的优势。
在这里插入图片描述

⑤ 大模型项目实战&配套源码

学以致用,在项目实战中检验和巩固你所学到的知识,同时为你找工作就业和职业发展打下坚实的基础。
在这里插入图片描述

⑥ 大模型大厂面试真题

面试不仅是技术的较量,更需要充分的准备。在你已经掌握了大模型技术之后,就需要开始准备面试,我精心整理了一份大模型面试题库,涵盖当前面试中可能遇到的各种技术问题,让你在面试中游刃有余

图片

以上资料如何领取?

在这里插入图片描述

为什么大家都在学大模型?

最近科技巨头英特尔宣布裁员2万人,传统岗位不断缩减,但AI相关技术岗疯狂扩招,有3-5年经验,大厂薪资就能给到50K*20薪!

图片

不出1年,“有AI项目经验”将成为投递简历的门槛。

风口之下,与其像“温水煮青蛙”一样坐等被行业淘汰,不如先人一步,掌握AI大模型原理+应用技术+项目实操经验,“顺风”翻盘!
在这里插入图片描述
在这里插入图片描述

这些资料真的有用吗?

这份资料由我和鲁为民博士(北京清华大学学士和美国加州理工学院博士)共同整理,现任上海殷泊信息科技CEO,其创立的MoPaaS云平台获Forrester全球’强劲表现者’认证,服务航天科工、国家电网等1000+企业,以第一作者在IEEE Transactions发表论文50+篇,获NASA JPL火星探测系统强化学习专利等35项中美专利。本套AI大模型课程由清华大学-加州理工双料博士、吴文俊人工智能奖得主鲁为民教授领衔研发。

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

以上全套大模型资料如何领取?

在这里插入图片描述

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐