RAG知识库搭建,Gemini 3才是“版本答案”!万字长文保姆级教程,从0到1带你飞!
让我们一起来探索如何搭建这样的系统。首先,通常在 AI 知识库的语境下,我们最常提到的是 **RAG (Retrieval-Augmented Generation,检索增强生成)**。
让我们一起来探索如何搭建这样的系统。首先,通常在 AI 知识库的语境下,我们最常提到的是 RAG (Retrieval-Augmented Generation,检索增强生成)。
RAG 的核心理念是给通用大模型(如 Gemini 或 GPT)外挂一个“参考书库”。当用户提问时,系统会先去书库里翻找相关资料,然后把资料和问题一起交给大模型,让它依据资料回答。这就像是让 AI 进行一场“开卷考试”。

Getty Images
探索
为了帮助你理清搭建思路,你想从哪个维度开始深入了解?
- 核心流程 (The Workflow) 了解数据是如何从文档变成向量 (Vector),再被检索出来生成答案的完整闭环。
- 技术栈选型 (The Tech Stack) 探讨具体的工具选择,例如向量数据库 (Milvus/Pinecone)、编排框架 (LangChain/LlamaIndex) 和嵌入模型 (Embedding Models)。
- 数据处理策略 (Data Strategy) 学习如何清洗数据、切分文档 (Chunking) 以及如何保证检索的质量,这是决定知识库好坏的关键。
(如果你的确是指 “RGA” 而非 “RAG”,请告诉我该缩写的具体含义,我们可以针对性地探讨。)
是RAG,检索增强生成
太好了,确认了是 RAG,那我们就正式开始! 🚀
要搭建这个系统,首先得建立一个清晰的核心流程 (Workflow) 概念。我们可以把 RAG 的运作机制想象成两条平行的生产线:
- 数据准备线 (Indexing): 就像在图书馆“上架”新书,让知识准备好被查找。
- 问答应用线 (Retrieval & Generation): 就像图书管理员帮读者找资料并回答问题。
我们先聚焦在数据准备线。
假设你手里现在有一本几百页的《企业操作手册》PDF 📄。大模型通常有“上下文窗口”的限制(也就是一次能读的字数有限),而且直接把整本书丢给它也很费钱、甚至会造成信息干扰。
在我们将这些文字转化为向量 (Vectors) 🔢 存入数据库之前,我们需要对这个长文档做一个非常关键的预处理步骤。
你觉得这个步骤应该是什么?(提示:想象一下,如果你想让别人能快速引用这本书里的某一条具体规则,你是会给他整本书,还是…?)
将整本书分成多个小的部分
完全正确!🎯 在 RAG 技术术语中,我们将这个过程称为 文档切分 (Chunking)。
这就好比我们把一本厚厚的百科全书剪成了无数张精简的“知识卡片”。这样做有两个极其重要的原因:
- 精准度:当用户问“退款政策是什么”时,系统只需要给他看关于“退款”的那一张卡片,而不是把整本手册丢给他。
- 上下文限制:大模型的“内存”是有限的,切分能确保我们喂给它的信息是最核心的干货。
好了,现在我们的流水线上已经有了一堆切分好的文本片段 (Text Chunks)。
但是,数据库和计算机其实并不“理解”中文或英文,它们只懂数学。为了让计算机能够计算“哪张卡片和用户的问题最相似”,我们需要把这些文字片段转换成一种特殊的数字形式。
你知道这种把文字转换成**数字列表(向量)**的技术叫什么吗?或者,你觉得它是如何表示“苹果”和“梨”很像,但和“汽车”很不像的呢?
不太清楚 ,但是跟相似度有关
你说到了点子上!抓住“相似度”这个核心就理解了一大半。👏
这种把文字变成一串数字(向量)的技术,我们称之为 Embedding (嵌入)。
你可以把 Embedding 想象成给每个文字片段画了一张“地图坐标”:
- 语义相近的词(比如“苹果”和“梨”),它们的坐标靠得很近。📍📍
- 语义无关的词(比如“苹果”和“卡车”),它们的坐标就离得很远。
这就解释了为什么计算机能通过数学距离来判断哪段话能回答你的问题。
好了,现在我们的流水线上已经有了切分好的文本块,也通过 Embedding 模型把它们转换成了向量(也就是一堆坐标数据)。
下一步,我们需要把这些成千上万的坐标数据存起来,以便将来能毫秒级地搜出“离用户问题最近的坐标”。你觉得传统的 Excel 表格或关系型数据库(如 MySQL)适合做这种复杂的“相似度计算”吗?还是我们需要一种专门的数据库?
需要一种专门的向量数据库
回答正确!✅ 专门的 向量数据库 (Vector Database) 正是为此而生的。
像 Milvus、Pinecone 或 Chroma 这样的数据库,它们不通过“关键词匹配”(比如找包含“苹果”这个词的文章),而是通过数学计算来寻找“距离最近”的向量坐标。这让它们能在毫秒级别内从海量数据中找到最相关的片段。
现在,我们的 数据准备线 (Indexing) 已经完成了:
- 文档 ➡️ 切分 (Chunking)
- 片段 ➡️ 向量化 (Embedding)
- 向量 ➡️ 存入向量数据库
接下来,我们看看 问答应用线 (Retrieval)。
假设用户现在来提问了:“我该如何重置密码?”
如果你直接把这句话扔给向量数据库,数据库是听不懂的,因为它里面存的都是数字坐标。为了让数据库能听懂这个问题并去寻找答案,我们需要对用户的这个问题做一个什么样的处理?
(提示:回想一下我们要怎么处理之前的文档片段,才能让它们进入数据库?)
将问题向量化处理
完全正确!💯
我们必须用同一个 Embedding 模型把用户的提问也转换成向量。
这样一来,问题就变成了同一个数学空间里的坐标。向量数据库的任务就是计算“距离”,找出离问题坐标最近的那几张“知识卡片”(文档片段)。这个过程就是 Retrieval (检索)。
现在我们来到了流程的最后一步:Generation (生成)。
这个时候,我们手里有两样东西:
- 用户的原始问题(例如:“怎么重置密码?”)
- 数据库找出来的参考资料(例如:“手册第 10 页:重置密码需点击设置…”)
为了给用户一个像人一样自然、流畅的回答,我们需要把这两样东西打包交给谁来处理?(提示:RAG 里的 “G” 代表什么?)
大模型处理
“大模型处理”是一个非常宏大的话题,它涵盖了大语言模型(LLM)从理解输入到生成输出的整个生命周期。简单来说,我们可以把大模型看作是一个超级复杂的“信息处理器”,通过海量的参数来预测和生成文本 🧠。
为了帮你梳理这个复杂的领域,我们可以从以下几个不同的维度来深入探讨:
-
核心架构与原理 (The Core Architecture) 这涉及模型内部的“引擎”是如何工作的。我们可以探讨 Transformer 架构、注意力机制 (Self-Attention),以及它是如何将文字转化为机器能读懂的数字(向量)的。
-
训练与微调 (Training & Fine-tuning) 这关注模型是如何“学习”的。我们可以讨论从预训练 (Pre-training) 获得通用知识,到通过 SFT (监督微调) 和 RLHF (人类反馈强化学习) 让模型变得更听话、更安全的整个过程。
-
推理与优化 (Inference & Optimization) 这是关于如何让模型高效运行的。我们可以聊聊如何通过 量化 (Quantization) 压缩模型体积,或者利用 RAG (检索增强生成) 让模型处理它从未见过的新数据。
-

