RAG系统架构与核心组件设计
大模型RAG(Retrieval-Augmented Generation,检索增强生成)通过引入外部知识库检索机制,有效解决了大语言模型幻觉严重、知识更新滞后的问题。RAG架构在智能客服、企业知识问答、法律文档分析等场景中已大规模落地,成为AIGC应用层的标准范式。本文从RAG系统整体架构出发,详解文档分块策略、Embedding模型选择、向量数据库选型对比以及检索优化方案。
RAG系统的处理链路分为五个阶段:文档加载(Document Loading)、文本分块(Text Splitting)、向量化(Embedding)、检索(Retrieval)、生成(Generation)。每个阶段的工程决策直接影响最终输出质量。
文档加载阶段需要处理PDF、Word、Markdown、HTML等多种格式。LangChain提供了统一的Document Loader接口,LlamaIndex则通过LlamaHub扩展格式支持。对于扫描版PDF,需要先经过OCR提取文本,再进入分块流程。
文本分块是RAG系统中最容易被低估的环节。固定长度分块(Fixed-size Chunking)实现简单,但会在语义边界处截断内容,导致检索时丢失上下文。推荐使用递归字符分块(Recursive Character Splitting),优先按段落、换行符、句号递归切分,保证每个chunk内语义完整。
from langchain.text_splitter import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(
chunk_size=512,
chunk_overlap=64,
separators=["\n\n", "\n", "。", "!", "?", ";", " ", ""],
keep_separator=True
)
chunks = splitter.split_text(long_text)
chunk_overlap参数设置为chunk_size的10%~15%,防止跨块信息丢失。chunk_size选择取决于Embedding模型的最大输入长度和下游检索精度需求,512 tokens在多数场景下效果与成本达到较好平衡。
Embedding模型选择与向量化优化
Embedding模型直接决定检索召回率。OpenAI的text-embedding-3-large(3072维)在MTEB榜单表现领先,但依赖API调用且存在数据出境合规问题。开源方案中,bge-large-zh-v1.5在中文检索任务上表现优异,支持本地部署,维度为1024。
from FlagEmbedding import FlagModel
model = FlagModel('BAAI/bge-large-zh-v1.5',
query_instruction="为这个句子生成表示用于检索相关文章:",
use_fp16=True)
embeddings = model.encode(corpus_texts, batch_size=32, convert_to_numpy=True)
对于中英混合语料,bge-m3模型同时支持稠密检索、稀疏检索和Multi-vector检索三种模式,在多语言场景下的鲁棒性显著优于单语言模型。模型部署时建议使用ONNX Runtime或TensorRT加速推理,批量编码吞吐量可提升3-5倍。
向量数据库选型对比与性能测试
向量数据库是RAG系统的存储与检索核心。主流方案包括Milvus、Qdrant、Chroma、Weaviate和Faiss。选型需要从数据规模、查询延迟、部署复杂度、运维成本四个维度评估。
| 方案 | 最大向量数 | 查询延迟(P99) | 部署方式 | 适用场景 |
|---|---|---|---|---|
| Milvus | 10亿+ | 10-50ms | 分布式集群 | 大规模生产环境 |
| Qdrant | 1亿+ | 5-20ms | 单机/集群 | 中等规模、低延迟 |
| Chroma | 100万 | 1-10ms | 嵌入式 | 原型开发、小规模应用 |
| Faiss | 10亿+ | 1-5ms | 库(非服务) | 高性能检索、自建服务 |
Milvus采用存算分离架构,支持云原生部署和水平扩展。对于千万级向量的业务场景,Qdrant的Rust实现内存占用低、查询延迟稳定,是性价比极高的选择。Chroma作为嵌入式数据库,无需独立部署,适合快速原型验证。
from qdrant_client import QdrantClient
from qdrant_client.models import Distance, VectorParams, PointStruct
client = QdrantClient(host="localhost", port=6333)
client.recreate_collection(
collection_name="knowledge_base",
vectors_config=VectorParams(size=1024, distance=Distance.COSINE)
)
points = [
PointStruct(id=i, vector=emb, payload={"text": chunk, "source": doc_name})
for i, (emb, chunk, doc_name) in enumerate(embeddings_chunks_sources)
]
client.upsert(collection_name="knowledge_base", points=points)
检索优化方案:混合检索与重排序
纯向量检索在处理精确关键词匹配时表现不佳。混合检索(Hybrid Search)同时执行向量检索和BM25关键词检索,通过倒数排名融合(RRF)合并结果,兼顾语义召回率和关键词精确度。
def hybrid_search(query, top_k=10, alpha=0.5):
# 向量检索
query_embedding = model.encode(query)
vector_results = client.search(
collection_name="knowledge_base",
query_vector=query_embedding,
limit=top_k * 3
)
# BM25关键词检索
keyword_results = bm25_search(query, top_k=top_k * 3)
# RRF融合
rrf_scores = {}
for rank, doc in enumerate(vector_results):
doc_id = doc.id
rrf_scores[doc_id] = rrf_scores.get(doc_id, 0) + alpha / (rank + 1)
for rank, doc in enumerate(keyword_results):
doc_id = doc['id']
rrf_scores[doc_id] = rrf_scores.get(doc_id, 0) + (1 - alpha) / (rank + 1)
return sorted(rrf_scores.items(), key=lambda x: -x[1])[:top_k]
召回阶段获取Top-20候选后,使用Cross-Encoder重排序模型(如bge-reranker-large)对候选重新打分。Cross-Encoder将query和document拼接后输入Transformer,交互式计算相关性分数,精度远高于Bi-Encoder的余弦相似度,但计算成本高,只用于小规模重排。
RAG生成阶段Prompt工程与引用标注
生成阶段将检索到的上下文拼接到Prompt中,引导大模型基于检索内容回答。Prompt设计的关键是明确约束模型不得使用检索内容之外的知识,并要求标注引用来源。
prompt_template = '''基于以下检索到的资料回答问题。如果资料中没有相关信息,回答"根据现有资料无法回答该问题"。
检索资料:
{context}
问题:{question}
要求:
1. 回答必须基于检索资料,不得编造
2. 在关键信息后标注来源编号[1][2]
3. 资料不足时如实说明
'''
上下文窗口管理是生成阶段的工程要点。当检索返回多个chunk时,总量可能超过模型的上下文长度。实践中按相关度分数降序排列,截断在模型context window的70%以内,预留空间给system prompt和用户问题。对于长文档问答场景,Map-Reduce策略先对每个chunk单独生成摘要,再汇总摘要给出最终答案,避免上下文溢出。
RAG系统评估指标与效果调优
RAG系统的评估需要从检索和生成两个维度量化。检索质量用召回率(Recall@K)和精确率(Precision@K)衡量,需要构建标注数据集。生成质量用Faithfulness(忠实度)、Answer Relevancy(答案相关性)、Context Relevancy(上下文相关性)三个指标评估。Ragas框架提供了自动化评估流程。
from ragas import evaluate
from ragas.metrics import faithfulness, answer_relevancy, context_recall
result = evaluate(
dataset=eval_dataset,
metrics=[faithfulness, answer_relevancy, context_recall]
)
print(result.scores)
RAG系统调优遵循先检索后生成的顺序。检索阶段优先调优chunk_size和overlap参数,测试不同Embedding模型在业务语料上的表现。生成阶段调整Prompt模板和上下文拼接策略。当基础RAG效果达到瓶颈时,考虑引入查询改写(Query Rewriting)、多跳检索(Multi-hop Retrieval)和自适应检索(Self-RAG)等进阶策略进一步提升答案质量。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/da-mo-xing-rag-jian-suo-zeng-qiang-sheng-cheng-jia-gou-she/