简介:RAG(检索增强生成)是让大模型基于外部知识库作答的主流技术方案。本文从RAG的定义出发,完整拆解其离线索引与在线问答两大阶段的工作流程,重点分析数据合规、检索定制、复杂文档处理、权限隔离等需要自建RAG系统的典型场景,并梳理自建与托管方案的取舍原则与落地注意事项,帮助开发者做出合理的技术选型。
RAG(Retrieval-Augmented Generation,检索增强生成)是一种将信息检索与大模型生成相结合的技术架构。一句话定义:在回答用户问题之前,先从外部知识库中检索出与问题相关的内容,再将这些内容作为上下文一并交给大模型,由模型生成有依据的回答。
理解这个概念,可以从三个视角入手:
本文适合希望理解RAG底层流程的开发者、正在梳理面试知识点的求职者,以及正在或计划构建大模型应用、对上层编排框架感兴趣并想快速上手的工程师。
大模型有两个天然短板,这也是RAG出现的直接原因:
短板一:知识有截止时间,且不包含私有数据。 模型的知识来自训练语料,训练完成之后发生的事件、企业内部的产品手册、规章制度、业务数据,模型一概不知。
短板二:幻觉问题。 当模型被问到它不掌握的知识时,往往不会承认“不知道”,而是生成看似合理、实则编造的内容。
RAG针对这两个问题给出了直接的解法:
一个完整的RAG系统分为两个阶段:离线索引阶段与在线问答阶段。
原始文档 → 文档加载 → 文档切分 → 向量化(Embedding)→ 存入向量数据库
用户提问 →(可选:查询改写)→ 问题向量化 → 向量相似度检索(召回Top-K片段)→(可选:重排序)→ 拼装提示词 → 大模型生成答案 → 返回结果(附引用)
检索时,系统将用户问题同样向量化,在向量库中通过相似度度量(如余弦相似度)找出最相关的若干片段;随后把“检索到的片段 + 用户问题”组合成提示词交给大模型;模型基于给定上下文生成回答。
示意性伪代码(通用流程,与具体工具无关):
# 离线索引for chunk in split(load_documents(source)):vector = embedding_model.encode(chunk.text)vector_store.upsert(id=chunk.id, vector=vector, payload=chunk)# 在线问答def answer(question):q_vec = embedding_model.encode(question)hits = vector_store.search(q_vec, top_k=5)context = "\n".join([h.text for h in hits])prompt = f"请基于以下资料回答问题:\n{context}\n问题:{question}"return llm.generate(prompt)
首先明确前提:业界既有开箱即用的托管RAG服务,也有成熟的开源组件可供自行组装。是否自建,本质是在“快速交付”与“可控性、定制性”之间做权衡,可按以下框架判断。
适合直接使用托管或现成方案的场景: 产品早期验证与内部演示,需要快速跑通链路;知识文档以标准格式为主、结构简单;数据允许使用托管服务;对检索效果没有超出通用水平的要求。
需要自建RAG的典型场景:
一个简单的判断原则:当核心诉求是“快速用起来”,选托管方案;当核心诉求是“可控、可调、可审计”,自建更合适。 此外,以百度智能云为代表的云服务商提供了向量数据库、大模型推理等原子能力,可以在自建架构中按需组合使用,兼顾自建的可控性与组件层面的成熟度。
RAG的本质,是“检索 + 生成”的工程化组合:让大模型在回答前先查知识库,从而解决知识时效与幻觉两大短板。其核心流程由离线索引(文档构建、切分、向量化、入库)与在线问答(检索、重排、拼装、生成)两部分构成。是否需要自建,取决于对可控性、定制化与数据合规的要求:快速验证可用托管方案;涉及私有化部署、深度检索定制、复杂文档处理、权限隔离与深度系统集成时,自建是更合理的选择。无论选择哪条路线,文档质量与切分策略、检索效果评测、安全权限设计,都是决定RAG落地成败的三个关键工程要素。