引言
检索增强生成(Retrieval-Augmented Generation,RAG)是当前大语言模型落地应用最主流的技术路线。它通过将LLM与外部知识库结合,有效解决了模型幻觉、知识截止日期和企业私有数据不可访问三大痛点。本文从架构设计角度,全面解析RAG系统的各组件选型与工程优化实践。
1. RAG架构核心组件
一个完整的RAG系统由四个核心模块构成:
分块器(Chunker):将原始文档切分为语义连贯的文本块,分块质量直接决定检索准确性。常见的策略包括固定长度切分、递归文本分割、语义切分和基于文档结构的切分。实际项目中,推荐使用递归字符文本分割器(RecursiveCharacterTextSplitter),将chunk_size设为512-1024 token,overlap设为50-100 token,既保证语义完整性又避免上下文断裂。
嵌入模型(Embedding Model):将文本转化为高维向量表示。OpenAI的text-embedding-3-large在MTEB上表现优异但成本较高;对于中文场景,BAAI/bge-large-zh-v1.5是开源最优选择,在C-MTEB基准上全面领先;而Jina v3则在多语言场景表现出色。
向量数据库(Vector Store):存储和检索稠密向量。小规模场景下Chroma和Milvus Lite足够高效;中大规模推荐Milvus或Qdrant,支持分布式和混合检索(稠密+稀疏);企业级场景可考虑Pinecone或Weaviate。
重排器(Reranker):对初步检索结果进行二次精排。Cohere Rerank和bge-reranker-v2-m3效果显著,能将端到端RAG的准确率提升15-25%。
2. 分块策略深度对比
不同的分块策略在不同场景下表现差异显著:
# LangChain 递归文本分割器
from langchain.text_splitter import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(
chunk_size=512,
chunk_overlap=50,
separators=["
", "
", "。", "!", "?", ";", ","]
)
chunks = splitter.split_text(document_text)
# 语义分块:使用嵌入相似度阈值
from langchain_experimental.text_splitter import SemanticChunker
from langchain_openai import OpenAIEmbeddings
semantic_splitter = SemanticChunker(
OpenAIEmbeddings(),
breakpoint_threshold_type="percentile",
breakpoint_threshold_amount=95
)
chunks = semantic_splitter.create_documents([document_text])
实验发现:对于问答类场景,语义分块在top-3召回率上比固定长度切分平均提升12%;但对于信息密度低的对话文本,固定长度切分反而更稳定。实践中建议根据文档类型和业务需求选择最合适的分块策略。
3. 混合检索架构
单纯依赖向量检索在很多复杂查询场景下表现不佳。混合检索结合多种检索策略,是目前生产级RAG的标准架构:
def hybrid_rag_pipeline(query, db_connection):
# 1. 向量检索(语义匹配)
dense_results = vector_db.similarity_search(query, k=20)
# 2. BM25检索(关键词精确匹配)
bm25_results = bm25_index.search(query, k=20)
# 3. RRF融合(Reciprocal Rank Fusion)
combined = reciprocal_rank_fusion(
[dense_results, bm25_results],
k=60
)
# 4. Reranker精排
reranked = reranker.compress_documents(
documents=combined[:20],
query=query,
top_n=5
)
return reranked
这种架构的优势在于:向量检索擅长捕获语义相似但词汇不同的匹配,BM25擅长精确关键词匹配,两者形成互补。RRF作为一种无参数融合方法,无需训练即可实现较好的排序效果。最终由Reranker进一步提升排序质量。
4. 中文场景优化实践
中文RAG系统面临一些独特的工程挑战:
分词问题:中文没有天然的分隔符,简单的字符级切分可能破坏语义完整性。建议在分块前先进行中文分词(如jieba),以词边界为优先切割点。
多音字和同义词:中文中的同义词多样性会降低关键词检索的召回率。解决方案包括构建同义词词典扩展查询、使用支持语义增强的嵌入模型,或在重排阶段引入LLM判断。
评估指标:构建高质量的中文RAG评估数据集是持续优化的关键。建议使用Ragas框架评估忠实度、答案相关性和上下文召回率,同时结合人工评测构建领域特定的评估集。
5. 生产部署考量
从原型到生产,RAG系统还需要关注:
可观测性:记录每次查询的检索结果、重排分数、最终生成内容,便于问题追溯。LangSmith和Phoenix Arize是最佳的可观测性平台选择。
缓存机制:对高频查询及其检索结果进行缓存,大幅降低LLM调用成本,减少响应延迟。
评估驱动迭代:建立自动化评估流水线,每次修改分块策略或切换嵌入模型后自动跑回归测试,确保系统不会退化。
总结
RAG并非一个简单的"向量检索 + LLM生成"管道,而是需要从分块、嵌入、检索、重排到生成全链路优化的系统工程。优秀的RAG架构应当支持组件的独立替换和扩展,构建可评估、可迭代的开发闭环,才能真正将大模型能力转化为可靠的业务生产力。

发表评论 取消回复