RAG检索增强生成系统架构设计与向量数据库选型实战

RAG(Retrieval-Augmented Generation)通过外部知识库检索与大模型生成能力结合,有效缓解大模型幻觉问题。在AIGC应用落地过程中,RAG系统已成为企业级大模型开发的主流架构方案。Prompt工程与向量检索的配合,决定了最终生成质量的上限。本文从系统组件、向量数据库选型、文档处理到检索优化,完整拆解RAG系统的工程实现路径。

RAG系统架构组件与检索增强生成工作流程

RAG系统的核心流程分为离线索引和在线检索两个阶段。离线索引阶段将原始文档经过分块、Embedding向量化后存入向量数据库;在线检索阶段接收用户查询,经过向量化后在数据库中检索Top-K相关文档片段,拼接至Prompt上下文中交由大模型生成回答。

完整的RAG系统包含以下核心组件:

– 文档加载器(Document Loader):支持PDF、Word、Markdown、HTML等多种格式
– 文本分块器(Text Splitter):按字符数、Token数或语义边界切分文档
– Embedding模型:将文本块编码为高维向量
– 向量数据库:存储向量索引并支持相似度检索
– 检索器(Retriever):根据查询向量召回相关文档
– 重排序器(Reranker):对召回结果进行二次精排
– 大模型生成器:基于检索上下文生成最终回答

向量数据库选型对比:Milvus与Qdrant性能差异

向量数据库是RAG系统的存储核心,直接决定检索性能和扩展能力。主流开源向量数据库中,Milvus和Qdrant使用最广泛。

Milvus采用分布式架构,支持十亿级向量检索,提供多种索引类型(IVF_FLAT、IVF_SQ8、HNSW、DiskANN)。Qdrant用Rust编写,单节点性能优异,内存占用低,API设计简洁。

选型决策依据:

– 数据规模:百万级以下优先Qdrant,亿级以上选Milvus
– 部署复杂度:Qdrant单二进制部署,Milvus需etcd+MinIO+Pulsar依赖
– 混合检索:Milvus 2.4+支持标量过滤+向量检索,Qdrant原生支持Payload过滤
– 动态更新:Qdrant支持实时upsert,Milvus适合批量导入场景

Milvus Python SDK连接示例:

from pymilvus import connections, FieldSchema, CollectionSchema, DataType, Collection

connections.connect(host="localhost", port="19530")

schema = CollectionSchema([
    FieldSchema("id", DataType.INT64, is_primary=True),
    FieldSchema("embedding", DataType.FLOAT_VECTOR, dim=768),
    FieldSchema("text", DataType.VARCHAR, max_length=65535),
])

collection = Collection("rag_docs", schema)
index_params = {
    "index_type": "HNSW",
    "metric_type": "COSINE",
    "params": {"M": 16, "efConstruction": 256}
}
collection.create_index("embedding", index_params)

collection.load()
results = collection.search(
    data=[query_vector],
    anns_field="embedding",
    param={"metric_type": "COSINE", "params": {"ef": 64}},
    limit=10,
    output_fields=["text"]
)

文档分块策略与Embedding模型选择

文档分块质量直接影响检索精度。固定长度分块(如每512 Token)实现简单但可能截断语义,递归字符分块在段落边界切分效果更好。对于结构化文档(如API文档),按Markdown标题层级分块能保留上下文。

常用的分块参数配置:

from langchain.text_splitter import RecursiveCharacterTextSplitter

splitter = RecursiveCharacterTextSplitter(
    chunk_size=500,
    chunk_overlap=50,
    separators=["\n\n", "\n", "。", "!", "?", ",", " ", ""]
)
chunks = splitter.split_text(document_text)

Embedding模型选择需平衡效果与成本。开源模型中,bge-large-zh-v1.5在中文检索任务表现优秀,维度1024;m3e-base轻量高效,维度768。OpenAI text-embedding-3-small效果稳定但需API调用。模型选择后需保持索引和查询使用同一模型,向量维度必须一致。

检索结果重排序Reranker优化方案

向量检索基于语义相似度,但Top-K结果中可能存在语义相近但实际无关的文档。引入Reranker对召回结果进行二次精排,能显著提升最终答案质量。

BGE Reranker使用cross-encoder架构,将query和document拼接后计算相关性分数,精度远高于双塔向量相似度:

from FlagEmbedding import FlagReranker

reranker = FlagReranker('BAAI/bge-reranker-large', use_fp16=True)

pairs = [[query, doc["text"]] for doc in retrieved_docs]
scores = reranker.compute_score(pairs)

# 按分数降序排列,取Top-5
ranked = sorted(zip(scores, retrieved_docs), key=lambda x: x[0], reverse=True)[:5]

Reranker计算成本较高,仅在向量检索召回的Top-20到Top-50结果上运行,避免对全量数据精排。实测中,引入Reranker后答案准确率可提升15%-30%。

RAG系统评估指标与端到端调优方法

RAG系统评估需要量化指标支撑。RAGAS框架提供四个核心维度:

– Faithfulness(忠实度):生成答案是否基于检索文档,衡量幻觉程度
– Answer Relevancy(答案相关性):答案与问题的匹配程度
– Context Precision(上下文精度):检索文档与问题的相关比例
– Context Recall(上下文召回率):检索文档覆盖标准答案的比例

调优路径遵循先检索后生成的顺序。先优化分块策略和向量模型提升Context Recall,再调整Reranker阈值提高Context Precision,最后通过Prompt模板优化Answer Relevancy。系统上线后建立人工标注反馈闭环,持续积累bad case迭代优化。

原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/rag-jian-suo-zeng-qiang-sheng-cheng-xi-tong-jia-gou-she-ji/

(0)
小编小编
上一篇 12小时前
下一篇 11小时前

相关推荐