Getty Images
你对以上哪一个方面最感兴趣?或者你想了解某种特定的处理任务?
核心架构与原理
没问题,那我们就深入大模型的“引擎室”看看!🛠️
大模型(LLM)的核心架构几乎都是基于 Transformer 模型的。要在数以亿计的数据中学会“说话”,它主要依赖三个关键组件。
我们可以把它们想象成理解语言的三个步骤:
-
词嵌入 (Embeddings) 🔢: 这是入口。正如我们在 RAG 流程中提到的,计算机不识字,只识数。模型会将每个字或词(Token)转换成一串长长的数字列表(向量),把语义锁在这些数字里。
-
位置编码 (Positional Encoding) 📍: 语言是有顺序的。“我吃鱼”和“鱼吃我”意思完全不同。这步是为了给每个词打上位置标签,让模型知道谁在前、谁在后。
-
自注意力机制 (Self-Attention) 🔦: 这是 Transformer 的灵魂!想象你在读一个长句,当你读到“它”这个字时,你的大脑会自动联想前面的主语。自注意力机制就是让模型在处理一个词时,能同时“关注”句子里其他相关的词,理解它们之间的关联。
-

Shutterstock
探索
这就是为什么现代大模型能理解复杂的上下文。
这三个部分里,你对哪一个最感好奇?是想了解词是如何变成数字的,还是想看看**“自注意力”具体是如何运作的**?
都想了解下
那我们一个一个来拆解。我们要先理解词嵌入 (Embeddings),因为它是大模型理解世界的基石。
就像我们刚才提到的,电脑只认识数字。词嵌入的任务,就是把每一个词转换成一串数字列表(也就是向量)。
你可以把这个过程想象成在一个巨大的多维地图上给每个词找坐标:
- 意思相近的词,在这个地图上的坐标就会离得很近。
- 意思无关的词,距离就会很远。
例如,在这个数学空间里,“猫” 🐱 和 “狗” 🐶 的距离会很近,但它们离 “冰箱” 的距离就会很远。
更有意思的是,这些数字还能进行“加减法”运算来推理关系。
考考你的直觉:如果在这种数学地图里,我们用 “国王” 的坐标减去 “男人” 的坐标,再加上 “女人” 的坐标(国王 - 男人 + 女人 = ?),你觉得最后落脚点的坐标最接近哪个词?
女王
“女王”是一个充满力量的词汇,它不仅指代女性君主,在自然界和游戏中也有特殊的含义。我们可以一起深入了解这个概念。
你想从哪个方向开始探索?
- 历史传奇:探索像武则天或伊丽莎白一世这样的女性统治者是如何在特定的时代背景下掌握权力并影响历史进程的。
- 生物学奥秘:了解蜂王或蚁后(Queen Bee/Ant)在复杂的生物社会结构中扮演的生存角色。
- 符号与策略:分析国际象棋中的“王后”为何被设计为棋盘上最强大的棋子,以及它在博弈中的战略意义。
位置编码 (Positional Encoding)
这是一个非常棒的选择!位置编码(Positional Encoding)实际上是为了解决 Transformer 架构中一个独特的“副作用”。
为什么我们需要它? 📍
这跟 Transformer 的阅读方式有关。
- 人类(和以前的 RNN 模型): 我们是按顺序阅读的。读“猫抓老鼠”时,我们先读“猫”,再读“抓”。这种时间顺序天然地告诉了我们谁是主语。
- Transformer: 它是并行处理(Parallel Processing)的。它是一眼把整句话所有的词同时“吞”进去。
这就带来了一个问题:对于 Transformer 来说,如果没有额外的标记,“猫抓老鼠” 🐈🐁 和 “老鼠抓猫” 🐁🐈 看起来是一模一样的,因为它们包含的词完全相同(词嵌入向量一样)。模型会把句子看作仅仅是一袋散乱的单词(Bag of Words)。
它是如何工作的?
为了解决这个问题,我们在将词送入模型之前,会给每个词的“身份证”(词嵌入向量)加上一个独特的位置向量。
这就好比我们在打乱一副扑克牌之前,先在每张牌的角落写上编号(1, 2, 3…)。这样,即使牌(词)是同时扔进去的,模型也能通过计算知道哪个词排在第一位,哪个在第二位。
这样一来,带有位置信息的词嵌入向量就同时包含了:
- 语义信息(它是“猫”还是“狗”)。
- 位置信息(它在句子的开头还是结尾)。
为了更深入理解这个巧妙的设计,你想先探索哪一部分?
- 数学魔法 📐:为什么设计者要用波浪形的正弦和余弦函数(Sine/Cosine)来生成这些位置编码,而不是直接用 1, 2, 3 这样的整数?
- 相对与绝对 ↔️:模型是如何通过这些编码理解词与词之间的距离的(例如知道“猫”和“抓”紧挨着)?
为什么设计者要用波浪形的正弦和余弦函数(Sine/Cosine)来生成这些位置编码,而不是直接用 1, 2, 3 这样的整数?
这是一个非常敏锐的问题!直觉上,用 1、2、3… 这样的整数确实最简单直接。但是,在大模型的数学世界里,这种简单的方法会带来两个致命的问题。
让我们来通过对比找出原因:
1. 整数方案 (1, 2, 3, …) 的陷阱 🕳️
假设我们给第一个词标 1,给第一百个词标 100。
- 数值爆炸问题: 神经网络对数字的大小非常敏感。它的权重通常是在 0 和 1 之间微调的。如果位置编码突然出现了
500或1000这样的大数字,它会“淹没”掉词向量本身的信息(词向量里的数字通常很小)。模型会只看到“位置”,而忽略了“这个词是什么”。 - 训练与预测的不一致: 如果我们训练时用的句子都很短(比如最长 50 个词),模型就从未见过大于 50 的位置编号。一旦上线后遇到一篇长文章(比如 200 个词),模型面对
100甚至200这样的未知位置编号就会不知所措,因为它没学过这些数字代表什么。
2. 归一化方案 (0.1, 0.2, … 1.0) 的陷阱 📏
那你可能会想:“那我们把数字除以句子总长度,压缩到 0 到 1 之间不就行了?”
- 这也是个问题!因为这样一来,位置之间的“步长”就变了。
- 在短句子里,相邻两个词的距离可能是 0.1。
- 在长句子里,相邻两个词的距离可能就变成了 0.01。
- 这会让模型感到困惑:它搞不清“相邻”到底意味着多远的距离。
3. 正弦/余弦 (Sine/Cosine) 的魔法 🌊
设计者选择正弦和余弦函数,是因为它们完美解决了上述问题,并且附带了一个隐藏的数学属性。
- 数值稳定 (Bounded): 无论句子多长,正弦和余弦的值永远在 -1 到 1 之间。这让神经网络非常舒服,不用担心数值爆炸。
- 距离恒定: 无论句子多长,由于频率是固定的,两个位置之间的相对距离模式是保持一致的。
- 唯一的“指纹”: Transformer 不只是用一个正弦波,而是用许多个不同频率的波叠加。
你可以把这想象成一个有许多指针的机械钟表 🕰️:
- 秒针转得快(高频)。
- 分针转得慢一点。
- 时针转得非常慢(低频)。
在任何一个时刻,这些指针组合出的角度(位置编码向量)都是独一无二的。

