【大模型RAG生成式AI开发实战】《大模型RAG生成式AI开发实战》_6.[第1章 RAG基础概念] 5分钟搭建你的第一个RAG应用:从零到一的实战

别再对着空白的IDE发呆了!5分钟后,你将拥有一个能读懂你私有知识库、回答得头头是道的AI助手。本文不灌鸡汤、不堆概念,直接带你从“这是啥”到“跑起来”,手把手完成你的第一个RAG应用,彻底告别“调包侠”的迷茫与自我怀疑!全文将围绕RAG的三大核心环节——知识入库、向量检索、增强生成展开,用最小化的知识集和最精简的代码,帮你绕过新手常见的环境地狱、切片翻车、检索玄学三大天坑。读完本文,你不仅能跑通第一个RAG应用,还能建立起对RAG工程化的正确直觉。
- 破除迷雾:RAG核心原理与最小知识集
- 轻装上阵:开发环境极简搭建指南
- 知识入库:文档切片与向量化实战
- 检索艺术:从“暴力搜索”到“精准召回”
- 生成闭环:组装完整的RAG链路
嗨,大家好呀,我是你的老朋友精通代码大仙。接下来我们一起学习 《大模型RAG生成式AI开发实战》6.[第1章 RAG基础概念] 5分钟搭建你的第一个RAG应用:从零到一的实战
俗话说得好,“饭要一口一口吃,代码要一行一行敲”。可在RAG这条赛道上,太多同学还没搞明白“检索”和“生成”是怎么握手言和的,就急着去研究什么混合检索、重排序、Agent化,结果环境配了三天,Demo还是没跑起来。你是不是也这样?收藏夹里躺了50篇RAG论文,GitHub Star了20个仓库,连LangChain的logo都盘出包浆了,却连一个能回答“咱们公司年假到底有几天”的机器人都没弄出来。别慌,这种“知识丰富但动手能力为零”的焦虑,我太懂了。今天这篇文章,就是来治这个病的。
破除迷雾:RAG核心原理与最小知识集
你是不是也这样?打开技术社区搜“RAG入门”,扑面而来的是“稀疏向量”、“稠密向量”、“查询重写”、“混合检索”这些黑话。还没开始学呢,血压先上来了。更离谱的是,有同学上来就啃Transformer论文,啃完问自己:我不是要做应用吗,怎么开始复习数学了?
这就是新手最容易踩的第一个坑:概念恐惧症。你把RAG想成了什么洪水猛兽,其实它骨子里特别朴素。
说白了,RAG就是一场“开卷考试”。大模型是那个聪明的考生,但它有个致命弱点:闭卷。它只学过训练数据里的知识,对公司内部文档、昨天刚发的通知、你私人的笔记,它一概不知。而RAG做的事情很简单:在考试(回答问题)之前,先帮考生把相关的教科书(你的私有文档)翻出来,摆在课桌(上下文窗口)上。考生看着书答题,自然就不会瞎编了。
咱们把这事儿拆成四步,你品品:
第一,你把公司制度、产品手册这些文档塞进去,切成小段,转成向量,存进向量库。
第二,用户问“加班费怎么算”,这个问题也被转成向量。
第三,去向量库里找跟这个问题最像的几个文档片段。
第四,把这些片段连同问题一起打包发给大模型,让它照着原文回答。
就这四步,没了。什么微调、什么强化学习、什么LoRA,在基础RAG里通通不需要。你不需要重新训练大模型,你只需要告诉它:“喂,答案就在这几段话里,你老实组织语言说出来就行。”
有位粉丝小王,之前非要拿公司10万条客服记录去微调ChatGLM,标注团队都累趴了,效果还一般,甚至出现了“模型学会了客服语气,但答错了产品参数”的诡异现象。我让他改成RAG,直接把FAQ文档切了塞进去,半天就上线了,准确率反而更高。你看,方向错了,努力就是内卷;方向对了,五分钟都是奢侈。
所以你的最小知识集是什么?记住三个词:切片、向量、上下文。剩下的,都是在这上面的锦上添花。当你觉得被各种新概念绕晕的时候,回到这三个词,你就不会迷路。
小结:RAG不是让大模型重新学习,而是给它配了一本实时更新的教科书。先理解“开卷考试”的本质,后面的代码才会有灵魂。
轻装上阵:开发环境极简搭建指南
好,原理明白了,撸起袖子就是干。结果第一步就给你当头一棒:CUDA driver version is insufficient、torch.cuda.is_out_of_memory、DLL load failed……熟悉吗?太熟悉了。多少英雄汉,倒在了环境配置这个新手村BOSS面前。
我见过最离谱的案例:一位兄弟为了本地跑一个7B大模型,显卡是GTX 1650,显存4G。他愣是在某宝上研究了三天怎么升级驱动,又在各种论坛上泡了两天,最后得出结论——“RAG这玩意儿对硬件要求太高了,我不配。”
停!谁跟你说RAG一定要本地跑大模型的?
这是第二个致命误区:把“RAG”和“本地部署大模型”强行绑定。对于新手来说,本地跑大模型那是后期副本,不是新手任务。你的第一个RAG应用,核心目标是验证数据流是否跑通,是理解“检索+生成”是怎么协作的。这时候,调用云端API才是性价比最高的选择。
现在国内国外一堆OpenAI兼容的API,比如智谱AI、通义千问、Moonshot,甚至直接用OpenAI的API。本地你只需要一个能跑Python的电脑,对,哪怕是你写Java用的那台办公本,都绰绰有余。
你需要装的东西极简:
pip install langchain langchain-openai chromadb sentence-transformers
就这四件套。LangChain负责串流程,OpenAI接口负责调大模型,ChromaDB负责当向量库(轻量、本地、零配置),sentence-transformers负责把文本转成向量。没有Docker,没有K8s,没有CUDA陷阱。
至于Embedding模型,新手别去碰什么庞大的GPT模型,直接用轻量级的,text2vec-base-chinese 或者 BAAI/bge-small-zh 都足够你玩明白原理。它们甚至不需要GPU,CPU跑起来嗖嗖的。你就算在星巴克用轻薄本,也能丝滑运行。
目录结构也清爽点:
my_first_rag/
data/ # 放你的私有文档,PDF、TXT都行
vector_db/ # ChromaDB自动生成的存储,不用你管
main.py # 主流程,咱们的主战场
别搞什么微服务架构、负载均衡,那是生产环境该考虑的事。你现在的任务是:在 main.py 里写出一个能跑的脚本,打印出第一句基于你私有文档的回答。这就够了。哪怕代码写得丑一点,没关系,先让马车跑起来,再去想怎么镶金边。
记住这个心法:环境搭建服从“快速验证”原则,任何让你卡壳超过半小时的环境问题,都应该考虑换一种更轻量的方案。咱们是来学RAG的,不是来修电脑的。
小结:新手的第一敌人不是算法,而是环境。用API代替本地大模型,用轻量Embedding代替庞然大物,先跑通数据流,再去追求私有化部署。
知识入库:文档切片与向量化实战
环境搞定了,文档也准备好了。然后你啪的一下把整本PDF扔进了向量库,自信满满地问:“我们公司年假有几天?”结果检索出来的第一个结果是公司发展史,第二个结果是组织架构图,第三个结果是财务制度。你要的年假信息,藏在第18页的一个表格里,死活搜不出来。
欢迎来到第三个天坑:文档处理翻车现场。
很多新手的错误做法堪称简单粗暴:用 PyPDFLoader 把PDF读出来,得到一个几百页的字符串,然后直接调用 Chroma.from_documents(documents=docs, embedding=embeddings)。这就好比把整本《新华字典》当作一个词条去查,向量模型直接懵了:“这啥啊?这么大一段,主题到底是啥?”检索的时候,它只能凭直觉返回一个跟整本书最像的片段,精度能高才怪。
还有另一个极端:切得太碎。有个同学设置了 chunk_size=50,一句话被切成两半,“加班”在前一段,“费计算规则”在后一段。向量检索倒是召回了一堆结果,但内容都是残肢断臂,大模型看了直呼“这题超纲”。
正确的姿势是什么?是有策略的切片(Chunking)。
咱们用的是 RecursiveCharacterTextSplitter,这个工具特别懂事,它会优先按段落切(\n\n),段落太长就按句子切(\n 或 。),还不够就按空格切,最后兜底按字符切。这样切出来的块,既不会太大导致主题模糊,也不会太小导致语义断裂。对于中文文档,chunk_size=500 左右是个不错的起点,大概覆盖1到2个自然段。
代码长这样:
from langchain.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
# 加载文档
loader = PyPDFLoader("data/employee_handbook.pdf")
docs = loader.load()
# 关键步骤:切片
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500, # 每块大约500字
chunk_overlap=50, # 块与块之间重叠50字,防止断句
separators=["\n\n", "\n", "。", "!", "?", " ", ""]
)
chunks = text_splitter.split_documents(docs)
# 入库
vectorstore = Chroma.from_documents(
documents=chunks,
embedding=embeddings,
persist_directory="vector_db"
)
看到 chunk_overlap=50 了吗?这就是魔鬼细节。它能让相邻两块共享一点上下文,比如“第三章 考勤制度”这句话如果刚好在边界,重叠区能保证它既出现在上一块的末尾,也出现在下一块的开头。检索时无论命中哪一块,都不会丢失关键的上下文信息。没有这个overlap,万一在“加班”和“费”之间切开,那场面简直惨不忍睹。
至于向量模型,新手用 sentence-transformers 里的 text2vec-base-chinese 就好。它会把每个chunk转成一组768维的数字(向量)。语义相近的句子,在向量空间里的距离就近。这就是机器能“读懂”你文档的秘诀——不是真读懂,是算距离。当你的文档变成一个个浮点数数组静静躺在ChromaDB里的时候,你的知识库就有了“可检索”的生命。
小结:文档入库不是简单的“复制粘贴”,而是精心的“分装打包”。合理的切片策略和重叠设计,是检索精度的第一道生命线。
检索艺术:从“暴力搜索”到“精准召回”
文档美美地躺在向量库里了,你迫不及待地敲下查询:
docs = vectorstore.similarity_search("加班费怎么算", k=3)
结果搜出来的三条,一条讲餐补,一条讲交通费,一条讲年度团建。真正的加班工资计算条例,排在了第8位,根本没进前三。你开始怀疑人生:是向量模型不行?是文档有问题?还是RAG本身就是个骗局?
别慌,这是第四个坑:默认检索策略太“直男”了。
similarity_search 就像一个只会按分数排名的考官,它只看“谁跟问题的向量最像”,完全不管搜出来的内容是不是重复、是不是覆盖了问题的不同侧面。更关键的是,k值选多少?选3,可能漏掉关键信息;选20,上下文窗口又塞不下,大模型直接“失忆”,看了后面忘了前面。
咱们得给检索加一点“情商”。
第一招,控制k值。对于大部分FAQ和企业知识库,k=3到k=5是黄金区间。太少了信息不够,太多了噪音太大。想象一下,你给大模型塞了20段参考资料,它跟个健忘症考生似的,根本抓不到重点。
第二招,使用MMR(Max Marginal Relevance)。这是检索界的“去重+多面手”算法。它的逻辑是:先从向量库里多抓一些候选(比如fetch_k=10),然后在这10个里面选3个。选的时候不仅看它们跟问题多相关,还看它们彼此之间差异有多大。这样就不会出现三条内容几乎一样的结果霸占你的上下文窗口,浪费宝贵的token。
代码改动极小,收益极大:
# 直男检索,容易召回重复内容
# docs = vectorstore.similarity_search(query, k=3)
# 高情商检索,兼顾相关性与多样性
docs = vectorstore.max_marginal_relevance_search(
query,
k=3, # 最终要3条
fetch_k=10 # 先抓10条候选,再优中选优
)
第三招,学会看分数调试。很多新手从来不看检索召回了什么,只看最终生成结果。这是典型的“黑盒调试”,纯纯的玄学编程。你得先确保喂给大模型的“食材”是对的,才能期待它做出好菜。试试这样:
docs_with_scores = vectorstore.similarity_search_with_score(query, k=5)
for doc, score in docs_with_scores:
print(f"相似度分数: {score:.4f} | 内容: {doc.page_content[:100]}...")
如果你发现分数都很低(比如超过0.5甚至更高,取决于距离度量),说明问题跟文档确实不在一个频道,这时候你该回去检查切片或者Embedding模型,而不是怪大模型不听话。
还有个工程小技巧:简单的关键词预过滤。如果你知道用户问的一定是“考勤”相关,可以在检索前先做个关键词过滤,把范围缩小到“考勤”标签下的chunk。这一招对于垂直领域极其好使,别嫌它“不AI”,工程上管用才是硬道理。
小结:检索是RAG的咽喉要道。别只用默认的相似度搜索,MMR、合适的k值、必要的关键词过滤,是你必须攥在手里的三板斧。
生成闭环:组装完整的RAG链路
检索的文档拿到了,怎么塞给大模型?有同学这样做:
context = "\n".join([doc.page_content for doc in docs])
prompt = f"以下是一些文档:{context}\n请回答问题:{question}"
然后大模型的回答开始放飞自我:引用错了文档编号,把不同片段的内容张冠李戴,甚至开始编造文档里没有的信息。你气得想砸键盘:“我都给你资料了,你怎么还胡说?”
这就是最后一个坑:Prompt工程与链式调用的缺失。你以为RAG是“检索结果+问题=答案”的简单拼接?Too young too simple。
大模型其实很“机械”,它需要清晰的边界感。你给它一堆文字,不告诉它“这是参考资料,这是用户问题,你只能基于参考资料回答”,它就会开启“创作模式”,开始一本正经地胡说八道。这不能全怪它,得怪咱们的Prompt写得太敷衍。
咱们得把Prompt写“规矩”:
from langchain.prompts import PromptTemplate
template = """你是一个严谨的企业知识库助手。请严格基于以下已知信息回答问题,不要编造答案。
如果已知信息不足以回答问题,请直接回复“根据现有资料无法回答”。
【已知信息】:
{context}
【用户问题】:
{question}
【回答】:"""
prompt = PromptTemplate(
template=template,
input_variables=["context", "question"]
)
看到了吗?用【】把区块隔离开,大模型就不容易犯迷糊。还要加上安全护栏:不知道就说不知道,这比瞎编强一万倍。在企业场景里,宁可让AI说“我不会”,也不能让它捏造一个假的报销额度,那后果可是要背锅的。
接下来是链式组装。LangChain的 RetrievalQA 就是帮你把“检索-拼接-调用LLM-返回答案”这一系列动作打包好的流水线:
from langchain.chains import RetrievalQA
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff", # 最直白的方式:把所有文档塞进一个Prompt
retriever=vectorstore.as_retriever(
search_type="mmr",
search_kwargs={"k": 3, "fetch_k": 10}
),
return_source_documents=True,
chain_type_kwargs={"prompt": prompt}
)
# 跑起来!
result = qa_chain.invoke({"query": "加班费怎么算?"})
print("AI回答:", result["result"])
print("参考文档:", result["source_documents"])
chain_type="stuff" 是什么意思?就是“填充”——把检索到的所有chunk直接填充到prompt的 {context} 里。这是最简单、最透明的模式,新手用它就对了。它的好处是你能很清楚地看到到底哪些内容被塞进了上下文,调试起来一目了然。等你后面遇到上下文超长的情况,再去研究 map_reduce 或 refine 这些高级模式。
更棒的是,我们设置了 return_source_documents=True,这样大模型不仅给出答案,还会告诉你它参考了哪几段原文。这对于企业应用来说太重要了,可解释性直接拉满。老板问你“这个结论哪来的”,你能直接把原文拍在桌上,而不是说“AI告诉我的”。
当你的终端第一次打印出基于你私有文档的、准确的、有引用来源的回答时,那种成就感,不亚于当年第一次写出 Hello World。你的第一个RAG应用,活了。它真的能看懂你的文档,真的在基于你的私有知识说话,而不是在背训练数据里的过时答案。
小结:RAG的临门一脚是Prompt工程和链式调用。给大模型清晰的指令边界,用RetrievalQA串起完整链路,让检索与生成产生化学反应,而不是简单拼接。
写在最后
老弟老妹们,咱们今天从零开始,把RAG这架飞机的骨架搭起来了。你学会了它“开卷考试”的本质,绕过了环境配置的泥潭,掌握了文档切片的颗粒度艺术,给检索装上了MMR的导航仪,最后用一条清晰的Prompt和Chain,让大模型老实交代出了答案。
这一路走过来,你发现没有?RAG并不是什么高不可攀的玄学。它是一层窗户纸,捅破了,里面就是工程化的细节:怎么切、怎么搜、怎么拼、怎么问。这些细节不需要你有多少数学功底,需要的是你对数据流的敏感,和“先跑起来”的工程直觉。
我知道,现在的AI领域信息爆炸,今天出个新模型,明天出个新框架,后天又出个新术语。看得多了,难免会焦虑,会觉得自己追不上。但我想告诉你的是,万丈高楼平地起,任何复杂系统的背后,都是由这些最基础、最扎实的模块组成的。你把RAG吃透了,后面去学Agent、去学多模态、去学更复杂的编排框架,都会事半功倍。
编程之路从来不易,但每一步成长都算数。别害怕报错,报错是代码在跟你对话;别害怕文档晦涩,你现在的每一点啃下来的硬骨头,都会变成未来面对复杂需求时的底气。保持好奇,保持动手,保持那份“我就不信跑不起来”的轴劲儿。你不仅能成为RAG的高手,更能在AI这波浪潮里,找到属于自己的那片天地。
咱们下回见,拜拜!
关注私信备注:“资料代找获取”,全网计算机学习资料代找:例如:
《课程:2026 年多模态大模型实战训练营》
《课程:AI 大模型工程师系统课程 (22 章完整版 持续更新)》
《课程:AI 大模型系统实战课第四期 (2026 年开课 持续更新)》
《课程:2026 年 AGI 大模型系统课 23 期》
《课程:2026 年 AGI 大模型系统课 21 期》
《课程:AI 大模型实战课 8 期 (2026 年 2 月最新完结版)》
《课程:AI 大模型系统实战课三期》
《课程:AI 大模型系统课程 (2026 年 2 月开课 持续更新)》
《课程:AI 大模型全阶课程 (2025 年 12 月开课 2026 年 6 月结课)》
《课程:AI 大模型工程师全阶课程 (2025 年 10 月开课 2026 年 4 月结课)》
《课程:2026 年最新大模型 Agent 开发系统课 (持续更新)》
《课程:LLM 多模态视觉大模型系统课》
《课程:大模型 AI 应用开发企业级项目实战课 (2026 年 1 月开课)》
《课程:大模型智能体线上速成班 V2.0》
《课程:Java+AI 大模型智能应用开发全阶课》
《课程:Python+AI 大模型实战视频教程》
《书籍:软件工程 3.0: 大模型驱动的研发新范式.pdf》
《课程:人工智能大模型系统课 (2026 年 1 月底完结版)》
《课程:AI 大模型零基础到商业实战全栈课第五期》
《课程:Vue3.5+Electron + 大模型跨平台 AI 桌面聊天应用实战 (2025)》
《课程:AI 大模型实战训练营 从入门到实战轻松上手》
《课程:2026 年 AI 大模型 RAG 与 Agent 智能体项目实战开发课》
《课程:大模型训练营配套补充资料》
更多推荐



所有评论(0)