RAG技术原理:索引构建与检索生成

📅 2026/7/15 3:54:43
RAG技术原理:索引构建与检索生成
大语言模型这几年进步飞快但在实际落地时有一个绕不开的短板知识截止日期。训练数据停在某个时间点之后发生的事情模型一概不知。问它你们公司的内部 Wiki 里怎么写接口规范问它上周刚发布的竞品文档里说了什么模型只能原地编。这种看上去很合理、实际上全瞎编的现象大家已经给它起了名字——幻觉。RAGRetrieval-Augmented Generation检索增强生成就是冲着这个问题来的。思路不算复杂不给模型死记硬背给它配一个可以实时查询的外部知识库。每次提问系统先去库里翻找相关材料找到之后连同问题一起丢给模型让模型对照材料来回答。这一整套流程拆开来就是三个环节索引构建、检索召回、答案生成。下面逐个拆开看。索引构建先把知识装进库知识库不会自己长出来。把文档变成可检索的知识要走三步分块、向量化、存库。1.1 文档分块一份产品手册可能有好几十页直接整篇丢进去做索引效果很差——用户问的是一个具体问题只在其中两三段里有答案剩下几十页全是噪音。分块就是把长文档切成一截一截的片段chunk每截单独建索引。这样检索时命中的是相关的那几句整篇文档里的无关内容不会掺进来。分块有几种做法固定大小分块按字符数或 token 数切比如每 512 token 一段。实现最简单但可能在句子中间下刀语义连不上。滑动窗口分块相邻两块之间留一段重叠比如每块 512 token跟前一块重叠 128 token。重叠区能兜住边界上的语义不会因为切在句子中间就丢了信息。递归分块按优先级试不同的分隔符——先找段落\n\n段落太长了再找句子\n句子还太长就按空格。这种方式能顺着文档的自然结构切比固定大小聪明不少。语义分块用 Embedding 模型算相邻句子的语义相似度在相似度跳变的地方下刀。一段讲模型训练下一段突然跳到推理部署相似度暴跌系统在这里切一刀。好处是每个 chunk 内部主题统一坏处是计算开销大。块的大小本身就是一个需要权衡的参数。太小了片段里语义不完整太大了无关信息混进去稀释信号。512~1024 token 是一个比较常见的选择区间具体还得看 Embedding 模型支持多长的输入、以及文档是哪种类型。1.2 向量化切完块之后每段文字得变成机器能算的格式——向量。这一步用的模型叫 Embedding 模型输入一段文字输出一个固定长度的浮点数向量比如 768 维。向量化的妙处在这里语义相近的文本在向量空间里的位置也近。“苹果手机多少钱和iPhone 最新售价”用词完全不同但经过 Embedding 之后两个向量在高维空间里的余弦相似度很高。这就是语义检索能跑通的基础。选哪个 Embedding 模型直接影响检索质量。几个常用选项text-embedding-3-smallOpenAI 出品512 或 1536 维性价比高中文支持不差BGE-M3BAAI 开源1024 维中文和多语言场景表现优秀输入最长能到 8192 tokenBCEmbedding有道开源768 维中文检索和重排序配对使用效果好Cohere embed-v31024 维支持向量压缩多语言场景够用维度越高语义表达能力越强但存储和计算也跟着涨。实践中 768 到 1024 维已经够应付多数场景了。1.3 向量数据库几万、几十万个向量存进去之后要能快速检索跟这个查询向量最像的前 K 个。传统数据库MySQL、PostgreSQL不会干这活——它们的索引是为精确匹配建的不是为相似度搜索建的。向量数据库用了近似最近邻搜索ANN算法来加速。与其逐一计算查询向量和库里每个向量的距离ANN 先在速度和精度之间找个平衡点用极小的精度代价换数量级的查询提速。常用的 ANN 算法有两个HNSW分层可导航小世界图和 IVF倒排文件索引。HNSW 建了一个多层图结构高层稀疏、低层密集查询时从高层粗定位逐层往下精搜。IVF 先把向量做聚类查询时只在最近的几个聚类中心附近搜。主流选择有 Milvus功能全、社区活跃、QdrantRust 实现性能强悍、Weaviate支持向量关键词混合检索、PineconeSaaS 模式零运维还有轻量级的 Chroma 适合做原型。检索环节从库里面翻出对的东西知识库建好了用户提问时系统的第一件事就是把问题转成向量在库里翻找最相关的片段。2.1 查询向量化用户的问题得先过一遍跟文档向量化同一个 Embedding 模型。不同模型输出的向量坐标系不一样混用了检索就全乱了。查询向量出来后在向量库里跑相似度搜索。三种常用的度量方式余弦相似度衡量两个向量方向的接近程度范围 [-1, 1]。RAG 里最常用的一种因为它不挑向量长度长文本和短文本能公平比较。欧氏距离直接算两个向量在空间里的直线距离值越小越像。适合向量长度差不多的场景。内积对应位置元素乘起来再加总。归一化之后的向量内积就等于余弦相似度。Top-K 设多大要看场景。K 太小漏关键信息K 太大混进噪音还浪费 token 预算。实践中经常取 3 到 10配合其他策略灵活调。2.2 不止一种检索方式纯向量检索在大方向上够用但有些场景会露怯遇到精确的日期、ID、专有名词向量检索就不如关键词检索准。混合检索是常见的解法向量检索负责语义层面的匹配BM25 这类关键词检索负责精确命中的部分两路结果合并排序。重排序Reranking再往前推了一步。向量检索召回的 Top-K 里排第一的不一定真是最相关的。重排序模型Cross-Encoder把问题 文档成对丢进去算分比 Embedding 的双塔结构精细不少——双塔是问题和文档各自算向量Cross-Encoder 直接让两者在模型内部交互一次。排序准了但计算开销也明显大了。到了企业级场景多路召回 融合排序更常见。部署好几路检索器——语义检索、关键词检索、知识图谱检索——各路独立召回 Top-N最后用 RRFReciprocal Rank Fusion统一排一版结果。架构复杂了但召回覆盖率上了好几个台阶。生成环节拼上下文输出答案Top-K 片段到手了下一步是把它们塞到 Prompt 里让模型对着资料回答。3.1 Prompt 怎么拼检索结果不能原样丢进去得按一个结构化的模板组装。一个典型的 RAG Prompt 长这样基于以下参考资料回答问题。如果参考资料不包含相关信息请说明无法回答。参考资料---{片段1}{片段2}{片段3}---问题{用户提问}这里面有几个细节值得留意明确告诉模型只参考给出的这些材料降低它自行发挥的空间用分隔符---把资料和指令隔开避免 Prompt 注入给出兜底行为——“找不到就直说”防止模型在没资料时硬编3.2 上下文窗口是有限的LLM 的上下文窗口再大也不是无限的RAG 场景下塞进去的检索结果经常占大头。怎么分配 token 预算直接影响生成质量。几个实用的做法控制片段长度对过长的检索结果做截断按 Token 数裁到可管理的范围。相关性排序把最相关的片段放在 prompt 前面——模型对开头和结尾的关注度天然更高。去重多段检索结果可能包含重复内容去重之后省出来的空间能塞进更多差异化的信息。3.3 生成和溯源模型拿到组装好的 Prompt 后跟普通对话有本质区别——它进入了阅读理解模式从给的素材里提取答案对照着资料来回话。工程上做到位的话还会给每个检索片段打上来源标记——文档 ID 或者 URL——并要求模型在回答里标注引用。用户追问这句是从哪里来的可以直接定位到原文。在医疗、法律、金融这些合规敏感的场景里这一点比回答本身还重要。下面是一段简化的 Python 流程示意把上面讲的几步串起来import numpy as np# 查询向量化defquery_to_vector(query, embedder): return embedder.encode(query)# 检索 Top-Kdefretrieve(query_vector, vector_db, top_k5): # 用余弦相似度 similarities np.dot(vector_db.vectors, query_vector) similarities / (np.linalg.norm(vector_db.vectors, axis1) * np.linalg.norm(query_vector)) top_indices np.argsort(similarities)[-top_k:][::-1] return [vector_db.chunks[i] for i in top_indices]# 组装 Promptdefbuild_prompt(query, chunks): context \n\n.join( [f## 片段 {i1}\n{c}for i, c inenumerate(chunks)] ) return ( f请基于以下参考资料回答问题\n\n f{context}\n\n f问题{query}\n\n f如参考资料中无相关信息请说明无法回答。 )# 完整流程defrag_pipeline(query, embedder, vector_db, llm): q_vec query_to_vector(query, embedder) chunks retrieve(q_vec, vector_db, top_k5) prompt build_prompt(query, chunks) return llm.generate(prompt)检索是上游Prompt 是桥生成是下游。上游歪了下游的模型再强也救不回来。写在最后RAG 的全流程可以压缩成一句话让大模型从靠记忆答题切换到翻资料作答。三个环节每个都跟最终效果直接挂钩索引构建是地基。分块策略影响语义的完整程度Embedding 模型影响语义表达有多准向量数据库影响检索跑多快。哪一步没做好后面全打折扣。检索召回是桥梁。从基础向量检索到混合检索、重排序、多路融合每一步都在追问同一个问题——“找到的东西对不对”。实践中单一策略几乎总会漏掉点什么组合使用才是日常。生成环节是所有前置工作的出口。Prompt 模板的目标很朴素让模型清楚什么时候回答、什么时候老老实实说不知道。上下文窗口管理则是上线之后持续调优的主战场。理解整条管道的全貌是搭好 RAG 系统的第一步。学AI大模型的正确顺序千万不要搞错了2026年AI风口已来各行各业的AI渗透肉眼可见超多公司要么转型做AI相关产品要么高薪挖AI技术人才机遇直接摆在眼前有往AI方向发展或者本身有后端编程基础的朋友直接冲AI大模型应用开发转岗超合适就算暂时不打算转岗了解大模型、RAG、Prompt、Agent这些热门概念能上手做简单项目也绝对是求职加分王给大家整理了超全最新的AI大模型应用开发学习清单和资料手把手帮你快速入门学习路线:✅大模型基础认知—大模型核心原理、发展历程、主流模型GPT、文心一言等特点解析✅核心技术模块—RAG检索增强生成、Prompt工程实战、Agent智能体开发逻辑✅开发基础能力—Python进阶、API接口调用、大模型开发框架LangChain等实操✅应用场景开发—智能问答系统、企业知识库、AIGC内容生成工具、行业定制化大模型应用✅项目落地流程—需求拆解、技术选型、模型调优、测试上线、运维迭代✅面试求职冲刺—岗位JD解析、简历AI项目包装、高频面试题汇总、模拟面经以上6大模块看似清晰好上手实则每个部分都有扎实的核心内容需要吃透我把大模型的学习全流程已经整理好了抓住AI时代风口轻松解锁职业新可能希望大家都能把握机遇实现薪资/职业跃迁这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】