简介:RAG(检索增强生成)是在大模型生成回答前,先从外部知识库检索相关内容并注入提示词的架构模式。本文梳理RAG的定义、背景与价值,拆解文档加载、分块、向量化、检索与生成的完整链路,介绍常见分块策略与向量数据库的作用,对比其与长上下文、微调的区别,并附搭建实践要点,助你理解并落地一套简单可用的RAG系统。
RAG(Retrieval-Augmented Generation,检索增强生成)是一种将外部知识检索与大模型文本生成结合起来的应用架构。它的核心思路是:在大语言模型(LLM)回答用户问题之前,先根据问题从外部知识库(文档、手册、网页、数据库等)中检索出若干最相关的内容片段,再把这些片段连同问题一起组装进提示词,交给模型基于这些”参考资料”生成最终回答。
可以从三个视角理解这一定义:
无论底层使用的是云端托管的大模型服务,还是可私有化部署的开源推理模型,RAG的搭建方法都是一致的。因此,”如何基于大模型搭建一个简单的RAG系统”,本质上就是理解并打通下面这条完整链路。
面对”让大模型回答其训练知识之外的问题”这一需求,最朴素的做法是把所有可能用到的资料一次性写进提示词发给模型。这种”一股脑全给”的方式在文档规模很小时勉强可用,但随着知识规模增长,会暴露出几类典型问题:
RAG针对这些问题给出的解法是:在需要的时候,只把与当前对话相关的信息交给模型,尽量排除无关信息的干扰。其价值可归纳为:
一套典型的RAG系统分为离线(索引)阶段与在线(检索生成)阶段:
离线阶段:文档加载 → 分块(Chunking)→ 向量化(Embedding)→ 写入向量数据库在线阶段:问题向量化 → 相似度检索 → 上下文组装 → 大模型生成回答
将PDF、Word、网页、Markdown等不同格式的资料统一抽取为纯文本。解析质量决定了整个系统的上限:目录、表格、脚注等结构处理不当,会直接污染后续的分块与检索。
分块是检索的最小单位,也是影响召回质量最直接的环节。常见策略有三种:
以”按分隔符切分”为例,一个不依赖任何第三方库的通用实现如下:
from pathlib import Pathfrom typing import Listdef load_rag_chunks(doc_path: Path) -> List[str]:"""读取文档,按全角左方括号「【」切分为 RAG 分片。"""text = doc_path.read_text(encoding="utf-8")segments = [seg.strip() for seg in text.split("【") if seg.strip()]return ["【" + seg for seg in segments]
向量化模型负责把文本转换成高维向量。可以把向量直观理解为多维空间中的坐标:语义相近的文本,转换出的坐标彼此接近;语义无关的文本,坐标相距很远。需要注意,文档分块与用户问题必须使用同一个向量化模型编码,二者才处于同一坐标空间,才具备可比性。
为什么传统数据库难以胜任这个场景?例如用户问”AI是什么”,我们希望检索到的不只是包含”AI”字样的文档,”深度学习””人工智能”这类语义相近的内容也应被召回,这超出了关键词匹配的能力范围。向量数据库专门解决语义近邻检索问题,通常具备:
完整的端到端流程可用如下通用伪代码概括:
# ---- 离线:构建知识库索引 ----chunks = load_rag_chunks(doc_path)vectors = [embed(text) for text in chunks] # 文本向量化模型编码vector_db.upsert(chunks, vectors) # 写入向量数据库# ---- 在线:检索增强问答 ----def answer(question: str) -> str:q_vec = embed(question) # 与建库使用同一向量化模型hits = vector_db.search(q_vec, top_k=3) # 检索最相近的若干分块context = "\n".join(h.text for h in hits)prompt = f"请仅依据以下资料回答问题:\n{context}\n\n问题:{question}"return llm.generate(prompt)
以用户提问”AI是什么”为例,完整走一遍在线链路:
离线链路则是一次性的准备工作:加载、分块、向量化、入库。知识更新时只需对新文档重复该流程,旧内容可按版本管理淘汰。
如果不想从零搭建,主流云平台(如百度智能云)也普遍提供大模型推理、文本向量化与向量数据库等托管能力,可将上述环节以产品化方式接入,降低运维负担。
RAG(检索增强生成)= 检索 + 生成:在大模型回答前,先从外部知识库按语义召回相关内容,再交由模型参考作答。它以”按需供给相关上下文”的方式,缓解了长提示词带来的token浪费、冗余诱发的幻觉与Lost in the Middle问题,同时让知识可随时更新、回答可溯源。搭建一套简单RAG系统只需打通”加载→分块→向量化→存储→检索→生成”六个环节;而走向生产的关键,在于分块策略、召回质量与评估闭环的持续打磨。当需求以”让模型基于既有知识准确作答”为主时,RAG通常是性价比最高的首选方案。