1.2 RAG系统架构 本节导读:深入理解RAG系统的分层架构设计,从系统组件到数据流向,掌握构建高性能RAG系统的完整方案。 学习目标 掌握RAG系统的分层架构设计 理解各组件的功能和交互关系 学习系统性能优化架构 了解分布式RAG系统设计 核心概念 分层架构设计 RAG系统采用经典的分层架构,从底层到上层依次为: 数据层:负责数据存储、索引和管理 服务层:提供检索、嵌入、生成等核心服务 应用层:面向用户的接口和业务逻辑 监控层:系统监控、日志和告警 模块化设计原则 模块化设计遵循以下原则: 高内聚低耦合:模块内部功能紧密相关,模块间依赖最小化 单一职责:每个模块只负责一项核心功能 可扩展性:支持模块的动态扩展和替换 !
本节导读:深入理解RAG系统的分层架构设计,从系统组件到数据流向,掌握构建高性能RAG系统的完整方案。
RAG系统采用经典的分层架构,从底层到上层依次为:
模块化设计遵循以下原则:
# 系统架构工具 pip install fastapi uvicorn pydantic pip install redis celery pip install prometheus-client
from fastapi import FastAPI, HTTPException from pydantic import BaseModel from typing import List, Dict, Any, Optional import uvicorn # 基础FastAPI应用 app = FastAPI( title="RAG系统API", description="高性能检索增强生成系统API", version="1.0.0" ) # 基础数据模型 class QueryRequest(BaseModel): query: str top_k: int = 5 filters: Optional[Dict[str, Any]] = None class QueryResponse(BaseModel): query: str results: List[Dict[str, Any]] response_time: float total_docs: int
import numpy as np import faiss from sentence_transformers import SentenceTransformer from typing import List, Dict, Any, Optional import time class EmbeddingService: """嵌入服务""" def __init__(self, model_name: str = "paraphrase-multilingual-MiniLM-L12-v2"): self.model = SentenceTransformer(model_name) self.cache = {} def encode(self, texts: List[str], batch_size: int = 32) -> np.ndarray: """编码文本为嵌入向量""" # 检查缓存 cache_key = hash(tuple(texts)) if cache_key in self.cache: return self.cache[cache_key] # 批量编码 embeddings = self.model.encode(texts, batch_size=batch_size, convert_to_numpy=True) # 缓存结果 self.cache[cache_key] = embeddings return embeddings def encode_single(self, text: str) -> np.ndarray: """编码单个文本""" return self.encode([text])[0] class RetrievalService: """检索服务""" def __init__(self, embedding_dim: int = 768): self.embedding_service = EmbeddingService() self.index = None self.documents = [] self.metadata = [] def build_index(self, documents: List[Dict[str, Any]]): """构建检索索引""" self.documents = documents self.metadata = [] # 提取文本和元数据 texts = [] for doc in documents: texts.append(doc['content']) self.metadata.append(doc.get('metadata', {})) # 生成嵌入 embeddings = self.embedding_service.encode(texts) # 构建FAISS索引 self.index = faiss.IndexFlatIP(embeddings.shape[1]) self.index.add(embeddings.astype('float32')) def search(self, query: str, top_k: int = 5, filters: Optional[Dict[str, Any]] = None) -> List[Dict[str, Any]]: """检索文档""" start_time = time.time() # 编码查询 query_embedding = self.embedding_service.encode_single(query) # 搜索 query_embedding = query_embedding.reshape(1, -1).astype('float32') distances, indices = self.index.search(query_embedding, min(top_k, len(self.documents))) # 应用过滤器 results = [] for i, (dist, idx) in enumerate(zip(distances[0], indices[0])): if idx < len(self.documents): result = { 'document': self.documents[idx], 'metadata': self.metadata[idx], 'distance': float(dist), 'rank': i + 1, 'score': float(dist) } # 应用过滤器 if filters: if not self._apply_filters(result, filters): continue results.append(result) response_time = time.time() - start_time return { 'query': query, 'results': results, 'response_time': response_time, 'total_docs': len(results) } def _apply_filters(self, result: Dict[str, Any], filters: Dict[str, Any]) -> bool: """应用过滤器""" for key, value in filters.items(): if key == 'category': if result['metadata'].get('category') != value: return False elif key == 'language': if result['metadata'].get('language') != value: return False return True # 使用示例 embedding_service = EmbeddingService() retrieval_service = RetrievalService() # 构建索引 documents = [ {'content': '人工智能是计算机科学的一个分支', 'metadata': {'category': '技术', 'language': 'zh'}}, {'content': '机器学习是人工智能的核心技术', 'metadata': {'category': '技术', 'language': 'zh'}}, {'content': '深度学习基于神经网络模型', 'metadata': {'category': '技术', 'language': 'zh'}} ] retrieval_service.build_index(documents) # 检索 search_result = retrieval_service.search("人工智能", top_k=3) print("检索结果:", search_result)
from fastapi import FastAPI, HTTPException from fastapi.middleware.cors import CORSMiddleware from pydantic import BaseModel from typing import List, Dict, Any, Optional import asyncio import logging from datetime import datetime # 初始化应用 app = FastAPI( title="RAG系统API", description="高性能检索增强生成系统", version="1.0.0" ) # 添加CORS中间件 app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) # 初始化服务 embedding_service = EmbeddingService() retrieval_service = RetrievalService() # 请求模型 class QueryRequest(BaseModel): query: str top_k: int = 5 filters: Optional[Dict[str, Any]] = None # 健康检查 @app.get("/health") async def health_check(): """健康检查""" return {"status": "healthy", "timestamp": datetime.utcnow()} # 索引管理 @app.post("/index") async def create_index(request: List[Dict[str, Any]]): """创建索引""" try: retrieval_service.build_index(request) return {"message": "索引创建成功", "indexed_count": len(request)} except Exception as e: raise HTTPException(status_code=500, detail=str(e)) # 检索接口 @app.post("/query") async def query_documents(request: QueryRequest): """检索文档""" try: # 检索 search_result = retrieval_service.search( query=request.query, top_k=request.top_k, filters=request.filters ) return search_result except Exception as e: raise HTTPException(status_code=500, detail=str(e)) # 系统统计 @app.get("/stats") async def get_system_stats(): """获取系统统计信息""" return { "total_documents": len(retrieval_service.documents), "cache_size": len(embedding_service.cache), "uptime": "24h" } if __name__ == "__main__": import uvicorn uvicorn.run(app, host="0.0.0.0", port=8000)
import asyncio from concurrent.futures import ThreadPoolExecutor from typing import List, Dict, Any, Optional import time class AsyncRetrievalService: """异步检索服务""" def __init__(self, max_workers: int = 10): self.max_workers = max_workers self.executor = ThreadPoolExecutor(max_workers=max_workers) self.embedding_service = EmbeddingService() self.retrieval_service = RetrievalService() async def build_index_async(self, documents: List[Dict[str, Any]]): """异步构建索引""" loop = asyncio.get_event_loop() await loop.run_in_executor( self.executor, self.retrieval_service.build_index, documents ) async def search_async(self, query: str, top_k: int = 5) -> Dict[str, Any]: """异步检索""" loop = asyncio.get_event_loop() return await loop.run_in_executor( self.executor, self.retrieval_service.search, query, top_k ) async def batch_search_async(self, queries: List[str], top_k: int = 5) -> List[Dict[str, Any]]: """批量异步检索""" tasks = [] for query in queries: task = asyncio.create_task(self.search_async(query, top_k)) tasks.append(task) results = await asyncio.gather(*tasks, return_exceptions=True) return results # 使用示例 async def main(): async_service = AsyncRetrievalService(max_workers=5) # 异步构建索引 documents = [ {'content': '人工智能是计算机科学的一个重要分支'}, {'content': '机器学习是人工智能的核心技术'}, {'content': '深度学习基于神经网络模型'} ] await async_service.build_index_async(documents) # 异步检索 queries = ["人工智能", "机器学习", "深度学习"] results = await async_service.batch_search_async(queries, top_k=2) for i, result in enumerate(results): if isinstance(result, Exception): print(f"查询 {queries[i]} 失败: {result}") else: print(f"查询 {queries[i]} 结果: {len(result['results'])} 个文档") # 运行异步示例 # asyncio.run(main())
import asyncio import logging from typing import List, Dict, Any, Optional from fastapi import FastAPI, HTTPException import uvicorn # 初始化应用 app = FastAPI(title="RAG系统API", version="1.0.0") # 初始化服务 embedding_service = EmbeddingService() retrieval_service = RetrievalService() async_service = AsyncRetrievalService() class RAGSystem: """完整的RAG系统""" def __init__(self): self.embedding_service = EmbeddingService() self.retrieval_service = RetrievalService() self.async_service = AsyncRetrievalService() self.is_ready = False self.stats = { 'total_queries': 0, 'cache_hits': 0, 'avg_response_time': 0.0 } async def initialize(self): """初始化系统""" try: self.is_ready = True print("RAG系统初始化完成") except Exception as e: print(f"系统初始化失败: {e}") raise async def query(self, query: str, top_k: int = 5, filters: Optional[Dict[str, Any]] = None) -> Dict[str, Any]: """处理查询""" self.stats['total_queries'] += 1 try: # 异步检索 search_result = await self.async_service.search_async(query, top_k) return search_result except Exception as e: print(f"查询处理失败: {e}") raise HTTPException(status_code=500, detail=str(e)) async def get_status(self) -> Dict[str, Any]: """获取系统状态""" return { 'is_ready': self.is_ready, 'stats': self.stats } # 创建RAG系统实例 rag_system = RAGSystem() @app.on_event("startup") async def startup_event(): """启动时初始化系统""" await rag_system.initialize() @app.get("/health") async def health_check(): """健康检查""" status = await rag_system.get_status() return status @app.post("/query") async def query(request: Dict[str, Any]): """查询接口""" query_text = request.get('query') top_k = request.get('top_k', 5) filters = request.get('filters') if not query_text: raise HTTPException(status_code=400, detail="查询文本不能为空") return await rag_system.query(query_text, top_k, filters) @app.get("/stats") async def get_stats(): """获取系统统计""" return await rag_system.get_status() if __name__ == "__main__": uvicorn.run(app, host="0.0.0.0", port=8000, workers=4)
A:数据一致性的保障措施包括:
A:高并发性能优化的关键点:
A:分布式数据分片策略包括:
通过本节的学习,我们掌握了RAG系统的工程化架构设计:
分层架构:实现了数据层、服务层、应用层和监控层的完整架构设计。
模块化系统:通过模块化设计实现了高内聚低耦合的系统架构。
性能优化:采用异步架构、缓存优化等技术提升了系统性能。
完整实现:构建了完整的RAG系统框架,包括API接口、异步处理和缓存机制。
下一节我们将继续深入学习系统集成与部署实践,将RAG系统从架构设计落实到实际部署。
关键词:RAG高级优化, 系统架构, 工程化架构, 分层架构, 模块化设计, 性能优化, 教程, 实战, 最佳实践
难度:进阶
预计阅读:12 分钟