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

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/

(0)
小编小编
上一篇 2小时前
下一篇 1小时前

相关推荐