掌握RAG,让程序员小白轻松驾驭大模型——收藏必备的实战指南!

掌握RAG,让程序员小白轻松驾驭大模型——收藏必备的实战指南! 本文深入解析了RAG检索增强生成技术针对LLM的知识截止、幻觉和上下文窗口限制等问题提供了实用的解决方案。通过详细阐述RAG的完整流水线包括索引阶段和检索生成阶段以及使用LangChain.js和Dify搭建RAG系统的实例帮助读者理解和应用RAG技术。用户问我们公司的退货政策是什么“——Agent 不知道。问上周会议决定了什么”——Agent 更不知道。它不是不聪明是根本没看过这些资料。怎么办把公司所有文档塞进 PromptToken 炸了。微调模型成本太高、更新太慢。答案是 RAGRetrieval-Augmented Generation检索增强生成——先从知识库里搜到相关内容再喂给 LLM 生成回答。为什么需要 RAGLLM 有三个硬伤RAG 恰好能补硬伤一知识截止。 GPT-4o 的训练数据截止到某个时间点之后的事它不知道。你的公司文档、产品手册、内部 Wiki 更不用说——根本没在训练集里。硬伤二幻觉。 LLM 不知道的东西会编。问它一个不存在的 API它能编得有模有样。在客服、医疗、法律等场景幻觉是致命的。硬伤三上下文窗口有限。 就算你把所有文档塞进去128k token 也装不下一个中型知识库。而且 token 越多费用越高、注意力越分散。RAG 的思路很直觉不把所有知识都塞给 LLM而是先搜到相关的几段只把这几段当上下文传给 LLM。用前端类比——RAG 就像搜索引擎 AI 的组合▸用户提问 → 先在知识库里搜一搜类似 Elasticsearch▸搜到最相关的 3~5 段内容▸把这些内容连同用户问题一起发给 LLM▸LLM 基于真实资料回答不瞎编RAG 的完整流水线RAG 分两个阶段索引阶段离线 和 检索生成阶段在线。▎索引阶段Indexing——把文档变成可搜索的向量原始文档 → 加载 → 分块 → Embedding 向量化 → 存入向量数据库文档加载Loading读取各种格式——PDF、Markdown、HTML、Notion 导出、数据库文档分块Chunking把长文档切成小段通常 200~1000 token 一段向量化Embedding用 Embedding 模型把每段文字转成一个数字向量比如 1536 维存储Storage把向量存入向量数据库Pinecone、Chroma、Milvus 等▎检索生成阶段Retrieval Generation——用户提问时实时执行用户提问 → Embedding → 在向量库中检索相似文档 → 拼装 Prompt → LLM 生成回答查询向量化把用户的问题也转成向量相似度检索在向量库中找到最相近的 top-K 段上下文拼装把检索到的内容塞进 PromptLLM 生成基于真实资料生成回答动手用 LangChain.js 搭一个 RAG 系统用 LangChain.js 从零搭一个完整的 RAG 流水线。场景给前端团队做一个内部文档问答助手让同事可以问我们的组件库怎么用、部署流程是什么之类的问题。▎安装依赖npminstalllangchain langchain/openai langchain/community cheerio▎Step 1文档加载与分块import{RecursiveCharacterTextSplitter}fromlangchain/text_splitter;import{Document}fromlangchain/core/documents;// 模拟加载内部文档 const docs[new Document({pageContent:# 组件库使用指南## 安装///bashnpminstallour-company/ui-kit ///## Button 组件Button 组件支持 primary、secondary、danger 三种类型。 使用方式Buttontypeprimary提交/ButtonProps 包括type、size、disabled、loading、onClick。 size 支持 small、medium、large 三个值。## Modal 组件Modal 用于弹窗确认。必须传入 visible 和 onClose。 使用方式Modalvisible{show}onClose{()setShow(false)}内容/Modal支持 title、footer、width、maskClosable 等 Props。, metadata:{source:component-guide.md, category:组件库},}), new Document({pageContent:# 部署流程## 测试环境1. **提交代码到 feature 分支**2. **在 GitLab 上创建 MR**3. **MR 合并后自动触发 CI/CD 部署到测试环境**4. **测试环境地址https://test.our-app.com**## 生产环境1. **测试通过后从 develop 合并到 master**2. **在 Jenkins 上点击「构建生产」**3. **构建产物自动上传到 CDN**4. **需要运维确认后才会正式切流**5. **回滚方式在 Jenkins 选择上一个成功的构建版本重新部署**## 注意事项- 生产部署时间窗口工作日10:00-18:00 - 部署前需在群里通知 all - 大版本上线需提前一天在 TAPD 提上线申请单, metadata:{source:deploy-guide.md, category:部署},}),];// 分块每段500字符重叠50字符 const splitternew RecursiveCharacterTextSplitter({chunkSize:500, chunkOverlap:50,});const splitDocsawait splitter.splitDocuments(docs);console.log(E6DB74原始文档 ${docs.length}篇 → 分块后 ${splitDocs.length}段);分块策略是 RAG 效果的关键。几个核心参数参数说明推荐值chunkSize每段最大字符数500~1000中文建议偏小chunkOverlap相邻段重叠字符数chunkSize 的 10%~20%分割符优先级按什么切/n/n/n. 空格为什么要重叠 假设一段话被切成两半前半段讲Button 的 Props后半段讲Props 包括 type、size、disabled——不重叠的话搜到前半段就拿不到具体 Props 了。重叠保证上下文不断裂。▎Step 2Embedding 向量存储import{OpenAIEmbeddings}fromlangchain/openai;import{MemoryVectorStore}fromlangchain/vectorstores/memory;//1. 创建 Embedding 模型 const embeddingsnew OpenAIEmbeddings({modelName:text-embedding-3-small,});//2. 向量化 存入内存向量库 const vectorStoreawait MemoryVectorStore.fromDocuments(splitDocs, embeddings);//3. 测试检索 const resultsawait vectorStore.similaritySearch(Button 组件怎么用,3);console.log(检索到的相关文档);results.forEach((doc, i){console.log(/n--- 第 ${i 1}段(来源: ${doc.metadata.source})---);console.log(doc.pageContent.slice(0,100)...);});similaritySearch背后做了什么把Button 组件怎么用转成 1536 维向量跟向量库里所有文档段落计算余弦相似度返回最相似的 top-3 段生产环境该用什么向量数据库向量数据库特点适合场景MemoryVectorStore纯内存不持久化开发测试、小数据量Chroma轻量支持本地部署中小项目、快速验证Pinecone全托管免运维不想管基础设施Milvus高性能支持亿级数据大规模生产系统pgvectorPostgreSQL 扩展已有 PG不想加新依赖▎Step 3检索 LLM 生成import{ChatOpenAI}fromlangchain/openai;import{ChatPromptTemplate}fromlangchain/core/prompts;import{createStuffDocumentsChain}fromlangchain/chains/combine_documents;import{createRetrievalChain}fromlangchain/chains/retrieval;const llmnew ChatOpenAI({modelName:gpt-4o, temperature:0});//1. 构建 RAG Prompt const promptChatPromptTemplate.fromTemplate(你是公司内部文档助手。根据以下参考资料回答用户问题。 如果资料中没有相关信息请诚实说我在文档中没有找到相关信息。不要编造不存在的内容。 参考资料{context}用户问题{input});//2. 创建 RAG Chain const documentChainawait createStuffDocumentsChain({llm, prompt});const retrievervectorStore.asRetriever({k:3});const ragChainawait createRetrievalChain({combineDocsChain: documentChain, retriever,});//3. 提问 const responseawait ragChain.invoke({input:Button 组件支持哪些 Props,});console.log(回答, response.answer);console.log(引用来源, response.context.map(dd.metadata.source));输出回答Button 组件支持以下 Props - type按钮类型可选 primary、secondary、danger - size按钮尺寸可选 small、medium、large - disabled是否禁用 - loading是否显示加载状态 - onClick点击回调函数 使用方式Buttontypeprimary提交/Button引用来源[component-guide.md]LLM 的回答完全基于检索到的文档不会瞎编。而且还返回了引用来源用户可以追溯。在 Dify 中搭建 RAG零代码方案如果你不想写代码搭 RAG 管线Dify 是目前最好的开源替代——它提供了完整的知识库管理 RAG 编排 API 发布前端直接调接口就行。▎Dify 的 RAG 流程上传文档 → 自动分块 → 自动 Embedding → 创建应用 → 关联知识库 → 发布 API▎Step 1创建知识库在 Dify 控制台点「知识库」→「创建知识库」上传文档支持 PDF、Markdown、TXT、Notion 同步、网页抓取配置分块策略——自动 or 自定义选择 Embedding 模型——推荐text-embedding-3-small点「保存并处理」等待索引完成▎Step 2创建应用并关联知识库创建一个「聊天助手」应用在「上下文」中关联刚创建的知识库配置检索策略——向量检索 / 全文检索 / 混合检索设置 System Prompt让 LLM 基于检索结果回答▎Step 3前端调用 Dify APIasyncfunctionaskDify(question: string, conversationId?: string){const responseawait fetch(https://api.dify.ai/v1/chat-messages,{method:POST, headers:{Authorization:Bearer ${DIFY_API_KEY},Content-Type:application/json,}, body: JSON.stringify({inputs:{}, query: question, response_mode:streaming, conversation_id: conversationId||, user:frontend-user-001,}),});const readerresponse.body!.getReader();const decodernew TextDecoder();while(true){const{done, value}await reader.read();if(done)break;const chunkdecoder.decode(value);const lineschunk.split(/n).filter(lineline.startsWith(data: ));for(const line of lines){const dataJSON.parse(line.slice(6));if(data.eventmessage){process.stdout.write(data.answer);}}}}await askDify(部署到生产环境的流程是什么);Dify 的优势▸零代码搭 RAG——上传文档就能用▸可视化编排——拖拽式搭建 RAG 工作流▸开箱即用的 API——前端直接调支持流式▸自带评估工具——可以测试 RAG 效果、调优参数前端集成用 AI SDK 做流式 RAG在实际前端项目中推荐用 Vercel AI SDK 做流式集成——用户体验最好。▎Next.js API Route RAG// app/api/rag/route.tsimport{NextRequest}fromnext/server;import{streamText}fromai;import{openai}fromai-sdk/openai;import{getVectorStore}from/lib/vector-store;exportasyncfunctionPOST(req: NextRequest){const{messages}await req.json();const lastMessagemessages[messages.length -1].content;//1. 检索相关文档 const vectorStoreawait getVectorStore();const relevantDocsawait vectorStore.similaritySearch(lastMessage,3);const contextrelevantDocs.map(docdoc.pageContent).join(/n/n---/n/n);//2. 流式生成 const resultstreamText({model: openai(gpt-4o), system:你是公司内部文档助手。根据以下参考资料回答问题。 如果资料中没有相关信息诚实说不知道。 参考资料 ${context}, messages,});returnresult.toDataStreamResponse();}▎前端聊天组件// app/page.tsxuse client;import{useChat}fromai/react;exportdefaultfunctionRAGChat(){const{messages, input, handleInputChange, handleSubmit, isLoading}useChat({api:/api/rag,});return(divclassNamemax-w-2xl mx-auto p-4h1classNametext-2xl font-bold mb-4 内部文档助手/h1divclassNamespace-y-4 mb-4{messages.map((msg)(div key{msg.id} className{p-3rounded-lg ${ msg.roleuser?bg-blue-100ml-auto max-w-xs:bg-gray-100 }}{msg.content}/div))}{isLoadingdivclassNametext-gray-400思考中.../div}/divformonSubmit{handleSubmit}classNameflex gap-2inputvalue{input}onChange{handleInputChange}placeholder问点什么...classNameflex-1 border rounded-lg px-4 py-2/buttontypesubmitdisabled{isLoading}classNamebg-blue-500 text-white px-4 py-2 rounded-lg disabled:opacity-50发送/button/form/div);}几行代码就做了一个带 RAG 的聊天界面——用户输入问题后端检索知识库、流式返回前端实时渲染。进阶 RAG 技术基础 RAG 管用但效果还能更好。以下是几个生产中常用的优化手段。▎1. Re-ranking二次排序基础检索用向量相似度排序但向量匹配不等于语义最相关。Re-ranking 在检索结果上再做一轮精排效果显著提升。import{CohereRerank}fromlangchain/cohere;const rerankernew CohereRerank({model:rerank-v3.5, topN:3,});// 先检索 top-10再用 Reranker 精排到 top-3 const initialResultsawait vectorStore.similaritySearch(query,10);const rerankedResultsawait reranker.compressDocuments(initialResults, query);▎2. 混合检索Hybrid Search单纯向量检索有时候搜不到精确匹配——比如搜ERR_CONNECTION_REFUSED这种错误码关键词匹配比语义匹配更准。混合检索 向量检索 关键词检索两路结果合并排序。// Dify 中直接选「混合检索」模式即可 // 代码层面示例 const vectorResultsawait vectorStore.similaritySearch(query,5);const keywordResultsawait bm25Search(query, documents,5);// 用 Reciprocal Rank Fusion 合并排序 const mergedreciprocalRankFusion([vectorResults, keywordResults]);▎3. 查询改写Query Rewriting用户的问题往往不够精确。先让 LLM 改写查询再去检索命中率更高。const rewritePromptChatPromptTemplate.fromTemplate(请将用户问题改写为更适合知识库检索的查询。 - 去掉口语化表达 - 提取关键术语 - 如果问题模糊拆成2-3 个子查询 用户问题{question}改写后的查询每行一个);//这个 Button 的 loading 咋用→Button 组件 loading 属性 用法▎4. Self-RAG让 LLM 自己判断要不要检索不是每个问题都需要检索。你好不需要查知识库部署流程是什么才需要。const needRetrievalawait llm.invoke([{role:system, content:判断以下问题是否需要查询知识库。回答 YES 或 NO。,},{role:user, content: userQuestion},]);if(needRetrieval.contentYES){const docsawait retriever.invoke(userQuestion);// 走 RAG 流程...}else{const answerawait llm.invoke([...messages]);}RAG 效果评估RAG 搭完不是完事了——怎么知道效果好不好 需要量化评估。▎核心指标指标衡量什么怎么算检索命中率检索到的文档是否包含答案正确文档在 top-K 中的比例回答准确率LLM 的回答是否正确人工标注 or LLM-as-Judge忠实度回答是否忠于检索到的资料检查答案是否有超出资料的内容回答延迟从提问到回答的时间P50 / P99 延迟▎用 LLM-as-Judge 自动评估const evalPromptChatPromptTemplate.fromTemplate(你是 RAG 系统质量评估员。根据以下信息打分1-5 分 用户问题{question}参考资料{context}系统回答{answer}标准答案{groundTruth}评分维度1. **回答准确性是否正确回答了问题**2. **忠实度是否基于参考资料没有编造**3. **完整性是否覆盖了关键信息** 输出 JSON{accuracy:1-5,faithfulness:1-5,completeness:1-5,explanation:...});避坑指南▎坑 1分块太大或太小❌ chunkSize:2000→ 检索到一大段很多内容不相关浪费 token ❌ chunkSize:100→ 上下文太碎LLM 拼不出完整答案 ✅ chunkSize:500→ 刚好一个完整的段落或知识点经验法则chunk 大小让一段包含一个完整的知识点。中文文档建议 300~500 字符英文 500~1000。▎坑 2没有 metadata 导致无法追溯检索到了答案但用户问这是哪个文档说的——你答不上来。// ❌ 没有 metadata new Document({pageContent:Button 支持 primary 和 secondary 类型});// ✅ 带上 metadata new Document({pageContent:Button 支持 primary 和 secondary 类型, metadata:{source:component-guide.md, section:Button 组件, lastUpdated:2025-03-01, category:组件库,},});metadata 不仅用于追溯还能做过滤检索——比如只搜部署相关的文档。▎坑 3Embedding 模型和内容语言不匹配用中文文档Embedding 却用了纯英文模型——检索效果打折。场景推荐 Embedding 模型英文为主text-embedding-3-small中文为主text-embedding-3-small支持中文或BAAI/bge-m3多语言text-embedding-3-large追求性价比text-embedding-3-small维度 1536价格最低▎坑 4只用向量检索忽略关键词用户搜ERR_MODULE_NOT_FOUND 错误向量检索可能返回模块加载机制的文档——语义相关但不是用户要的。解法用混合检索。向量找语义相关的关键词找精确匹配的两路合并效果最好。▎坑 5文档更新了但向量库没更新知识库是活的——文档会修改、新增、删除。但向量库是拍快照的——索引建好后不会自动更新。解法▸增量索引文档更新时只重新索引变化的部分▸定时全量重建每天凌晨跑一次全量索引▸用 Dify 的文档管理内置了文档版本管理和自动重索引总结RAG 的核心思想不让 LLM 凭记忆回答而是先查资料再回答——就像开卷考试比闭卷考试更靠谱。搭一套 RAG 系统的关键步骤文档加载 分块——用RecursiveCharacterTextSplitterchunk 大小 300~500Embedding 向量存储——text-embedding-3-small性价比最高生产用 Chroma / Pinecone / pgvector检索 生成——createRetrievalChain自动串联检索和 LLM前端集成——AI SDKuseChat streaming体验最好进阶优化——Re-ranking、混合检索、查询改写效果提升显著两条路线选其一▸快速落地用 Dify 零代码搭 RAG前端调 API▸深度定制用 LangChain.js 全链路自建灵活度最高最后如果说程序员已经是高薪职业那么干AI的程序员就是高薪中的高薪。现在的市场已经用数据给程序员指明了方向学AI大模型就是冲刺高薪的最优解看着身边越来越多的同行转型大模型、拿到高薪offer很多人心里都动了心但真正的难题来了零基础小白不知道从哪入门有基础的程序员找不到系统学习路径实战项目练手无门面试不知道考什么别慌今天就给大家整理了一份【2026年最新版】AI大模型免费学习资源包覆盖从入门到实战、从理论到面试、从基础到进阶的全流程所有资料均已整理归档无冗余、无套路免费分享给每一位想抓住AI风口的程序员和小白扫码免费领取全部内容1、大模型系统化学习路线2、大模型学习书籍文档3、AI大模型最新行业报告4、大模型项目实战配套源码5、大模型大厂面试真题四阶段精细化学习规划附时间节点可直接照做结合上述资源给大家整理了一份可直接落地的四阶段学习规划总时长约2个月小白可循序渐进程序员可根据自身基础调整节奏高效掌握大模型核心能力快速实现从“入门”到“能落地、能面试”的跨越。第一阶段10天初阶应用该阶段让大家对大模型 AI有一个最前沿的认识对大模型 AI 的理解超过 95% 的人可以在相关讨论时发表高级、不跟风、又接地气的见解别人只会和 AI 聊天而你能调教 AI并能用代码将大模型和业务衔接。大模型 AI 能干什么大模型是怎样获得「智能」的用好 AI 的核心心法大模型应用业务架构大模型应用技术架构代码示例向 GPT-3.5 灌入新知识提示工程的意义和核心思想Prompt 典型构成指令调优方法论思维链和思维树Prompt 攻击和防范…第二阶段30天高阶应用该阶段我们正式进入大模型 AI 进阶实战学习学会构造私有知识库扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架抓住最新的技术进展适合 Python 和 JavaScript 程序员。为什么要做 RAG搭建一个简单的 ChatPDF检索的基础概念什么是向量表示Embeddings向量数据库与向量检索基于向量检索的 RAG搭建 RAG 系统的扩展知识混合检索与 RAG-Fusion 简介向量模型本地部署…第三阶段30天模型训练恭喜你如果学到这里你基本可以找到一份大模型 AI相关的工作自己也能训练 GPT 了通过微调训练自己的垂直大模型能独立训练开源多模态大模型掌握更多技术方案。到此为止大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗为什么要做 RAG什么是模型什么是模型训练求解器 损失函数简介小实验2手写一个简单的神经网络并训练它什么是训练/预训练/微调/轻量化微调Transformer结构简介轻量化微调实验数据集的构建…第四阶段20天商业闭环对全球大模型从性能、吞吐量、成本等方面有一定的认知可以在云端和本地等多种环境下部署大模型找到适合自己的项目/创业方向做一名被 AI 武装的产品经理。硬件选型带你了解全球大模型使用国产大模型服务搭建 OpenAI 代理热身基于阿里云 PAI 部署 Stable Diffusion在本地计算机运行大模型大模型的私有化部署基于 vLLM 部署大模型案例如何优雅地在阿里云私有部署开源大模型部署一套开源 LLM 项目内容安全互联网信息服务算法备案…扫码免费领取全部内容6、这些资料真的有用吗这份资料由我和鲁为民博士(北京清华大学学士和美国加州理工学院博士)共同整理现任上海殷泊信息科技CEO其创立的MoPaaS云平台获Forrester全球’强劲表现者’认证服务航天科工、国家电网等1000企业以第一作者在IEEE Transactions发表论文50篇获NASA JPL火星探测系统强化学习专利等35项中美专利。本套AI大模型课程由清华大学-加州理工双料博士、吴文俊人工智能奖得主鲁为民教授领衔研发。资料内容涵盖了从入门到进阶的各类视频教程和实战项目无论你是小白还是有些技术基础的技术人员这份资料都绝对能帮助你提升薪资待遇转行大模型岗位。这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】