RAG检索增强生成的工作原理与核心架构
RAG(Retrieval-Augmented Generation)是将外部知识库与大语言模型结合的技术方案,解决纯参数化模型知识滞后、幻觉频发的问题。RAG系统的核心流程分三个阶段:用户提问后,检索模块从向量数据库中召回相关文档片段;检索结果与用户问题拼接成增强提示词;大语言模型基于增强上下文生成回答。这套架构的优势在于知识可随时更新、推理过程可溯源、部署成本远低于全量微调。
生产级RAG系统需要五个核心组件:文档解析与切分管线、Embedding模型服务、向量数据库、重排模块、大语言模型推理服务。每个环节的质量直接影响最终回答的准确率和可用性。
文档切分策略对检索质量的影响
文档切分是RAG系统最容易被忽视却最影响效果的环节。切分粒度过粗,检索召回的片段包含大量无关信息,增加模型噪声;切分粒度过细,语义完整性被破坏,关键信息分散在多个片段中。实际部署中推荐以下策略:
固定长度切分(Fixed-Size Chunking)按token数切分,通常256-512 tokens,适合结构化文档。重叠切分(Overlap Chunking)在相邻片段间保留50-100 tokens重叠,防止关键信息被截断。语义切分(Semantic Chunking)基于段落主题变化点切分,需要额外NLP模型支持,但效果最优。Markdown标题切分按h1/h2/h3层级拆分,对技术文档和知识库尤其有效。
from langchain.text_splitter import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(
chunk_size=512,
chunk_overlap=64,
separators=["\n## ", "\n### ", "\n\n", "\n", "。", ",", " "]
)
with open("knowledge_base.md", "r", encoding="utf-8") as f:
docs = splitter.create_documents([f.read()])
print(f"切分片段数: {len(docs)}")
for i, doc in enumerate(docs[:3]):
print(f"片段{i}: {doc.page_content[:80]}...")
Embedding模型选型与向量数据库对比
Embedding模型负责将文本映射到高维向量空间,其质量直接决定检索的召回率。中文场景下常用的开源Embedding模型包括BAAI/bge-large-zh-v1.5、shibing624/text2vec-base-chinese、Alibaba-NLP/gte-Qwen2-1.5B-instruct。其中bge-large-zh在C-MTEB基准测试中表现稳定,维度1024维,适合通用场景;gte-Qwen2维度3584维,精度更高但存储和计算开销也更大。
向量数据库的选择取决于数据规模和查询延迟要求。Milvus支持十亿级向量,提供分布式架构和GPU加速,适合大规模生产环境。Qdrant用Rust编写,单机性能优异,支持过滤查询,中等规模场景推荐。Chroma轻量嵌入式,适合原型验证和小规模应用。Weaviate内置向量化和全文检索模块,对混合检索场景友好。
混合检索与重排提升准确率
纯向量检索对专有名词、缩写、编码等精确匹配场景表现不佳,混合检索(Hybrid Search)结合稠密向量检索和稀疏检索(BM25)能显著提升召回质量。具体做法是同时对向量数据库和全文索引发起查询,用倒数秩融合(Reciprocal Rank Fusion, RRF)合并两路结果,再送入重排模型精排。
重排模型(Reranker)对召回的Top-K片段做精细相关性打分,过滤低质量片段。常用模型包括bge-reranker-large、cohere-rerank-v3。重排后保留Top-5到Top-8片段送入大模型,平衡上下文长度和回答质量。
from qdrant_client import QdrantClient
from qdrant_client.models import Filter, FieldCondition, MatchValue
client = QdrantClient(host="localhost", port=6333)
# 向量检索
dense_results = client.query_points(
collection_name="knowledge_base",
query=query_vector,
limit=20
)
# BM25全文检索需要配合Qdrant的全文索引
# 合并后送入reranker精排
from sentence_transformers import CrossEncoder
reranker = CrossEncoder("BAAI/bge-reranker-large")
pairs = [[query, doc.payload["text"]] for doc in dense_results.points]
scores = reranker.predict(pairs)
ranked = sorted(zip(scores, dense_results.points), key=lambda x: x[0], reverse=True)
top_docs = [doc for _, doc in ranked[:5]]
大模型推理服务部署与Prompt工程
检索结果拼接成增强提示词时,提示词模板设计直接影响回答质量。一个经过验证的模板结构:系统提示定义角色和回答规范,检索片段用XML标签包裹并标注来源,用户问题放在最后。回答要求包含引用标注,每个事实性陈述必须关联到具体检索片段。
RAG_PROMPT_TEMPLATE = """你是一个专业的知识库问答助手。请严格基于以下检索到的参考文档回答用户问题。
如果参考文档中没有相关信息,请直接回答"根据现有知识库无法回答",不要编造内容。
<reference_documents>
{context}
</reference_documents>
用户问题: {question}
回答要求:
1. 基于参考文档的事实性回答
2. 引用来源编号,如[1][2]
3. 不确定的表述用"根据文档[1]..."前缀
"""
大模型推理服务推荐使用vLLM或Ollama部署。vLLM支持PagedAttention和连续批处理,单卡A100可并发处理数十个请求,吞吐量是原生Transformers的5-8倍。Ollama适合小规模部署,一行命令即可启动模型服务。
评估指标与生产环境优化
RAG系统的评估需要从检索质量和生成质量两个维度衡量。检索层面关注召回率(Recall@K)和平均倒数秩(MRR),生成层面关注答案忠实度(Faithfulness)和答案相关性(Relevancy)。Ragas框架提供了自动化评估管线,基于另一个大模型做参考回答对比,输出量化评分。
生产环境的常见优化手段包括:查询改写(Query Rewriting)将用户口语化提问转换为结构化查询;查询分解(Query Decomposition)将复杂问题拆分为多个子问题分别检索;上下文压缩(Context Compression)用小模型对检索片段做摘要压缩,减少输入token开销;缓存高频问答对,对相似问题直接返回缓存结果。
RAG不是银弹,对于需要复杂推理链或跨文档关联分析的场景,结合Agent框架(如LangGraph、CrewAI)构建多步推理管线才能取得理想效果。但作为大模型落地的基础设施,RAG系统搭建能力是AI应用开发的核心技能之一。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/rag-jian-suo-zeng-qiang-sheng-cheng-xi-tong-da-jian-zhi-nan/