为什么大模型需要RAG架构
大模型训练数据存在时效性 cutoff,且对垂直领域知识覆盖有限。直接向大模型提问企业内部数据或最新行业信息,幻觉率往往超过30%。RAG(Retrieval-Augmented Generation)通过外部知识库检索+大模型生成两阶段协同,将幻觉率压缩到5%以下,同时降低token成本——检索阶段只传入相关片段,而非把整本文档塞进prompt。
RAG系统核心组件与选型
一套完整的RAG链路包含四个核心模块:文档解析切片、向量化编码、向量存储检索、语义重排序。每个模块的选型直接影响最终检索精度和响应延迟。
文档切片策略:按固定token数切片(如512 tokens)是最简单的方式,但会割裂语义完整性。推荐按段落+重叠窗口方案:以段落为最小切片单位,相邻切片保留128 token重叠,避免跨段落的上下文丢失。对于代码和技术文档,按函数/类定义边界切片效果更优。
# 文档切片示例 - 按段落+重叠窗口
def chunk_documents(text, chunk_size=512, overlap=128):
paragraphs = text.split('\n\n')
chunks = []
current_chunk = ""
for para in paragraphs:
if len(current_chunk) + len(para) > chunk_size and current_chunk:
chunks.append(current_chunk.strip())
# 保留overlap窗口
words = current_chunk.split()
current_chunk = " ".join(words[-overlap:]) + "\n\n" + para
else:
current_chunk += "\n\n" + para
if current_chunk.strip():
chunks.append(current_chunk.strip())
return chunks
向量数据库对比与选型决策
向量数据库是RAG的存储基座,选型需要从数据规模、查询延迟、部署模式三个维度评估:
Milvus:支持十亿级向量,云原生架构,适合生产环境大规模部署。写入吞吐量可达10万QPS,查询延迟P99在20ms以内。但组件依赖较重(etcd、MinIO、Pulsar),最小部署也需要4个容器。
Qdrant:Rust编写,单节点性能优异,10万级向量场景下查询延迟稳定在5ms以内。Rust的零拷贝序列化让内存利用率显著优于Java方案。API设计简洁,Docker单容器即可启动。
Chroma:Python原生,适合原型验证和小规模场景。10万向量以内够用,超过这个量级性能断崖式下降。优点是和LangChain集成最顺畅,5分钟搭出Demo。
# Qdrant向量写入与检索示例
from qdrant_client import QdrantClient
from qdrant_client.models import Distance, VectorParams, PointStruct
client = QdrantClient(host="localhost", port=6333)
# 创建集合
client.create_collection(
collection_name="rag_docs",
vectors_config=VectorParams(size=1536, distance=Distance.COSINE)
)
# 写入向量
points = [
PointStruct(id=i, vector=emb, payload={"text": chunk, "source": src})
for i, (emb, chunk, src) in enumerate(embeddings)
]
client.upsert(collection_name="rag_docs", points=points)
# 语义检索
results = client.query(
collection_name="rag_docs",
query_text="用户查询文本",
limit=10
)
Embedding模型选择与优化
Embedding质量直接决定检索的召回率上限。开源方案中,bge-large-zh-v1.5在C-MTEB榜单中文任务综合排名第一,维度1024,推理延迟约8ms/query(A10 GPU)。如果追求极致延迟,bge-small-zh维度仅512,延迟降至3ms,但召回率下降约5个百分点。
OpenAI的text-embedding-3-large维度3072,多语言场景表现最强,但每百万token收费$0.13,大规模文档场景成本需要估算。一个折中方案:用text-embedding-3-large生成向量,再通过Matryoshka维度截断到1024,在精度损失可控的前提下节省75%存储空间。
语义重排序:RAG精度的关键跃升
向量检索是双塔模型,query和document分别编码再计算相似度,语义匹配精度有天花板。交叉编码器(Cross-Encoder)将query-document对一起输入,精度显著提升但计算代价高。工程实践中标准做法是两阶段检索:向量检索Top-50,再用Cross-Encoder重排取Top-5。
BAAI/bge-reranker-v2-m3是目前开源最强的多语言重排模型,在MTEB Retrieval任务上NDCG@10达72.3。推理延迟约50ms/pair,对Top-50重排总耗时2.5秒——如果对延迟敏感,可以降到Top-20重排,耗时1秒以内。
# 语义重排序Pipeline
from FlagEmbedding import FlagReranker
reranker = FlagReranker('BAAI/bge-reranker-v2-m3', use_fp16=True)
def rerank_results(query: str, docs: list, top_k: int = 5):
pairs = [[query, doc["text"]] for doc in docs]
scores = reranker.compute_score(pairs, normalize=True)
ranked = sorted(zip(docs, scores), key=lambda x: x[1], reverse=True)
return [doc for doc, _ in ranked[:top_k]]
RAG链路性能调优实战
生产环境RAG系统的瓶颈通常在三个环节:Embedding推理延迟、向量检索耗时、LLM生成首token时间。优化策略分优先级排列:
1. Embedding批量化:单条推理延迟8ms,批量64条可降至0.5ms/条。文档入库阶段本身就是批量操作,务必开启batch模式。
2. 向量检索预过滤:在向量检索前加metadata过滤条件(时间范围、文档类型、部门标识),可将检索范围从全库缩小到5%以内,延迟从20ms降到3ms。
3. LLM流式输出:开启stream模式,首token延迟从3-5秒降到500ms以内。用户体感是”立刻开始回答”,而非盯着空白转圈。
4. 结果缓存:对高频query的检索结果做Redis缓存,设置24小时TTL。热点问题命中率可达60%以上,完全跳过检索和排序环节。
RAG评估指标体系搭建
没有量化评估的RAG优化都是盲人摸象。核心指标三件套:
召回率(Recall@K):检索出的Top-K片段中包含正确答案的比例。目标值>90%,低于80%说明切片或Embedding有问题。
MRR(Mean Reciprocal Rank):正确答案在排序列表中的平均倒数排名。MRR>0.7说明排序质量合格。
答案忠实度(Faithfulness):生成答案与检索片段的事实一致性,可用NLI模型自动评估。目标值>0.85。
搭建评估数据集:从业务FAQ中抽取200-500条query-documents对,覆盖高频、低频、边界case。每次调整RAG参数后跑全量评估,对比指标变化,避免局部优化全局恶化的情况。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/da-mo-xing-rag-jian-suo-zeng-qiang-sheng-cheng-shi-zhan/