一、RAG 技术概述
1.1 大模型面临的挑战
在大模型广泛应用的当下,其局限性也逐渐凸显。幻觉问题是其中之一,例如在医疗场景中,大模型可能虚构并不存在的诊断标准;在法律场景里,编造不存在的法条。此外,数据孤岛现象严重,像金融机构因数据隐私和安全等问题,无法将财报上传至公有云;医疗系统需严格遵守 HIPAA 隐私协议,导致数据难以共享和整合。而且,大模型训练数据存在时效性问题,其知识截止在训练数据的时间节点,难以实时反映最新信息。
1.2 RAG 技术的诞生与定义
为应对这些挑战,检索增强生成(Retrieval-Augmented Generation,简称 RAG)技术应运而生。RAG 技术融合了向量检索与大语言模型(LLM)生成,通过从外部知识库实时检索相关信息,为 LLM 的生成过程提供支撑,从而让模型输出更准确、更具时效性和可解释性的内容。简单来说,RAG = 向量检索(实时知识) + LLM 生成(自然表达),它通过「知识准备→智能检索→增强生成」三个阶段,打破了大模型原有的局限。
二、RAG 核心技术拆解
2.1 知识准备:构建可检索的智能知识库
2.1.1 文档处理流水线
知识准备阶段,需对多格式文档进行处理,并进行智能分块。以 LangChain 最佳实践为例,使用UnstructuredFileLoader加载文档,如loader = UnstructuredFileLoader("contract.pdf", mode="elements"),随后利用RecursiveCharacterTextSplitter进行文本分割。在问答场景中,实验证明chunk_size设置为 512 Token 时召回率最高,同时设置chunk_overlap为 50 以保留 10% 重叠防止语义断裂,并指定separators为("\n\n", "\n", " "),优先按段落分割。代码实现如下:
from langchain.document_loaders import UnstructuredFileLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
loader = UnstructuredFileLoader("contract.pdf", mode="elements")
documents = loader.load()
splitter = RecursiveCharacterTextSplitter(
chunk_size = 512,
chunk_overlap = 50,
separators = ("\n\n", "\n", " ")
)
chunks = splitter.split_documents(documents)
2.1.2 向量嵌入的 “精准度 - 速度” 权衡
将文档分块后,需转化为向量形式以便后续检索。向量嵌入模型众多,不同模型在精准度和速度上各有优劣。例如,一些基于 Transformer 架构的嵌入模型能生成高质量向量,精准度高,但计算成本也高,速度相对较慢;而部分轻量级嵌入模型虽速度快,但精准度可能稍逊一筹。企业在选择时,需根据自身业务场景和数据规模,权衡两者关系。
2.1.3 向量数据库选型矩阵(2025 最新)
常见向量数据库各有特点。Faiss 由 Facebook 开发维护,是用于快速搜索相似性和密集向量聚类的开源库;Chroma 是轻量级、易用的开源嵌入式向量数据库;Milvus 由 Zilliz 开源,专为处理超大规模向量数据设计;PGVector 是 PostgreSQL 的开源扩展,基于 Faiss 库,适用于基于 PostgreSQL 数据库且有向量搜索分析需求的应用场景。企业可根据数据量、查询性能、部署难度等因素综合选型,如下表所示(部分对比):
| 向量数据库 | 数据量支持 | 查询性能 | 部署难度 | 适用场景 |
|---|---|---|---|---|
| Faiss | 大规模 | 高 | 中等 | 对查询速度要求极高的场景 |
| Chroma | 中小规模 | 较高 | 低 | 轻量级应用,快速搭建场景 |
| Milvus | 超大规模 | 高 | 较高 | 海量向量数据存储与检索 |
| PGVector | 结合 PostgreSQL 数据规模 | 较高 | 取决于 PostgreSQL 部署 | 已有 PostgreSQL 数据库基础的场景 |
2.2 智能检索:从百万级数据中精准召回
2.2.1 混合检索公式(附数学原理)
智能检索阶段,为提高召回准确性,常采用混合检索方式。其公式为Score = α×VectorSim(Q,D)+(1−α)×BM25(Q,D),其中α = 0.7为经验最优值(经微软 Bing 实测可提升 12% 准确率)。VectorSim(Q,D)表示查询Q与文档D的向量相似度,基于向量空间的距离度量;BM25(Q,D)是一种基于词频和逆文档频率的经典检索算法,衡量词项在文档中的重要性。通过这种加权组合,综合考虑语义相似性和关键词匹配程度,提升检索效果。
2.2.2 高级检索策略
-
HyDE 技术:利用 LLM 生成假设答案再进行检索。例如,当查询 “量子计算优势” 时,先让 LLM 生成如 “量子计算在…… 方面比经典计算快 1000 倍” 这样的假设答案,再将其向量化后进行检索,能更精准地定位相关文档。
-
递归分块:先查询文档摘要(如 100 Token),定位相关章节,再深入查询详细段落。这种方式可提升检索速度 40%,尤其适用于处理长文档和大规模知识库。
2.3 增强生成:让 LLM “带着镣铐跳舞”
2.3.1 黄金 Prompt 模板(含约束条件)
在增强生成阶段,设计合理的 Prompt 模板至关重要。例如,在回答关于犬类寿命问题时,可采用如下模板:“答:小型犬12 - 15 年((兽医手册 P23)),大型犬8 - 10 年((育种标准 2023))”。模板中明确给出答案,并附带知识来源,约束 LLM 生成内容的同时,增加答案的可解释性。
2.3.2 生成控制参数(生产环境配置)
以 ChatOpenAI 为例,在生产环境中需合理配置参数。如设置model_name = "gpt - 4 - 1106 - preview",对于事实性回答,temperature设为 0.1(创造性任务可设为 0.8),控制生成内容的随机性;max_tokens = 500限制生成文本长度;stop = ("###", "END")防止生成多余内容。代码如下:
llm = ChatOpenAI(
model_name = "gpt - 4 - 1106 - preview",
temperature = 0.1,
max_tokens = 500,
stop = ("###", "END")
)
三、企业级实战:2000 行代码构建智能问答系统
3.1 架构设计(金融案例)
以金融行业为例,构建智能问答系统架构。数据来源包括金融财报、行业研报等。通过数据管道对数据进行预处理,如读取 PDF 格式财报,进行敏感信息过滤(如使用正则表达式删除股东身份证号),并添加元数据标注(如时间、行业标签)。检索模块采用 Redis 缓存高频查询,节省 70% 检索时间。生成模块可采用多模型融合方式,如结合 GPT - 4、Claude - 2、文心 4.0,通过投票机制提升回答准确性。
3.2 核心模块实现
3.2.1 数据管道(含脱敏处理)
金融财报处理代码示例如下:
from langchain.document_loaders import PyPDFLoader
import re
loader = PyPDFLoader("2024Q2_report.pdf")
docs = loader.load()
for doc in docs:
doc.page_content = re.sub(r"\d{15,18}", "***", doc.page_content)
docs_with_metadata = (
Document(page_content = d.page_content, metadata = {
"date": "2024 - 06 - 30",
"industry": "半导体",
"source": "上市公司公告"
}) for d in docs
)
3.2.2 检索增强(含缓存机制)
Redis 缓存实现代码如下:
from redis import Redis
cache = Redis(host = "redis://localhost:6379")
def cached_retrieve(query):
key = f"rag_cache:{hash(query)}"
if cache.exists(key):
return json.loads(cache.get(key))
docs = vectorstore.similarity_search(query, k = 3)
cache.setex(key, 3600, json.dumps((d.dict() for d in docs)))
return docs
3.2.3 多模型融合生成
多模型投票机制代码示例:
models = (ChatOpenAI(), Anthropic(), Wenxin())
answers = (model.invoke(prompt) for model in models)
scores = (ragas.faithfulness(question, answer, context) for answer in answers)
best_answer = answers(np.argmax(scores))
3.3 部署优化(性能对比)
在部署阶段,需对系统性能进行优化。对比不同硬件配置(如 CPU、GPU 型号和数量)、不同部署方式(如本地部署、云部署)下系统的响应时间、吞吐量等指标。例如,通过实验发现,在高并发查询场景下,采用 GPU 加速的云部署方式,系统响应时间可缩短 50%,吞吐量提升 80%,从而根据企业实际业务需求,选择最优部署方案。
四、RAG 系统优化:从工程到学术的进阶
4.1 查询理解优化(法律场景)
在法律场景中,基于 BERT 的法律意图分类可优化查询理解。使用transformers库中的pipeline,加载 “legal - bert” 模型对用户查询进行意图分类。如classifier = pipeline("text - classification", model = "legal - bert"),intent = classifier("遗嘱见证人需要几个?"),通过准确理解用户意图,提高检索和生成的准确性。
4.2 上下文压缩技术
-
长文本截断:当文本超过 4096 Token 时,保留 TF - IDF 前 30% 高频片段,去除低频、冗余信息,减少处理负担,同时尽量保留关键内容。
-
摘要生成:利用 T5 - small 模型生成 200 Token 摘要,其信息密度≥85%。代码实现如下:
from transformers import T5Tokenizer, T5ForConditionalGeneration
tokenizer = T5Tokenizer.from_pretrained("t5 - small")
model = T5ForConditionalGeneration.from_pretrained("t5 - small")
def generate_summary(text):
input_ids = tokenizer.encode("summarize: " + text, return_tensors = "pt", max_length = 512, truncation = True)
output = model.generate(input_ids, max_length = 200, num_beams = 4, early_stopping = True)
summary = tokenizer.decode(output[0], skip_special_tokens = True)
return summary
RAG 技术为大模型增强提供了行之有效的解决方案,从原理到实战,通过不断优化各个环节,能够显著提升大模型在不同场景下的表现,为企业和用户创造更大价值。在未来,随着技术的不断发展,RAG 有望在更多领域发挥重要作用,推动人工智能应用迈向新的高度。