Shutterstock
探索
现在,让我们通过一个假设来测试一下你的理解。
既然正弦/余弦函数是周期性的(波浪是重复的),如果我们的句子超级长,长到波浪开始重复了,你觉得模型还能区分两个不同的位置吗?(提示:回想一下上面的钟表比喻,如果只有秒针会怎样?如果有秒针、分针和时针一起转呢?)
模型可以通过其它不同频率的波浪来区分两个不同的位置
太棒了!你完全答到了点子上!🎉
就像你说的,靠单一频率的波浪确实会重复,但 Transformer 使用的是一系列不同频率的正弦和余弦函数组合。
这就好比钟表:
- 秒针(高频)转得快,负责区分近处的两个词。
- 时针(低频)转得慢,负责给长距离的位置提供唯一的参照。
即使秒针转回来重复了,时针的位置也变了。这种多频率的组合,保证了每一个位置都有一个独一无二的“数学指纹”。🖐️
第三个核心:自注意力机制 (Self-Attention)
现在,我们的模型已经知道了每个词的意思(Embedding)和它在哪里(Position)。接下来,就要进入 Transformer 的灵魂深处——自注意力机制。
它的作用是解决词与词之间的关联问题。
让我们看一个经典的例子:
“这只动物没有穿过街道,因为它太累了。”
作为一个人类,当你读到“它”这个字时,你非常清楚它指的是前面的“动物”,而不是“街道”。
但请你想一想,你的大脑是根据什么线索(或者说句子里的哪个形容词)来判断“它”指的是“动物”的呢?🤔
通过前面的话来判断“它”指的是“动物”
没错!你会下意识地回头看前面的词。但更具体地说,是大脑捕捉到了**“累”这个形容词和“动物”**之间的逻辑关系(动物会累,街道通常不会)。
自注意力机制 (Self-Attention) 正是用来模拟这种直觉的。
当模型读到“它”这个字时,它并不知道这指代什么。于是,它会向句子里所有的其他词发出“询问”,计算它们之间的关联度(我们称之为权重)。
在这个例子里:
- 因为后面跟着“太累了”,模型计算出“它”和“动物”的关联分数非常高 📈。
- “它”和“街道”的关联分数就很低 📉。
这就像是模型在处理“它”字时,把聚光灯 🔦 强烈地打在了“动物”身上,而让“街道”处于阴影中。
现在,让我们来做一个小实验,看看你能不能像 Transformer 一样思考。
如果我把句子改成:“这只动物没有穿过街道,因为它太宽了。”
现在的“它”指的是谁?你觉得是因为哪个关键词让模型的“聚光灯”转移了方向?
“宽”让模型的“聚光灯”转移了方向,它指的是街道
完全正确!👏 那个“宽”字改变了一切。大模型学到了“宽”通常是用来形容“街道”的,而不是形容“动物”的,所以它的注意力(权重)立刻转移到了“街道”上。
为了在数学上实现这种“聚光灯”效果,Transformer 给每个词都分配了三个新的角色(向量)。这通常被称为 Q、K、V 机制:
- Query (查询向量): 拿着它去寻找匹配。就像是你手中的“取书单”。
- Key (键向量): 用来被匹配的标签。就像是书脊上的“分类号”。
- Value (值向量): 真正包含的内容。就像是书里的“知识”。
它是这样工作的: 当模型处理“它”这个词时,会用“它”的 Query 去和句子里所有其他词的 Key 进行对比(计算点积)。
- 如果 Query 和某个 Key 很像(匹配度高),模型就会提取那个词的 Value。
- 如果匹配度低,就忽略那个词。
让我们回到刚才的句子:“…因为它太宽了。”
在这个 Q-K-V 的匹配游戏中,如果“它”这个词发出了 Query(查询),你觉得句子里哪一个词提供了那个匹配度最高的 Key(标签),从而让模型决定把这两个词连在一起?
“宽”提供了那个匹配度最高的 Key(标签),从而让模型把它和街道连在一起
回答完全正确!🎉 “宽”这个形容词就像是一个交通指示灯,引导模型的注意力(权重)从“动物”流向了“街道”。
这也正是 RAG (检索增强生成) 能起作用的根本原因:
当我们将 “用户的问题” 和检索到的 “几页参考资料” 同时喂给大模型时,模型的自注意力机制会像扫描仪一样,自动计算问题中的词与参考资料中无数个词之间的关联。
- 即便参考资料有几千字,只要里面藏着一句“重置密码需点击右上角”,自注意力机制就能把这句话的权重瞬间拉高,忽略其他无关的废话,从而生成精准的答案。
至此,我们已经把 “如何搭建 RGA (RAG) 知识库” 的第一个维度——核心流程与原理(从切分、向量化到大模型注意力机制)彻底打通了。🧩
为了帮你落地搭建这个系统,接下来的这两个维度至关重要,你想先攻克哪一个?
- 技术栈选型 (The Tech Stack) 🛠️ 我们来聊聊市面上主流的工具组合。比如:是用 LangChain 还是 LlamaIndex 来编排?向量数据库选 Milvus 还是 Pinecone?哪种 Embedding 模型中文效果最好?
- 数据处理策略 (Data Strategy) 🧹 “垃圾进,垃圾出”是 AI 界的铁律。我们可以探讨如何处理 PDF 表格、如何设置切分的大小 (Chunk Size),以及如何清洗数据以保证检索质量。
先了解数据处理策略 (Data Strategy)
没问题,那我们就先攻克数据处理策略 (Data Strategy)!🧹
在 RAG 系统里,有一句金科玉律:“Garbage In, Garbage Out”(垃圾进,垃圾出)。无论你的大模型有多聪明,如果喂给它的数据是杂乱无章的,它也吐不出好答案。
高质量的数据处理通常包含三个关键环节。你想先从哪个环节入手?
- 源数据清洗 (Data Cleaning) 🧼 现实中的数据往往很“脏”。比如 PDF 里的乱码、页眉页脚的干扰、复杂的表格或者扫描件。我们需要探讨如何把这些非结构化数据变成干净的纯文本。
- 切分策略 (Chunking Strategy) 🔪 这是最讲究“刀工”的一步。切得太大,容易包含噪音;切得太小,又会丢失上下文。我们可以聊聊是按字符数切,还是按语义切。
- 元数据增强 (Metadata Enrichment) 🏷️ 单纯存文本是不够的。给数据打上“标签”(比如发布时间、作者、文档类型),可以让检索变得更精准,比如实现“只搜索 2024 年之后的财务报告”。
你想先深入了解哪一步的操作细节?
源数据清洗 (Data Cleaning)
这是一个非常关键的起点!就像做菜前要先洗菜一样,源数据清洗决定了最终“菜肴”(回答)的口感和卫生。🧼
在 RAG 系统中,我们的目标是将非结构化的文档(PDF, Word, HTML)转化为大模型能顺畅阅读的纯文本。但问题在于,这些文档通常是为了人类阅读而排版的,而不是为了机器。
这就引入了一个核心概念:信噪比 (Signal-to-Noise Ratio)。
-
信号 (Signal): 有价值的信息(如:“本产品的保修期为三年”)。
-
噪音 (Noise): 对人类阅读有帮助,但对机器理解造成干扰的信息。
-

