从当下AI Agent 开发的招聘热门给大家分享一下企业级 RAG 的构建流程,以及如何才能从0 到 1 构建出一个让客户满意的 RAG 知识库系统。
引言
前段时间很火的 LLM WIKI,Osbian这些概念火的太快,很多人都在说:还搁这儿学 RAG 呢,早过时啦。但是过不过时,可能只有那些老牌程序员或者具有大厂前瞻性思维的朋友才会清楚,更或者,你去看看GitHub 上那些开源很火的 RAG 框架,比如 RAGFlow ,LightRAG,GraphRAG,他们的星星可是一点没少哦。
再多 bb 一句,现在这些新概念一天一个,AI 时代的 GitHub Star 就跟坐火箭一样,三天不见就又听到 xx 框架火啦,xx 过时啦。少看点贩卖焦虑的文章,都是 qu
本文篇章耗时三天打造的万字长文,好多东西都是我自己一步一步踩的坑又填上的坑,所以读起来肯定会耗时间,并且在某些地方可能不太能理解为什么我要这么去设计,可以尽情留下你的留言,我看到了就会第一时间回复。
文章将从以下几个话题开始延伸:
- RAG 扫盲,什么是 RAG
- 目前大模型的能力已经很强了,为什么还要我们来构建 RAG
- 开源的 RAG 框架那么多,为什么不开箱即用呢
- 不同格式的文档(文本,视频,音频)我该怎么切分,怎么清洗
- 512-4096 维度的存储,我应该如何选型才能检索的又快又准
- 涉及到 embedding 和 Reranker 的时候,我应该用哪一套组合
- Chroma、Faiss、Milvus、PGSQL、ES这么多向量存储引擎,我又该选哪个,索引如何才能优化
- 我的 RAG 检索结果总是乱飘,要不要用知识图谱体系
- 大文档已经入库了,但是文档更新了怎么办?整库重建?单文档切块更新?
- LaLamaIndex 和 Langchain 到底哪个更适合做 RAG
- 如何才能把我的 RAG 和智能体结合起来,最终构建出一个让客户满意好用的 RAG 系统
不知道你看到这些问题的时候是不是想起来了你被面试官拷打的场景了,又或者有面试官恰巧看到我这篇文章,有没有命中你在拷打面试者的情况
什么是 RAG
RAG 技术,最开始在 2020 年的时候一篇论文《Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks》提出,最开始的设想就是用来解决大模型自预训练阶段的知识无法满足实时更新的需求,所以就提出来了通过外部的知识库向大模型注入的这种思想,所以就有了 RAG 技术。
RAG 技术,主要的核心就是:检索,增强,生成,由一句话从库中检索出某个大模型不具备的知识,再交由大模型进行增强扩充,最后生成结果返回给用户。
通俗的例子:假如 A 是大模型,你向 A 提问,门口路边那个烧烤店昨天改了价格,你知道多少钱吗?A 肯定不知道,但是这时候有个地方存储了这个更新后的菜单价格,就可以在回答的时候根据你的提问去找到这家烧烤店的最新价格,然后告诉 A,A 这时候就能直接回答你了
所以,我们构建 RAG 是为了解决大模型在预训练阶段不存在的知识,在回答方面出现的幻觉问题,例如:企业内部员工培训手册,福利待遇,又或者是一些私有的文档。
各开源RAG框架对比
了解 RAG 的朋友可能或多或少都听过一些著名的 RAG 框架,比如 LightRAG 主打轻量化,GraphRAG 主打图谱检索,RAGFLow 主打编排。
我也不是说这些框架不好用,人家开源出来肯定是有实际使用地方的。但是框架始终是具有黑盒性,你无法高度定制化,稍不注意改人家代码就改崩,并且有些时候框架的功能在我们的落地场景中也可能存在过度设计的情况。
但是虽然我们用不了这些开源框架,但是我们是可以学习人家的设计思想的,用一张 Gemini 生成的对比图给大家看看他们的设计思想这些。
GraphRAG:面向知识图谱的 RAG 框架,通过复杂且庞大的知识图谱来构建整个检索体系,本质上其实是一次耗费成本巨大的构建和廉价的查询; 这样做的优点:查询结果及其准确,是 RAGFLow 和 LightRAG 无法比的,但是缺点也非常明显:对知识的准备要求高,构建成本的成本高,灵活性以及扩展性都比较差
LightRAG:听名字就知道,很轻量化,设计思想主要是两个层面,通过细粒度实体关系完成精细化检索,然后通过实体作为社区聚合类来完成宏观上的表达。优点就是:极致的轻量化,构建快,部署也快,但是在稍微复杂的知识体系上可能就稍逊 GraphRAG 了
RAGFlow:GitHub Star 最多的RAG 框架,通过传统的关键字检索+向量语义检索(这也是我们主推的设计思路)并且在数据处理方面,也有多层架构流水线处理,同时解决掉复杂文档和简单文档的清洗,切分;而且有意思的是,这哥们儿在最近的版本直接把 GraphRAG 和 Light 的设计思路揉进去了,把图谱的检索变成了一个可插拔的插件。所以这个框架也是我们学习的一个好框架,我能想到唯一的缺点就是太重了,定制化不好做。
再强调一下:我并不是说不让你用这些框架,我们学习的永远是设计思路!!!不是框架本身,当你有那个能力的时候你也能做出一款这样的框架。
文本清洗,切分的艺术
这个标题起的有意思,我自己都笑了。
当我们开始着手准备构建一个 RAG 系统时,第一件事就直接劝退大多小白,文档格式辣么多,怎么洗?
当然是人工洗啊,不然指望谁给你洗。
我们的文本格式从 txt,word,Excel,pdf,ppt 这种稍微带有结构化性质的文档,再到图片,音频,视频资料这种非结构化的文档,所以想要设计一个通用的数据清洗基本上是不可能的,那我们只能从架构设计上动手了。
文档暂且分为三类:简单文档和复杂文档以及多模态文档。这里的简单指的时,txt,Excel ,pdf 那种行列或者结构清晰的数据,这种文档我们可以借助 Python 的一些通用文档解析包,比如:pandoc,python-doc,docx2txt;
但是对于那种复杂的扫描件,又或者是图文混合的文档,这时候你会发现,传统的 Python 包搞不定了,那咋整?考虑多层降级解析,目前我了解到最好的开源工具:Mineru,支持私有化部署和在线调用;让这个工具作为第一层解析,但是 mineru 我发现在解析层面也会遇到某些图片数据解析后是乱码的情况,那么此时用第二层降级:ocr或者VL 视觉模型,通过这两种方式对文本内容进行提取,再者还不行,那就上一点成本最大的方案,整份文档交给模型解析数据(仅限于数据少的)。
对于音视频信息,如果视频内容非常复杂且庞大,建议是通过 ASR 音频解析文本+截图抽帧 ocr+vl 方案文本提取。
所以到这里,我们的数据清洗层就算是搭建了一个稍微完善一点的前置步骤。
我们拿到文本后,切分怎么办?一股脑的滑动窗口切分?又或者不管 3721 直接就父子切分?那考没考虑过不同文档大小的情况下,切分的块和滑动窗口如何设计大小?
所以针对上述的几种文本格式,我们会考虑以下几种对应的切分方式:
- 固定大小切分,根据文档大小固定的 100,200 字符进行拆分
- 字符切分,某些文档按行的句号,感叹号分好段的,那么我们可以直接根据这种方式进行切分
- 结构化切分,顾名思义,一页一个块,适用于 ppt,markdown 文件这些
- 滑动窗口切分,这也是用的多的。主要思路就是借助一个文档重叠区域来尽可能减少上下文语义丢失的情况
- embedding 语义或者大模型语义切分,将一份文档交由 embedding 或者大模型按照语义进行拆分,但是这种对于 embedding 模型的要求较高,尤其是业务方向上的 embedding 和大模型,比如医疗,金融,审计等等
- 父子切分,这也是用的多的,对父块进行上述的几种切分方式得到大块,再对这个大块按照上述的切分方式得到小块,检索时用小块做检索,返回上下文则直接返回大块
- 特殊音视频,根据ASR 解析文本得到时间刻度,再根据刻度进行切分+minio 存储检索
所以上述的几种方案,我们用一张图来描述就是:
向量库怎么选?
技术发展到现在,向量库真的是百花齐放,从老牌的 Milvus,Chroma,Faiss,再到 pgsql,es,而且听说 MySQL 的 v9 版本也要开始搞向量化了,看样子是真的被 AI 时代拉着走。
首先来说,Chroma 和 Faiss 两款属于是内存向量库,这是什么意思应该不用我多说了吧,你敢放几百万数据到内存?就算有磁盘持久化,在高并发和索引方面也不够亮眼,但是可以玩玩,写一段伪代码如下:
import numpy as npfrom sentence_transformers import SentenceTransformerfrom dd_vectordb import FAISSVectorDB, ChromaVectorDB# --- 1. 初始化嵌入模型 (此例使用通用多语言模型)embedder = SentenceTransformer('sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2')texts = [ "LangChain 是一个用于构建大语言模型应用的框架。", "向量数据库是实现语义搜索的关键技术。", "今天天气真好,适合出去散步。",]# 生成向量embeddings = [embedder.encode(t).tolist() for t in texts]# --- 2. 定义接口函数,方便切换数据库def get_vector_db(backend: str): if backend == "faiss": # 使用 FAISS,必须指定向量维度 (此模型为 384) db = FAISSVectorDB(dimension=384, metric="cosine") elif backend == "chroma": db = ChromaVectorDB( collection_name="my_docs", persist_directory="./chroma_data" # 持久化存储路径 ) else: raise ValueError(f"不支持的数据库类型: {backend}") # 将数据加入数据库(核心逻辑完全一致) db.add_texts(texts=texts, embeddings=embeddings) return db# 3. 用户业务逻辑:从数据库进行检索的函数def search_similar(query: str, db): query_vec = embedder.encode(query).tolist() results = db.search(query_vec, k=2) for r in results: print(f"得分: {r.score:.4f} - {r.document.text}")# 4. 演示无缝切换(执行下面任意一行替换 db = get_vector_db(...) 即可)db = get_vector_db("faiss") # 使用 FAISS# db = get_vector_db("chroma") # 使用 Chromaprint("使用数据库:", type(db).__name__)search_similar("解释什么是向量数据库", db)再说说 pgsql,如果你的业务数据库本身就是 pgsql,那我是比较推荐你用的,从 0.16 的版本开始,pgsql 就支持安装 pgvector 插件来支持数据向量化了,这样做的好处就是可以完美无缝衔接你们的数据库,无需额外在构建一个数据库出来,但是在性能层面千万级别下算是可观,千万级别往上就开始捉襟见肘。
es 呢?目前来看比较优秀的一个,不支持事务,但是全文关键词检索,分布式存储且整个庞大的 ELK 生态都及其友好,如果你的业务系统(订单系统,商城系统)已经用上了 es 且有一整套完整的 ELK 系统,那我是建议你用这个的,而且对后续讲到的 BM25 也能完美融合。
Milvus:看官网描述说的是单机支持万亿,同样不支持事务,但是好处就是与 Python 和 Java 的生态整合及其简单,你甚至两行代码就能构建出一个 Milvus 向量库。同时支持 HNSW,IVF 等多种不同索引,检索效率与 es 不相上下。适用场景在与你如果是准备用 Python 生态构建一个 RAG,选型的时候我是建议你用 Milvus 的,安装部署也非常简单,且有分布式场景下的解决方案。
另外,因为大部分的数据库都支持多种索引,所以额外介绍下各种索引的应用场景。
向量库的索引和 MySQL 的索引都差不多,只是一个是结构化,一个是非结构化,都从检索性能上来描述,分为以下的索引:Flat,IVF,PQ,HNSW,LSH,IVF_SQ8,不同的索引在存储和检索精度上是有很大的差异的。
体现在数据量上,给个建议:
- <1万:直接用 Flat,精度100%,速度可接受。
- 1万 - 100万:IVF 或 HNSW。HNSW更快但内存大,IVF更平衡。
- 100万 - 1000万:HNSW(内存>32GB)或 IVF_PQ(内存受限)。
- 大于1亿:IVF_PQ 或 LSH,配合分布式存储。
在性能上:
- 追求极致速度:HNSW(内存换速度)> IVF_FLAT(较均衡)。
- 追求极致内存:PQ > SQ8 > IVF_FLAT。
- 追求绝对精度:Flat(但只适合小数据),或调高HNSW的ef_search参数(精度可接近99.9%)。
在我上面说的那些数据库中,常见的默认:
- FAISS:提供最丰富的索引,常用 IndexFlatIP (暴力余弦)、IndexIVFFlat、IndexHNSWFlat、IndexIVFPQ。
- Milvus:默认索引为 IVF_FLAT,还支持 HNSW、IVF_PQ、ANNOY 等。
- pgvector:默认使用 IVFFlat,还可以选择 HNSW(需编译扩展)。
- Chroma:底层封装了HNSW(通过hnswlib库)。
- Elasticsearch:提供 HNSW 或 IVF 等选择,8.0+版本默认使用HNSW。
| 索引类型 | 代表算法 | 核心思想 | 搜索速度 | 构建速度 | 内存占用 | 精度 | 适用场景 |
|---|---|---|---|---|---|---|---|
| 精确索引 | Flat (暴力) | 计算所有向量与查询的距离,返回TopK | 极慢 O(N) | 无构建过程 | 低(仅存原始向量) | 100% | 数据量<1万、对精度绝对要求、作为基准对比 |
| 基于聚类的 | IVF (倒排文件)IVF_PQ | 对全量数据K-Means聚类,检索时只搜索最近的几个聚类 | 快 | 中等 | 中(需存聚类中心) | 95-99% | 百万级数据、要求快速召回、对精度不极端敏感 |
| 基于量化的 | PQ (乘积量化) | 将向量切分成多个子空间,分别压缩编码,大幅降低内存 | 中等 | 慢(量化训练) | 极低(压缩编码) | 85-95% | 十亿级数据、内存严重受限、可接受一定精度损失 |
| 基于图的 | HNSW | 构建多层图结构,贪婪搜索近似最优路径 | 极快 | 慢(图构建) | 高(需存储多层图) | 98-99% | 千万级数据、要求亚毫秒级延迟、内存充足 |
| 哈希家族 | LSH (局部敏感哈希) | 用一组哈希函数将相似向量以高概率映射到同一桶 | 快 | 快 | 低(仅存储哈希桶) | 70-90% | 超高维、极大规模、对精度要求不高 |
| 倒排+量化 | IVF_SQ8 | 先IVF聚类,再对残差标量量化(每个维度用1字节表示) | 较快 | 中等 | 低 | 90-95% | 内存敏感的大规模检索,比PQ实现简单 |
该说不说,DeepSeek 在总结这些东西方面挺牛逼的。
但是可能你在用这个向量库的时候会遇到一个选择,维度怎么选?维度是个啥?
在向量数据库和嵌入模型里,维度就是用来表示一个向量(一个物体、一句话、一张图)的数字个数。例如 512 维,意味着用一个包含 512 个浮点数的列表来描述一个对象。
可以类比为“空间坐标”:二维点是 (x, y),三维是 (x, y, z),而 512 维就是在一个 512 维的超空间里的一个点。维度越高,这个“坐标”能刻画的信息就越细腻、越丰富。
我们常见的开源向量模型的维度大多集中在 512-4096 之间,那么怎么选? 不同的维度带来的不同影响:
- 语义区分能力 高维度能捕捉更多细节:一段话的语法、语气、特定实体都能被编码到不同维度上。 低维度会丢失一些细微差异,但主要语义(主题、情感)仍能保留。
- 存储与内存 向量维度每增加一倍,存储空间就增加一倍(因为每个维度一个浮点数)。 例如:100 万个 512 维向量(float32)≈ 2 GB;同样数量 1536 维向量 ≈ 6 GB。
- 检索速度 暴力搜索(Flat)耗时与维度成正比:计算两个向量相似度需遍历所有维度。 ANN 索引(如 HNSW、IVF)虽然能大幅加速,但维度越高,索引构建越慢,查询延迟也会上升
别想着维度越高越好,这是一个很大的平衡点。有时候你的 RAG 检索召回率不高,或者答案与问题无关,维度的选择也是一个很大的影响点。
开源 embedding 和 reranker 那么多,我该选哪个
先讲述一个现实问题,为什么有了embedding 之后,我们还必须用 reranker?
Embedding 的本质是“模糊匹配”,不是“精准匹配”
Embedding 模型将文本映射到高维语义空间,相似的句子距离近。这个特性让它擅长理解意图,比如 “how to kill a process” 和 “how to terminate a task” 会被认为是相关的。
但问题在于:它会对所有召回结果统一计算相似度,容易被“局部语义相似但整体不相关”的内容干扰。例如,你搜 “苹果公司股价”,一篇讨论“苹果这种水果的种植技术”的文章可能因为“苹果”一词的语义而排得很前,即使它完全不相关。
为了效率,向量检索通常只返回 Top-K(如 100 个)最相似的文档。但这个 Top-100 里,可能有 20 个是真正有用的,剩下 80 个都是“看起来像但实际不相关”的噪声。如果直接将这 100 个喂给 LLM,不仅浪费 token,还可能因为混杂的错误信息干扰 LLM 的答案。
Reranker(通常是基于 Cross-Encoder 架构的模型)会同时将用户查询和每个候选文档拼接起来,输入到一个深度模型中,输出一个相关性得分(比如 0~1 之间的分数)。
这个过程非常打脑阔(因为每个文档都要过一次大模型),但极其精确:它能看到查询和文档之间的细粒度交互,而不是像 Embedding 那样先把两者独立编码再算余弦距离。
举个例子:
- Embedding:像两个陌生人分别写一份个人简介,然后对比简介的相似度。
- Reranker:让两个人面对面交谈,直接感受对方是否真正理解自己的问题。
所以典型的两阶段策略是:
- Embedding 召回:从海量文档中快速筛选出 Top-100 候选(快、宽泛)。
- Reranker 精排:对这 100 个候选逐一打分,选出 Top-5 真正相关的文档(慢、精准)。
那组合怎么选???
嗯,这个怎么说呢,如果你对场景要求不高,那就无脑直接bge-m3+bge-reranker-v2-m3组合就行,这一套组合是目前生产环境上最稳定最经受考验的。
当然同款产品,如果你的文档大多是中英混合文档,那么建议你考虑采用 Qwen 系列的Qwen3-Embedding-4B + Qwen3-Reranker-4B。
如果你的文档是纯中文且精度要求极高,那么建议你Youtu-Embedding + bge-reranker-large,在推理延迟方面,Jina Reranker v3这个 0.6B 的小模型反而比 Qwen 系列更快,简单的总结就是:
Embedding模型的参数量与维度参数量很大程度上决定了模型的上限。
像Qwen3-Embedding-8B、Youtu-Embedding这样的模型,凭借巨大的参数量能够学习到更复杂的语言模式。模型输出的向量维度则直接影响检索的精度和速度:维度越高,存储成本越高,检索速度越慢,但通常语义区分能力也越强(例如Qwen3-Embedding系列从0.6B的1024维到8B的4096维)。
Reranker模型的选择权衡 Reranker是基于Cross-Encoder架构的,它需要对每个(query, document)对进行联合推理,因此精度虽高,但计算成本也很高。因此,Reranker必须在精度和延迟之间做出权衡:追求极致精度时,可以考虑Qwen3-Reranker-8B;而在延迟敏感的生产环境中,Jina Reranker v3或 BGE-Reranker-v2-m3 是更务实的选择
BM25+RRF组合的离谱实力
先描述一下概念,BM25 是一种基于关键词统计的相关性评分算法,是传统搜索引擎(如 Elasticsearch、Lucene)的核心。
核心思想:
一个词在文档中出现得越多,文档越相关(词频 TF)。
但一个词在所有文档中出现得越普遍(如“的”、“是”),它的重要性就越低(逆文档频率 IDF)。
同时,对长文档会做惩罚(因为长文档更容易包含更多词)。
优点:
- 速度快,无需训练。
- 擅长精确匹配:用户输入“OpenAI 收购 Anthropic”,BM25 能精准匹配到包含这些词的文档。
- 对罕见词(如产品型号、法律条款编号)非常有效。
缺点:
- 无法理解语义:搜“苹果手机”永远找不到内容为“iPhone”但没写“手机”的文档。
- 对同义词、多义词无能为力。
举例: 查询 “机器学习 模型 部署” BM25 会给文档中高频出现这几个词的文档打高分,哪怕文档讲的只是 “Keras 模型保存” 而不是 “模型部署流程”
那 RRF 又是什么???
RRF 是一种不依赖具体分数、只依赖排名的融合算法。它用来把多个不同检索系统(如 Embedding 召回结果和 BM25 召回结果)的排序列表合并成一个统一的排序。
为什么需要 RRF?
Embedding 检索和 BM25 检索有互补性:Embedding 能理解语义,BM25 能精确匹配关键词。单独使用任一个都会漏掉一些好的结果。
但两者的相关性分数(Embedding 的余弦相似度 vs BM25 的得分)量纲不同,无法直接相加或比较。RRF 巧妙地避开了这个问题。
其实这些概念有点太过于生涩,无法轻易理解,但是看到这里了,那么一个完整的流程就出来了:
- 使用 Embedding 模型做向量检索,召回 Top-200。
- 使用 BM25 做关键词检索,召回 Top-200。
- 结果融合(RRF):将两路结果合并,得到 Top-100 候选。
- 精排(Reranker):使用 Cross-Encoder 模型(如 BGE-Reranker-v2-m3)对 Top-100 重新打分,选出 Top-5。
送入 LLM:将最终的 Top-5 文档作为上下文,与问题一起提交给大模型生成答案。
文档更新咋个办?是删库跑路还是拼一把重建
能提出这个问题,那说明业务场景是肯定存在的,一些常见的知识库文档更新后,偏偏就只更新那一点点。在你整个文档特别大的情况下,你全库重建?
所以到这里,你的处理目的就不是要简单的更新,而是怎么才能更优雅的更新了。
所以常见的方案就几种了:
- 小文档直接重建。
这种方案虽然有点暴力,但是无疑是最简单最高效的办法了。
- 单文档切块更新(比较恶心的维护方式)
什么意思?给每个块打个标记,弄一个唯一 Id,文档更新的时候,把这个块以及它的相邻块打成待更新(为啥要相邻自己想吧),然后把新块直接原子性更新进去,完事儿!
- 理想化的思路:文档 diff 更新
借助了块更新的思路,那就是直接比较两个新旧文档,找出不一样的地方,然后直接更新,但是这种方案大概率落地不了,因为文档太大就完蛋。
向量库不像 MySQL 那种结构化数据可以直接 update,所以维护数据也是一门比较讲究的艺术了。
Langchain和llamaindex怎么选?
这个问题,就跟当年问“Spring 和 MyBatis 到底用哪个”一样,属于经典引战题。
我的观点很直接:如果你只做 RAG,无脑 LlamaIndex;如果你要做更复杂的智能体(Agent)系统,LangChain 的生态更香。
LlamaIndex:专为“索引”而生
这哥们儿的名字就暴露了它的野心——索引。它的核心抽象就是“把各种各样的数据,索引成 LLM 能理解的格式”。
数据连接器(Data Connectors):LlamaIndex 内置了一大堆开箱即用的文档加载器,从 Notion、Slack 到数据库,拿来就用,这也是你前面文章里一直强调的“别重复造轮子”的思路。
索引构建极其优雅:你想要树索引?列表索引?关键词索引?向量索引?LlamaIndex 把各种索引结构抽象得很好,而且支持索引的组合和嵌套。前面花那么多篇幅聊的父子切分、滑动窗口,在 LlamaIndex 里都是几行配置的事。
查询引擎(Query Engine):它把“检索→后处理→合成答案”这条链路打包成了查询引擎,非常符合 RAG 的直觉思维。
一句话总结:LlamaIndex 是为 RAG 场景深度优化的框架,它把数据摄取和检索这件事儿,做到了极致。 如果你现在的核心任务就是高效、精准地搭建一个知识库问答系统,选它包没错。
LangChain 的野心明显更大,它想当 LLM 应用的“万能胶水”,而 RAG 只是它众多能力中的一个。它的核心抽象是“链(Chain)”和“智能体(Agent)”。
链式调用:你定义好步骤 A、B、C,LangChain 帮你串起来。步骤 A 是查询改写,步骤 B 是调用检索器,步骤 C 是调用大模型,这种流程化、可编排的思想,在你需要做复杂的多步推理时,会非常顺手。
智能体抽象:这是 LangChain 真正的杀手锏。智能体能自己决定“要不要查”、“查几次”、“查完干点啥”。比如用户问“帮我比较一下张三昨天的工资和上个月的平均工资”,智能体可能会先查昨天的工资条,再查上个月的工资表,最后在脑子里算一遍给你结果。
不要纠结“二选一”。这俩压根不是对立关系,你完全可以用 LlamaIndex 负责数据索引和检索,然后把构建好的“检索器”作为一个工具,挂载到 LangChain 的智能体上去。学习人家解决问题的思路,而不是站队。
收尾:怎么构建一个 RAG???
前面写了那么多,从清洗到切分,从向量库到精排,说到底都是在解决一件事:怎么在 99% 的情况下,把对的文档块,从海量知识里捞出来。
但只做到这一点,在客户眼里,你顶多是个“60 分的系统”。
客户要的不是一个更快的搜索框,客户要的是一个“懂他”的智能体。
那从 60 分到 90 分,缺的是什么?
- 引入“意图理解”与“查询改写”
用户问的问题,大概率不是你 RAG 能直接检索的。用户问:“我快疯了,你们这个系统的报表为什么老是加载不出来?”,这时候如果你把这个句子扔给 embedding 去检索,搜出来的大概率是“精神健康”、“压力管理”之类牛头不对马嘴的文档。
这时候,你要做的不是直接检索,而是让一个 LLM 先做一次意图理解与查询改写:LLM 会分析用户的原始愤怒发言,提炼出真正的检索意图:“系统报表加载失败的原因及排查方法”,然后用这个改写后的、干净精准的句子去检索。这一步,能让你的召回率从 30% 飙升到 80%。
- 实现“多跳推理”与“工具调用”
客户的问题往往不是单次检索能解决的。“公司去年在新能源领域,总投入是多少?其中,技术研发占比多少?”这种问题,你需要智能体自己去规划路径:先检索“去年新能源领域总投入”,拿到数字 5.7 亿;再检索“新能源领域技术研发投入”,拿到 2.1 亿;最后算一下 2.1/5.7,告诉用户是 36.8%。
这就是 LangChain 这类框架赋予智能体的核心能力:让 LLM 学会使用工具(检索器只是工具之一,还可以是计算器、代码解释器、天气 API),并自主规划解决一个复杂问题的步骤。
- 构建对话记忆与用户画像
这是“好用”的最后一公里。客户问:“上次那个离职的同事,他的社保停了没?”,几轮对话之后又问:“那给新来的那个小张的,办好了没?”
没有记忆的系统:“请问您说的是哪件事?”
有记忆的系统:它能记住上一轮上下文里讨论的是“离职同事的社保”,并从记忆里调取出“新来的小张”正在办理入职手续。它甚至能结合用户画像,知道提问者是 HR 部门的,所以优先在 HR 相关的文档里进行检索。
到这里,你给客户的不再是一个生硬的问答机器人,而是一个能记住上下文、理解潜台词、主动调用工具解决问题的智能助手。
最后,收个尾。
这篇文章从最底层的文本切分,一路聊到最上层的智能体设计,不知道你发现了没:真正让一个系统好用的,从来不是某一个单点技术有多炫酷,而是你把这些看似独立的技术(清洗、向量、精排、意图、记忆),像乐高积木一样,精心设计、稳定拼接在一起的那个架构。
任何告诉你“用了 xxx 框架,一天就能做出企业级 RAG”的,记住我前面那句话:都是 qu。
最后奉上整篇文章讲到的所有技术点的设计图和架构图:
Gemini 的图,感觉一般
学AI大模型的正确顺序,千万不要搞错了
🤔2026年AI风口已来!各行各业的AI渗透肉眼可见,超多公司要么转型做AI相关产品,要么高薪挖AI技术人才,机遇直接摆在眼前!
有往AI方向发展,或者本身有后端编程基础的朋友,直接冲AI大模型应用开发转岗超合适!
就算暂时不打算转岗,了解大模型、RAG、Prompt、Agent这些热门概念,能上手做简单项目,也绝对是求职加分王🔋
📝给大家整理了超全最新的AI大模型应用开发学习清单和资料,手把手帮你快速入门!👇👇
学习路线:
✅大模型基础认知—大模型核心原理、发展历程、主流模型(GPT、文心一言等)特点解析
✅核心技术模块—RAG检索增强生成、Prompt工程实战、Agent智能体开发逻辑
✅开发基础能力—Python进阶、API接口调用、大模型开发框架(LangChain等)实操
✅应用场景开发—智能问答系统、企业知识库、AIGC内容生成工具、行业定制化大模型应用
✅项目落地流程—需求拆解、技术选型、模型调优、测试上线、运维迭代
✅面试求职冲刺—岗位JD解析、简历AI项目包装、高频面试题汇总、模拟面经
以上6大模块,看似清晰好上手,实则每个部分都有扎实的核心内容需要吃透!
我把大模型的学习全流程已经整理📚好了!抓住AI时代风口,轻松解锁职业新可能,希望大家都能把握机遇,实现薪资/职业跃迁~