随着大语言模型在自然语言处理任务中不断取得突破,其在文本生成、对话系统和知识问答等领域表现出色。然而,随着应用深度的提升,用户对“生成结果是否基于真实知识”“模型是否具备逻辑推理能力”的需求也不断增长。这促使我们从“生成能力”迈向“推理能力”的新阶段。检索增强生成(Retrieval-Augmented Generation, RAG)提供了一种桥接语言生成与知识推理的有效机制。它通过在生成前引入外部知识检索,使模型拥有动态查找信息的能力,从而缓解知识封闭与幻觉问题。更进一步,RAG的机制可以扩展至结构化图数据的语义利用,通过GraphRAG架构支持复杂的实体关系推理、路径挖掘与多跳问答,显著提升了大模型的知识组织与推理表达能力。
大语言模型虽然具备强大的语言理解与生成能力,但其知识储备完全依赖训练数据,并无法在部署后动态更新。当面对知识更新快、信息密集的任务时,这种“参数内封闭知识”机制很容易导致模型生成内容脱离事实依据,出现幻觉现象。
为了解决这一问题,RAG被提出。其核心思想是:在生成过程中引入外部知识检索机制,用户提出问题后,先检索出与之相关的语义片段,再将这些信息作为上下文提示词,与原始问题一并输入语言模型,引导模型生成更为准确、可信的回答。
在系统架构上,RAG由两个关键模块构成。
首先是检索器,它负责根据用户提出的问题,在预先构建的语义向量数据库中,寻找语义上最相关的问题片段或知识段落。
其次是生成器,它将检索到的内容与用户的问题共同作为输入,综合分析已有信息,生成内容连贯、语言自然的回答。
检索器保证回答基于真实事实,生成器则进一步发挥语言模型的表达与推理能力,二者协同工作,使回答既准确可靠,又易于理解。
RAG的核心优势在于其“先检索,再生成”的工作流程。不同于传统大语言模型仅依赖内部参数进行回答,RAG在面对用户问题时,会优先调用外部知识资源进行实时检索,然后再由生成模块结合检索结果进行推理与生成。这种“查询-检索-增强-生成”的链式结构,为RAG系统提供了更高的准确性和可追溯性,成为其优于传统模型的重要基础。

图1.1 RAG基本流程
(1)数据库构建流程
在RAG系统正式运行之前,首先需要构建一个可供语义检索的外部知识库。这一阶段主要涉及原始文档的清洗、语义切分、嵌入向量的生成以及向量数据库的建立。可以将其视为为语言模型准备的“语义底座”,所有后续问答都将在此基础上完成。构建得越扎实、索引得越精准,后续生成结果的可控性与事实性就越有保障。

图1.2 向量数据库构建流程
知识文档的准备与切分:收集各类知识文档,如PDF、Word、HTML等格式的文件。为了便于后续处理,需要将这些文档转换为纯文本格式,并根据语义或结构将其切分为较小的文本块(chunk)。常见的切分策略包括固定长度切分、滑动窗口切分和基于语义的切分。合理的切分有助于提高检索的准确性和生成的相关性。
嵌入生成与向量化:将切分后的文本块输入嵌入模型,生成对应的向量表示。嵌入模型的选择对向量的质量有重要影响,常用的嵌入模型包括BGE、E5和OpenAI提供的Embedding模型等。这些向量表示捕捉了文本的语义信息,便于后续的相似度计算。
向量数据库构建与索引:将生成的向量存储在向量数据库中,并建立索引结构,以支持高效的相似度检索。常用的向量数据库有Faiss、Milvus和Chroma等。这些数据库能够快速地从大量的向量中检索出与查询向量最相似的若干个文本块。
(2)检索生成流程
当用户提出问题后,RAG系统会进入运行时阶段:通过语义检索找到最相关的信息,并构建Prompt引导语言模型作答。这一过程将“外部知识”与“大模型生成”无缝融合,是整个RAG架构的核心工作流所在。正是在这一阶段,RAG实现了从静态知识到动态生成的跨越,为语言模型注入了可验证、可追溯的知识支撑。具体流程如下:

图1.3 RAG流程
查询向量化:当用户提出一个自然语言问题时,系统首先需要理解其语义意图。为此,RAG会调用嵌入模型(如 BGE、E5、sentence-t5 等)将问题转化为一个稠密向量。这个向量在高维语义空间中,代表了该问题的语义位置,便于与知识库中的文档片段进行“语义接近度”计算。不同于关键词匹配,这种向量表达能捕捉问题背后的深层含义。例如,“如何防止网络钓鱼攻击?”和“如何避免电子邮件诈骗?”虽然词面不同,但其嵌入向量在语义空间中却非常接近,便于系统检索到同一类安全指南或技术措施。
语义检索:完成查询向量后,系统会在事先构建好的向量数据库中执行近似最近邻(ANN)检索操作。该操作的目标,是从成千上万的文档块中,找出语义上最接近的问题片段或知识段落,返回前K条(通常为3~10条)高相关文本块。检索的准确性很大程度上依赖于向量数据库结构(如Faiss的IVF+PQ、Milvus的HNSW)以及嵌入模型的表达能力。一个好的检索器应该做到:检索结果信息密度高、无噪声冗余、覆盖用户意图。这些被召回的上下文构成了LLM的“记忆材料”,它们在下一步的Prompt构建中将发挥核心作用。
提示增强:检索得到的K条片段并不能直接输入模型,而需要进行格式化与组合,形成提示词(Prompt),以引导语言模型按照期望的逻辑生成结果。这一过程被称为增强(Augment)。Prompt的质量对最终回答影响极大。一个良好的Prompt不仅要信息充分、逻辑清晰,还要避免过度堆砌文本导致模型忽略重点。
大语言模型:构建完成的Prompt被送入大语言模型中,模型将根据输入信息生成自然语言回答。此时的回答不同于“凭记忆回答”的传统LLM结果,它是结合了实时检索信息后进行“再表达”的内容,既具语言流畅性,又带有事实支撑性。尤其在专业或实时更新任务中,如医疗问答、法律解读等,RAG的生成输出表现出更高的准确率、专业性与可验证性。整个流程的关键在于各个模块的协同工作,从数据的准备到最终的回答生成,每一步都对系统的性能有重要影响。通过合理的设计和优化,可以构建出高效、准确的RAG系统,满足各种实际应用的需求。
在检索增强生成(RAG)系统中,嵌入模型与向量数据库共同构成了“检索器”的基础设施。检索器的任务,是将用户提出的问题与大量文档片段进行匹配,从中找出语义上最为相关的内容,并将其提供给生成模块作为事实支撑。因此,这一部分的质量将直接影响生成内容的准确性、相关性与可解释性。
(1)嵌入模型
嵌入模型是将文本内容转化为向量表示的核心工具。它的作用是捕捉文本的语义特征,使得语义相似的句子在向量空间中距离更近,语义差异大的句子则距离更远。嵌入模型通常对文本进行统一的向量化处理,输出一个维度固定的向量(如768维或1024维),用于后续的向量相似度计算。在实际部署中,模型的选择应结合任务语言、部署环境(本地/云端)、响应时间等因素权衡考虑。
当前主流的嵌入模型主要包括:
BGE(BAAI General Embedding):由智源研究院开发,专为中文语义匹配任务设计,支持大中小多种规模,在中文问答场景中表现尤为出色。
E5(Embedding for Everything Everywhere):适用于多语言、多任务的通用嵌入模型,广泛应用于英文及多语种跨域检索场景。
OpenAI Embedding:商业化程度高、支持超长文本嵌入,适合部署在高精度任务或与GPT系列模型配合使用。
sentence-t5-large:由 Sentence-Transformers 项目基于 T5 架构开发,擅长句子级语义表示生成,适用于英文语义检索、句对匹配与RAG场景下的上下文压缩与排序任务。
表1.1 常见嵌入模型
| 模型名称 | 适用语言 | 优势特点 | 使用场景 |
| BGE | 中文 | 中文优化、多任务稳定、支持指令式检索 | 中文问答、文档检索系统 |
| E5 | 多语言 | 训练任务多样,适合跨领域与跨语言任务 | 多语种RAG、多语言搜索系统 |
| OpenAI Embedding | 英文 | 高质量、支持长文本、兼容GPT生态 | 高精度英文问答、企业部署 |
| sentence-t5-large | 英文 | 结构强大、基于T5架构、适配多种NLP任务 | 通用语义搜索、英文检索问答 |
(2)切块方法
在构建RAG系统的索引阶段,文本切块是一项至关重要的操作。所谓“切块(Chunk)”,是指将原始文档按照一定规则分割为多个较小片段,以便后续进行嵌入向量生成和语义检索。而“切块大小”(chunk size)的设定,则会直接影响整个系统的检索效果、召回粒度、生成上下文质量,甚至最终的回答准确率。
RAG的检索操作是基于“语义向量”的相似性搜索。如果一个chunk过短,虽然检索粒度细腻,但语义信息稀疏,使模型获取的信息支离破碎;反之,如果chunk过长,虽然上下文完整,但向量表达容易“稀释语义”,导致不同主题混杂、语义模糊,也可能因LLM的输入长度限制而被截断,影响最终生成质量。常见的切块方法有:
固定窗口切块:将文本按字数或Token数均分,简单但可能割裂语义;
滑动窗口切块:引入重叠部分,增强语义连续性;
语义切分:基于自然段、句法断点等规则进行切块,适合长文本和结构性强的文档。
图1.4展示了三种切块方法的基本逻辑。