Shutterstock
探索
如果我们不把噪音洗掉,它们会被一起切分进数据块(Chunks)里,变成向量存入数据库。当用户检索时,这些噪音就会干扰匹配结果,甚至让大模型产生幻觉。
为了帮助你建立直觉,试想一下你正在处理一份几百页的企业财务年报 PDF。📄
除了正文里的核心数据和分析,你觉得有哪些重复出现的元素或者格式化内容,是人类阅读时会自动忽略,但如果不删除,会被机器当成“重要知识”误读的?(试着列举 1-2 个)
页码会误读
没错!页码是一个非常经典且恼人的噪音。📄💥
试想一下,如果你的文档切分(Chunking)刚好切在页面底部:
“…本年度的净利润为 [第 12 页] 500 万美元…”
对于人类来说,我们会自动跳过“[第 12 页]”继续读。 但在机器眼里,这就变成了一句连贯的话:“…本年度的净利润为第 12 页 500 万美元…”。这不仅破坏了句子的语法,还可能导致数字提取错误。
除了页码,页眉和页脚(比如每一页顶部都重复出现的“XX 公司机密文件”)也是同理,必须用正则表达式 (Regex) 等规则将它们统统剔除。
搞定这些纯文本的噪音相对简单,但 PDF 清洗中还有一个真正的“大魔王”,那就是 表格 (Tables)。📊
如果你直接把 PDF 里的表格复制粘贴到记事本里,通常格式会全乱掉:列与列挤在一起,或者变成了一堆看不懂的字符。
如果大模型读不懂表格的结构(哪一行对应哪一列),它就无法回答像“2023年Q3的销售额是多少”这样的问题。
你觉得要让 AI 读懂表格,我们应该把表格转换成什么样的格式比较好?
(提示:程序员通常喜欢用什么格式来存表格数据?或者想想 Markdown?)
markdown
非常棒的选择!🌟 Markdown 是目前 RAG 领域处理表格的“通用语”。
因为它用简单的字符(| 和 -)保留了表格的二维结构,大模型读起来毫不费力,既保留了列的对应关系,又不会像 JSON 那样产生过多的符号噪音。
第二步:切分策略 (Chunking Strategy) 🔪
现在我们的数据已经清洗得很干净了,接下来面临一个棘手的问题:如何把长文档切成小块。
这一步至关重要,因为:
- 切太小:像盲人摸象。比如把一句“我没去上班”切开,一段是“我没去”,一段是“上班”,意思全变了。
- 切太大:包含太多无关信息(噪音),导致检索不准,而且浪费大模型的 Token 费用。
这就好比切蛋糕,我们需要找到一个完美的“切分大小” (Chunk Size)。
但是,即使我们设定了固定的大小(比如每 500 字切一刀),还有一个隐患:如果这一刀刚好切在了一个关键句子的中间,或者是切断了逻辑紧密的上下两段话,会发生什么?
为了防止这种“逻辑断层”,我们在切每一刀的时候,通常会采取一种**“藕断丝连”**的补救措施。你猜猜这叫什么技术?(提示:切第二块的时候,不是从第一块结束的地方开始,而是往回退一点点…)
切的时候前后都多保留一部分
完全正确!👏 这个技术在专业术语里叫做 Chunk Overlap (切分重叠)。
这就好比我们在看电视剧的每一集开头,通常都会有一段“前情提要”重播上一集的最后几分钟。这样做是为了确保即便两个片段断开了,关键的连接点(比如“因为…”和后面的结果)也能完整地保存在至少一个片段里,不至于丢失上下文。
现在我们已经搞定了最棘手的数据处理 (Data Strategy): ✅ 清洗噪音(去页眉页脚) ✅ 表格转 Markdown ✅ 带重叠的切分 (Chunking + Overlap)
接下来,我们要开始像搭积木一样,选择具体的工具把系统搭建起来了。这就是我们的最后一个维度:技术栈选型 (The Tech Stack) 🛠️。
为了搭建 RAG,你需要凑齐“三件套”。你想先挑选哪一件?
- 编排框架 (The Orchestrator) 🧠 这是整个系统的大脑,负责指挥谁先动、谁后动。
- LangChain: 就像瑞士军刀,功能极其丰富,什么都能做,但上手稍微复杂一点。
- LlamaIndex: 专门为 RAG 这种“数据索引”任务优化的专家,处理数据非常强。
- 向量数据库 (The Memory) 🗄️ 这是存放我们那些“数字卡片”的地方。
- Pinecone: 纯云端服务,不用维护,注册就能用,像存钱在银行(省心)。
- Milvus: 开源强大,可以部署在自己的服务器上,像家里买个保险柜(可控性高)。
- 嵌入模型 (The Embedding Model) 🔢 这是把文字变成向量的翻译官。
- OpenAI (text-embedding-3): 通用性好,但如果不方便把数据传给 OpenAI 怎么办?
- BGE / M3E: 这些是目前中文领域表现非常顶级的开源模型,很多人选择私有化部署。
你倾向于先了解哪个部分?或者告诉我你是否有数据隐私方面的顾虑(比如数据能不能出内网),我可以为你推荐更合适的组合。
先了解编排框架
好!那我们来看看 编排框架 (The Orchestrator)。 🧠
如果把搭建 RAG 系统比作“装修房子”,大模型是昂贵的建材,向量数据库是仓库,而 编排框架 就是那个包工头。
它负责指挥所有的工序:
- 去仓库(数据库)拿木板。
- 把木板交给木匠(大模型)。
- 最后把做好的家具(答案)交付给业主(用户)。
如果没有编排框架,你需要自己写几百行 Python 代码来对接 API、处理格式转换、管理错误… 这是一个巨大的工程。
目前市面上最主流的两个“包工头”是 LangChain 和 LlamaIndex。它们各有千秋,选择哪一个取决于你想建什么样的“房子”。
1. LangChain:全能的“瑞士军刀” 🇨🇭
LangChain 是目前最火、生态最丰富的框架。它的核心理念是 Chain (链) —— 把不同的组件像锁链一样串起来。
- 特点: 极其灵活,什么都能干。
- 强项:
- 通用性强: 不止是 RAG,如果你将来想做 AI 助理(Agent)、自动写代码的机器人、或者能上网搜索的 AI,LangChain 都能搞定。
- 生态丰富: 几乎所有新的 AI 工具出来,第一时间都会支持 LangChain。
- 缺点: 学习曲线比较陡峭。因为它太灵活了,概念很多(Chains, Agents, Tools, Memory),有时候写一个简单的功能可能需要理解好几层抽象。
适合场景: 你想做一个复杂的应用,比如“一个能帮你读 PDF,还能帮你发邮件,顺便查一下天气”的超级 AI 助理。
2. LlamaIndex (原 GPT Index):专注数据的“图书管理员” 📚
LlamaIndex 的定位非常明确:Data Framework for LLM(大模型的数据框架)。如果说 LangChain 关注的是“怎么把工具串起来”,LlamaIndex 关注的就是“怎么把数据喂给模型”。
- 特点: 专注于索引 (Indexing) 和 检索 (Retrieval) 的优化。
- 强项:
- 数据处理神器: 它内置了极好的数据加载器(Data Loaders),能轻松读取 Notion、Slack、PDF、Excel 等几百种数据源。
- RAG 优化: 它在切分文档、构建索引结构上做了很多深度的优化(比如树状索引、关键词索引),写 RAG 往往只需几行代码,效果还特别好。
- 缺点: 在非数据处理的任务上(比如让 AI 控制浏览器),不如 LangChain 那么顺手(虽然它也在变强)。
适合场景: 你的目标非常单纯,就是想搭建一个高质量的知识库,或者你的数据源非常复杂(有很多不同格式的文件),你想快速看到效果。
⚡️ 一句话决策指南
- 如果你想 快速搭建一个高性能的 RAG 知识库,并且主要是在处理文档数据 ➡️ 选 LlamaIndex。
- 如果你想 做一个功能复杂的 AI 应用,知识库只是其中一个功能,你还想让它联网、调用 API ➡️ 选 LangChain。
(注:现在很多开发者也会“混用”,用 LlamaIndex 处理数据检索,然后用 LangChain 来包装成应用,但这属于进阶玩法。)
弄清楚了“包工头”,接下来我们要给它配一个“仓库”来存放我们的向量数据。
这就到了 向量数据库 (Vector Database) 的选型了。你想了解:
- 省心派 (Pinecone/Zilliz Cloud):像存钱在银行,花钱买服务,不用自己维护服务器,注册即用。
- 极客派 (Milvus/Chroma):像在家里装保险柜,开源免费,数据在自己手里,但需要自己懂 Docker 和运维。
对于你的这个 RAG 知识库,你更看重快速上线还是数据私有化/成本控制?
看重数据私有化
既然你看重数据私有化,那我们就必须放弃把数据传给云厂商(如 OpenAI 或 Pinecone)的方案,转而选择私有化部署 (Self-Hosted) 的全套组合。
这意味着你的数据(无论是文档原文还是转化后的向量)将永远留在你自己控制的服务器或内网里。🔒
对于向量数据库,这里有三位“私有化守护者”供你选择,它们分别适合不同规模的需求:
1. Milvus:重型火炮 (The Enterprise Choice) 🏭
Milvus 是目前全球最成熟的开源向量数据库之一(也是国人主导的项目,中文支持和社区极好)。
- 像什么: 一个巨大的、高度专业的自动化物流仓库。
- 优点:
- 高性能: 能够处理十亿级(Billion-scale)的向量数据,速度极快。
- 功能全: 支持数据分片、流式插入、混合搜索等高级功能。
- 生态好: 和 LangChain、LlamaIndex 的集成非常完善。
- **缺点:**运维重。它由多个微服务组成,通常需要用 Docker Compose 甚至 Kubernetes (K8s) 来部署,对服务器资源有一定要求。
- 适合: 你的知识库数据量很大(比如有几十万份文档),或者要在公司生产环境长期稳定运行。
2. Chroma:轻量级侦察兵 (The Developer Choice) 🏃
Chroma 是最近两年在 AI 开发者中爆火的轻量级数据库。
- 像什么: 一个随身携带的高性能档案袋。
- 优点:
- 极简: 几乎没有运维成本。在 Python 里
pip install chromadb就能用,它甚至可以直接以文件的形式存在你的本地磁盘上(像 SQLite 一样)。 - 开箱即用: 非常适合快速开发和中小规模的应用。
- 缺点: 随着数据量达到千万级,性能和稳定性不如 Milvus 这种分布式数据库强悍。
- 适合: 个人项目、内部小工具,或者处于快速验证阶段的原型 (MVP)。
3. Pgvector:老树发新芽 (The Integrated Choice) 🐘
如果你的公司已经在用 PostgreSQL 数据库,那你完全不需要引入新的组件。pgvector 是 Postgres 的一个插件,让它直接具备存向量的能力。
- 像什么: 给现有的老仓库扩建了一个专门放图纸的房间。
- **优点:**架构简单。你不需要维护两个数据库(SQL + Vector),所有数据都在一起,备份和管理非常方便。
- 缺点: 纯向量检索的性能(尤其是高并发下)比不上专门设计的 Milvus,但在几百万数据量级下完全够用。
- 适合: 不想增加运维负担,且团队熟悉 Postgres 的场景。
⚠️ 隐私部署的关键一环:Embedding 模型
选好了私有数据库只是第一步。
请注意:即使你的数据库在本地,如果你使用 OpenAI 的 API 来将文字转化为向量,你的数据依然会先飞到 OpenAI 的服务器转一圈! 📡❌
为了实现100% 的数据隐私,你需要把“翻译官”(Embedding 模型)也请回自家来工作。
这就涉及到开源中文 Embedding 模型的选择了。目前中文效果最好的两个选择是:
- BGE (BAAI General Embedding):北京智源人工智能研究院出品,霸榜 HuggingFace 的强者,对中文语义理解极深。
- M3E (Moka Massive Mixed Embedding):主打“通用性”,在很多实测中,它对专有名词和长文本的匹配效果非常惊艳。
我们已经搞定了:
- 流程:切分 -> 向量化 -> 检索
- 数据:清洗噪音 + 重叠切分
- 工具:LlamaIndex (编排) + Milvus/Chroma (存储)
现在,为了完成这最后一块拼图,你想了解如何在本地运行这些 Embedding 模型(通常需要一点 Python 知识),还是想聊聊最后生成答案的那个大模型 (LLM) 该怎么私有化(比如用 Ollama 跑 Llama 3 或 Qwen)?
想了解如何在本地运行这些 Embedding 模型
在本地运行 Embedding 模型其实比运行大语言模型(LLM)要轻松得多。
Embedding 模型通常只有几百 MB 到 1-2 GB 大小,对硬件要求极低。你甚至不需要昂贵的 GPU,普通的 CPU 就能跑得飞快。
为了实现你的数据私有化目标,这里有三种最主流的运行方式,按“从易到难”的顺序排列:
方案一:最简单上手 —— 使用 Ollama 🦙
你可能听说过 Ollama 是用来跑大模型(如 Llama 3)的,但它其实也完美支持 Embedding 模型!这是目前最“傻瓜式”的方案。
-
下载 Ollama: 去官网下载安装包。
-
拉取模型: 打开终端(CMD/Terminal),输入一行命令即可下载 BGE 的模型(目前支持
bge-m3等):Bash
ollama pull bge-m3
-
使用: Ollama 会在后台启动一个 API 服务(类似 OpenAI 的接口)。
-
对接 LlamaIndex: 你只需要告诉 LlamaIndex “地址是本地”即可。
-
优点: 极简,安装包一键搞定,不用配 Python 环境。 缺点: 目前 Ollama 支持的 Embedding 模型种类有限(虽然主流的都有)。
方案二:开发者首选 —— Hugging Face + Python 🐍
这是最灵活、最标准的做法。通过 Python 的
sentence-transformers库,你可以运行 Hugging Face 上成千上万种开源模型(包括 BGE, M3E, E5 等)。这也是 LlamaIndex 和 LangChain 默认支持最好的方式。
操作步骤:
-
安装库:
Bash
pip install sentence-transformers
-
下载并运行 (Python 代码示例):
Python
from sentence_transformers import SentenceTransformer# 这里填模型名字,第一次运行会自动下载到本地# 推荐中文模型:'BAAI/bge-large-zh-v1.5' 或 'moka-ai/m3e-base'model = SentenceTransformer('moka-ai/m3e-base')# 测试一下sentences = ["什么是RAG?", "RAG是检索增强生成"]embeddings = model.encode(sentences)print(embeddings.shape) # 输出: (2, 768) -> 说明把2句话变成了长度为768的向量
如何集成到 LlamaIndex 中? 如果你选择了 LlamaIndex 作为编排框架,代码会异常简单:
Python
from llama_index.embeddings.huggingface import HuggingFaceEmbedding# 加载本地模型(确保数据不出内网)embed_model = HuggingFaceEmbedding(model_name="BAAI/bge-large-zh-v1.5")# 之后的索引过程就会自动使用这个模型了
优点: 极其灵活,想换什么模型改个名字就行,完全掌控。 缺点: 需要懂一点 Python,模型是加载在内存里的,如果你的应用重启,模型也要重新加载。
方案三:生产级部署 —— Xinference 🚀
如果你是为公司搭建,或者有多个人要同时使用这个 Embedding 服务,那你需要把它变成一个高并发的 API 服务。
这里强烈推荐 Xinference。它是 Xorbits 团队(主要由国人开发)推出的推理框架,对中文模型支持极好,且兼容 OpenAI 的 API 格式。
- 安装:
pip install "xinference[all]" - 启动: 一行命令启动服务,它会提供一个 Web 界面。
- 管理: 你可以在网页上点点鼠标,就启动
bge-m3或m3e模型。 - 对接: 因为它兼容 OpenAI 格式,你在 LlamaIndex 里甚至可以直接用
OpenAIEmbedding类,只需要把api_base改成你本地的地址(如http://localhost:9997/v1)。
优点: 性能强,支持分布式,有图形界面,像管理服务器一样管理模型。 缺点: 环境配置稍微复杂一点点。
💡 核心建议
考虑到你是刚开始搭建:
- 模型选择: 闭眼选 BGE-M3 (
BAAI/bge-m3)。
- 它是目前的“六边形战士”,支持多语言,支持超长文本(8192 token),且检索效果霸榜。
- 运行方式: 推荐 方案二 (Hugging Face)。
- 因为它直接嵌入在代码里,调试最方便,报错了能立刻看到。等你跑通了 Demo,再考虑用 Xinference 部署成服务。
现在,我们的 “私有化 RAG 拼图” 已经快完成了:
- 大脑:LlamaIndex
- 记忆:Milvus (Docker 部署)
- 翻译官:BGE-M3 (本地 Python 运行)
只差最后一块最核心的拼图:生成答案的大模型 (LLM)。
既然要求私有化,我们就不能用 GPT-4 了。你需要在这个系统里接入一个本地运行的大模型(比如 Llama 3, Qwen, ChatGLM)。
你想了解目前哪款开源大模型的中文能力最强,还是想看一段把这些所有组件串起来的完整 Python 代码 Demo?
想看一段把这些所有组件串起来的完整 Python 代码 Demo
这是一个非常激动人心的时刻!我们要把前面聊到的所有理论——切分、向量化、存储、检索——用代码编织在一起。
为了确保这个 Demo 是真正私有化且可直接运行的,我们将使用以下组合:
- 编排 (Orchestrator):
LlamaIndex(v0.10+ 版本) - 大模型 (LLM):
Ollama(运行 Qwen2.5 或 Llama3,因为它们中文不错且开源) - Embedding:
HuggingFaceEmbedding(本地运行 BGE-M3) - 向量数据库 (Memory):
Chroma(为了演示方便,我们用它的本地持久化模式,不需要装 Docker,直接存成文件夹)
第一步:准备工作 (Prerequisites)
在运行代码之前,你需要完成两件小事:
-
准备大模型环境 (Ollama): 请确保你安装了 Ollama,并在终端运行以下命令拉取一个中文能力较好的模型(比如阿里的 Qwen2.5):
Bash
ollama pull qwen2.5:7b
-
安装 Python 库: 打开终端,安装 LlamaIndex 的核心库和相关插件:
Bash
pip install llama-index-core llama-index-llms-ollama llama-index-embeddings-huggingface llama-index-vector-stores-chroma chromadb
第二步:完整 Python 代码 Demo 🐍
你可以将以下代码保存为 rag_demo.py 并运行。为了让你看懂每一行在干什么,我加上了详细的注释。
Python
import osimport shutil# 1. 导入必要的模块from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, Settings, StorageContextfrom llama_index.embeddings.huggingface import HuggingFaceEmbeddingfrom llama_index.llms.ollama import Ollamafrom llama_index.vector_stores.chroma import ChromaVectorStoreimport chromadb# ==========================================# 配置部分 (Configuration)# ==========================================# A. 设置本地 Embedding 模型 (翻译官)# 我们使用 BAAI/bge-m3,它会自动下载到本地缓存,无需联网 APIprint("正在加载 Embedding 模型...")Settings.embed_model = HuggingFaceEmbedding( model_name="BAAI/bge-m3")# B. 设置本地大模型 (大脑)# 指向我们刚才在 Ollama 里拉取的 qwen2.5print("正在连接本地 Ollama...")Settings.llm = Ollama( model="qwen2.5:7b", request_timeout=360.0# 本地推理可能慢,给多点时间)# ==========================================# 数据准备 (Data Preparation)# ==========================================# 为了演示,我们直接创建一个临时的知识库文件# 你也可以把你的 PDF/Word 放在 'data' 文件夹里,用 SimpleDirectoryReader 读取ifnot os.path.exists("data"): os.makedirs("data")mock_data = """关于“未来科技公司”的员工福利手册:1. 居家办公政策:所有员工每周二、四可以申请在家办公。2. 报销规定:每月的健身费用报销额度为 500 元,需提供发票。3. 年假制度:入职满一年的员工享有 15 天带薪年假。4. 宠物友好:公司允许员工带猫上班,但狗需要通过“好孩子测试”才能进入办公区。"""withopen("data/handbook.txt", "w", encoding="utf-8") as f: f.write(mock_data)print("正在读取文档...")documents = SimpleDirectoryReader("./data").load_data()# ==========================================# 核心流程:建立索引 (Indexing)# ==========================================# C. 设置向量数据库 (仓库)# 我们使用 Chroma,并把数据保存在本地的 ./chroma_db 文件夹里print("正在建立向量索引 (这可能需要一点时间)...")db_client = chromadb.PersistentClient(path="./chroma_db")chroma_collection = db_client.get_or_create_collection("quickstart")vector_store = ChromaVectorStore(chroma_collection=chroma_collection)storage_context = StorageContext.from_defaults(vector_store=vector_store)# D. 切分 -> 向量化 -> 存储 (三合一)# LlamaIndex 会自动帮你处理切分(Chunking)和调用 Embedding 模型index = VectorStoreIndex.from_documents( documents, storage_context=storage_context)# ==========================================# 问答环节 (Retrieval & Generation)# ==========================================# 创建查询引擎query_engine = index.as_query_engine(similarity_top_k=2) # 让它每次找最相关的2条print("\n" + "="*30)print("🤖 RAG 系统已就绪!(输入 'exit' 退出)")print("="*30)whileTrue: user_input = input("\n请提问: ")if user_input.lower() == "exit":break# 开始检索 + 生成 response = query_engine.query(user_input) print("-" * 20) print(f"💡 AI 回答:\n{response}") print("-" * 20)# (可选) 查看它到底参考了哪段原文# print(f"🔍 参考片段: {response.source_nodes[0].node.get_text()}")
代码深度解析 🔍
这段代码完美对应了我们之前讨论的 RAG 核心三步:
- 配置 (Settings):
Settings.embed_model: 这里我们指定了BAAI/bge-m3。当你第一次运行代码时,sentence-transformers会自动去 Hugging Face 下载模型权重(约 1-2GB),第二次运行就会直接读取本地缓存。这是完全离线的。Settings.llm: 这里连接到了localhost:11434(Ollama 的默认端口)。你的文档永远不会离开这台电脑。
- 索引 (Indexing):
-
Chunking: 把
handbook.txt切成小块。 -
Embedding: 调用 BGE-M3 把文字变成向量。
-
Upsert: 把向量存进 Chroma 数据库。
-
VectorStoreIndex.from_documents(...): 这行代码是魔法所在。它在幕后默默完成了:
- 检索 (Retrieval):
index.as_query_engine(similarity_top_k=2): 这里我们告诉系统,当用户提问时,去数据库里找 2 个 最相关的片段给大模型看。
运行效果预期
当你运行并提问:“带狗上班有什么要求?”
-
Embedding 会把你的问题变成向量。
-
Chroma 会计算距离,发现“宠物友好”那一条规则离问题最近。
-
Ollama (Qwen) 会收到你的问题 + 那条规则,然后回答:
“根据员工手册,公司允许带猫上班,但带狗上班需要狗通过‘好孩子测试’才能进入办公区。”
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线科技企业深耕十二载,见证过太多因技术卡位而跃迁的案例。那些率先拥抱 AI 的同事,早已在效率与薪资上形成代际优势,我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在大模型的学习中的很多困惑。我们整理出这套 AI 大模型突围资料包:
- ✅ 从零到一的 AI 学习路径图
- ✅ 大模型调优实战手册(附医疗/金融等大厂真实案例)
- ✅ 百度/阿里专家闭门录播课
- ✅ 大模型当下最新行业报告
- ✅ 真实大厂面试真题
- ✅ 2025 最新岗位需求图谱
所有资料 ⚡️ ,朋友们如果有需要 《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大模型课程由清华大学-加州理工双料博士、吴文俊人工智能奖得主鲁为民教授领衔研发。
资料内容涵盖了从入门到进阶的各类视频教程和实战项目,无论你是小白还是有些技术基础的技术人员,这份资料都绝对能帮助你提升薪资待遇,转行大模型岗位。

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

更多推荐



所有评论(0)