零、源起
以初期的GPT-3.5为例,如果用户提问"今天是几号?",模型可能会回答"今天是2021年10月",这实际上是其训练数据截止的日期。这一现象揭示了传统大语言模型的核心局限:它们本质上是"时间胶囊",知识体系完全冻结于训练数据收集完成的那一刻。对于瞬息万变的现实世界而言,这种静态的知识储备显然无法满足需求——无法追踪新闻事件的后续进展、无法获取最新科研成果、更无法响应实时数据查询。
这正是RAG(检索增强生成) 存在的必要性。它通过将大模型与动态更新的外部知识库相结合,构建起"生成+检索"的双引擎架构。当用户提问时,系统首先从最新数据库或互联网实时检索相关信息,再将检索结果与模型自身的知识融合,最终生成既具备常识推理能力,又包含实时准确信息的回答。这种机制不仅解决了知识时效性问题,还能突破模型参数承载的知识边界,在医疗、金融、科技等需要精准时效的领域尤为重要。例如面对"最新修订的证券法有哪些变化"这类问题,RAG系统可以即时调取法律数据库,提供合规的权威解答。
一、RAG 的概念
RAG 即检索增强生成,是一种结合了信息检索与生成的混合模型架构。基本流程如下:
- 查询接收:用户输入查询后,系统首先利用检索器(Retriever)对知识库进行搜索。
- 信息检索:从结构化或非结构化数据源中获取与查询相关的文档或片段。
- 生成回答:将查询和检索到的信息共同输入生成器(Generator),生成最终的回答。
这种设计既能够让回答内容及时更新,又在一定程度上规避了单一生成模型容易出现“幻觉”(hallucination)的风险。
下面是一张简单的流程图来直观说明 RAG 的工作流程:

二、RAG 的用途与优势
用途
RAG 技术适用于多个场景,例如:
- 问答系统:通过引入外部文档,回答可以包含最新数据和深入背景。
- 对话系统:使聊天机器人能够提供更多事实依据,回答更自然、准确。
- 知识管理:实时补充数据源,构建动态更新的知识库。
- 文本辅助写作:从大量文献中提取关键信息,帮助用户生成具有高参考价值的文本。
优势
- 提升时效性:借助实时抓取的外部数据,生成结果不会因为训练数据的时效性而“过时”。
- 降低幻觉风险:利用真实数据作为补充,减少生成内容中可能出现的虚假信息。
- 扩展知识边界:无需重新训练模型,即可通过扩充知识库来扩展模型的知识面。
- 模块化设计:检索模块和生成模块相对独立,各自可进行针对性优化,提升整体系统灵活性。
三、常用的 RAG 技术
在实际应用中,构建 RAG 系统时主要有以下检索方法:
1. 关键词检索
利用倒排索引、布尔模型等传统方法,根据关键词匹配文档。
- 优点:实现简单、查询速度快。
- 缺点:只能捕获表面匹配,难以理解语义关联。
2. 向量检索
基于深度学习生成的文本嵌入,将文档表示为向量,在向量空间中计算相似度。例如使用余弦相似性进行匹配,常用工具有 Faiss、Annoy 等。
- 优点:能捕捉更深层次的语义信息,检索准确度高。
- 缺点:需要额外计算资源进行向量生成与存储管理。
3. 混合检索
结合关键词和向量两种方法的优点,多阶段检索策略能够进一步提升检索的召回率和精度。
以下这张图展示了混合检索的基本思路:

四、RAG 技术 Demo 实现
下面提供一个用 Python 实现 RAG 基本流程的 Demo。该示例模拟对一个小型文档库进行向量检索,并将检索结果与原始查询一起传给生成模块,从而生成答案。
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
# 定义简单的文档库
documents = [
{"id": 1, "text": "Python 是一门流行的编程语言。"},
{"id": 2, "text": "大模型如 GPT 系列可以生成自然语言。"},
{"id": 3, "text": "RAG 技术结合了检索与生成。"}
]
# 模拟获取文本的嵌入向量(实际场景推荐使用预训练模型,如 Sentence-BERT)
def get_embedding(text):
# 简单示例:将每个字符的 ASCII 值作为特征,取前 10 个字符
return np.array([ord(char) for char in text][:10])
# 为文档生成嵌入表示
doc_embeddings = np.array([get_embedding(doc["text"]) for doc in documents])
# 用户输入查询及其嵌入
query = "什么是 RAG 技术?"
query_embedding = get_embedding(query)
# 计算查询与各文档之间的余弦相似度,选择最匹配的文档
similarities = cosine_similarity([query_embedding], doc_embeddings)[0]
best_idx = np.argmax(similarities)
best_doc = documents[best_idx]
print("检索到的文档:", best_doc["text"])
# 模拟生成模块,将查询和检索信息结合生成回答
def generate_answer(query, retrieved_text):
return f"根据检索到的信息:'{retrieved_text}',RAG 技术可以理解为通过引入外部知识,增强生成模型回答准确性的一种方法。"
answer = generate_answer(query, best_doc["text"])
print("最终回答:", answer)
该示例展示了如何利用简单的向量化方法(在实际应用中,请使用更专业的文本嵌入模型)完成检索,再将检索文档与查询结合生成答案。整个流程充分体现了 RAG 模型将检索与生成有效结合的核心思想。
五、RAG 系统架构简介
进一步扩展来看,我们可以将 RAG 系统抽象为以下几个模块:
- 数据预处理:对原始文档进行清洗、分词、向量化处理。
- 检索模块:基于关键词或向量计算方法快速检索出与查询高相关性的文档。
- 生成模块:携带检索信息的查询传入大模型进行生成。
- 交互接口:向用户返回最终的回答,并支持后续反馈与迭代更新。
下方的 Mermaid 类时序图展示了 RAG 系统从接收到用户查询到返回结果的整体交互流程:

RAG 技术通过引入外部知识库,为大模型注入了实时动态的信息支持。其模块化设计不仅提升了问答系统、对话系统中的回答准确性,也为实时知识更新提供了便捷途径。随着向量检索技术和大规模数据管理手段的不断演进,未来基于 RAG 的系统无疑将在自然语言处理领域发挥更大作用。
未来的探索方向可能包括:
- 检索器优化:结合深度学习与传统方法,进一步提升检索的准确率和召回率。
- 生成模块细化:在生成回答时进一步融合多模态数据,提高模型生成的多样性与可信度。
- 系统联动:构建自适应更新机制,使模型能够根据用户反馈动态调整检索结果和生成策略。