图1.4 三种切块方法
三种切块方法的特点如表1.2所示。
表1.2 常见的切块方法
| 切块方式 | 描述说明 | 优点 | 缺点 |
| 固定窗口 | 按Token或字数等长分段 | 简单、高效 | 容易割裂语义 |
| 滑动窗口 | 重叠窗口划分,保留上下文 | 语义连续性好 | 增加向量数量 |
| 语义切分 | 根据自然段、句法断点划分 | 符合文本逻辑结构 | 实现复杂、需辅助工具 |
(3)向量数据库
当所有文本片段被转换为向量后,系统需要一个能够高效存储与检索这些向量的“知识引擎”,这正是向量数据库的角色所在。它不仅要支持百万级向量的存储,还要能在毫秒级时间内完成与查询向量的相似度匹配。
常见的向量数据库包括:
Faiss:由Facebook AI研究院开发,是目前最广泛使用的本地向量索引工具。支持多种索引结构,如Flat(暴力检索)、IVF(倒排文件)、HNSW(图结构索引)等,适合嵌入式部署与实验型项目。
Milvus:面向生产环境的企业级向量数据库,支持海量向量存储、并发检索与分布式部署,适合大型系统接入。
Chroma:轻量级数据库,主打“开箱即用”的特性,适合快速开发与小规模知识库构建。
Weaviate:结合Schema定义、RESTful API和自动化向量生成,可作为向量数据库与知识图谱之间的桥梁使用。
表1.3 常见的向量数据库
| 数据库名称 | 部署方式 | 特点优势 | 使用场景 |
| Faiss | 本地 | 多索引结构、运行高效 | 小中型项目、快速原型 |
| Milvus | 分布式 | 高可用、高并发、企业级扩展能力 | 大型知识库、线上服务部署 |
| Chroma | 本地 | 开箱即用、集成LangChain生态 | 轻量级检索、文档助手 |
| Weaviate | 云端/本地 | 自动嵌入、Schema化管理、REST接口 | 融合图谱与语义搜索场景 |
向量检索的核心是相似度计算,常用的方法包括余弦相似度、欧式距离(L2)等。现代数据库通常配备“近似最近邻”(Approximate Nearest Neighbor, ANN)算法,如HNSW、IVFPQ等,以在牺牲部分精度的前提下显著提升查询速度。
在系统部署中,向量库通常以服务化的方式存在。用户查询被转化为向量后,通过API接口请求向量数据库,数据库返回Top-K匹配结果。这些结果通常包含原始文本、向量距离、元信息等,供后续Prompt构建模块调用。