Spaces:
Paused
Paused
| title: Adaptive RAG | |
| emoji: 🐢 | |
| colorFrom: blue | |
| colorTo: indigo | |
| sdk: docker | |
| pinned: false | |
| app_port: 7860 | |
| # 自适应RAG系统 - 技术总结文档 | |
| ## 📋 项目概述 | |
| 本项目是一个**自适应检索增强生成(Adaptive RAG)**系统,实现了智能查询路由、多源信息检索、质量保证流水线等核心功能。系统能够根据查询内容自动选择最佳信息源(本地向量数据库或网络搜索),并通过多层验证机制确保生成答案的准确性和相关性。 | |
| --- | |
| ## 🏗️ 系统架构 | |
| ### 整体架构流程 | |
| ``` | |
| 用户查询 | |
| ↓ | |
| 智能路由 (route_question) | |
| ↓ | |
| [向量存储路径] ←→ [网络搜索路径] | |
| ↓ ↓ | |
| 查询分解 网络搜索 | |
| (decompose_query) (web_search) | |
| ↓ ↓ | |
| 向量检索 生成答案 | |
| (retrieve) (generate) | |
| ↓ ↓ | |
| 文档评分 质量检查 | |
| (grade_documents) (grade_generation) | |
| ↓ ↓ | |
| 决策判断 [有用/无用/不支持] | |
| (decide_to_generate) ↓ | |
| ↓ ↓ | |
| 生成答案 ←──────────────┘ | |
| (generate) | |
| ↓ | |
| 质量检查 | |
| (grade_generation) | |
| ↓ | |
| 最终答案 | |
| ``` | |
| --- | |
| ## 🔧 技术栈详细分析 | |
| ### 1. 核心框架层 | |
| #### 1.1 LangChain & LangGraph | |
| - **技术点**: | |
| - `LangChain`: LLM应用程序编排框架 | |
| - `LangGraph`: 复杂工作流的状态图实现 | |
| - `StateGraph`: 管理复杂RAG工作流状态 | |
| - `TypedDict`: 类型安全的状态管理 | |
| - **应用场景**: | |
| - 工作流节点定义和编排 | |
| - 状态管理和传递 | |
| - 条件分支和决策逻辑 | |
| - **关键代码位置**: `main.py`, `workflow_nodes.py` | |
| #### 1.2 状态管理 | |
| - **技术点**: | |
| - `GraphState` (TypedDict): 定义工作流状态结构 | |
| - 状态字段包括: `question`, `generation`, `documents`, `retry_count`, `retrieval_metrics`, `sub_queries`, `current_query_index`, `original_question` | |
| - **应用场景**: 在工作流节点间传递和更新状态 | |
| --- | |
| ### 2. 语言模型层 | |
| #### 2.1 Ollama (本地LLM推理) | |
| - **技术点**: | |
| - 本地部署的LLM推理引擎 | |
| - 支持Mistral、Phi、TinyLlama等多种模型 | |
| - 通过HTTP API提供服务 (默认端口11434) | |
| - **应用场景**: | |
| - 查询路由决策 | |
| - 文档相关性评分 | |
| - 答案质量评估 | |
| - 查询分解和重写 | |
| - RAG答案生成 | |
| - **关键配置**: `config.py` 中的 `LOCAL_LLM = "mistral"` | |
| - **关键代码位置**: `routers_and_graders.py`, `workflow_nodes.py` | |
| #### 2.2 ChatOllama | |
| - **技术点**: LangChain对Ollama的封装 | |
| - **应用场景**: 统一的LLM调用接口 | |
| --- | |
| ### 3. 文档处理层 | |
| #### 3.1 文档加载 | |
| - **技术点**: | |
| - `WebBaseLoader`: 从URL加载网络内容 | |
| - `BeautifulSoup4`: HTML解析和内容提取 | |
| - **应用场景**: 从指定URL加载知识库文档 | |
| - **关键代码位置**: `document_processor.py` 的 `load_documents()` 方法 | |
| #### 3.2 文本分块 | |
| - **技术点**: | |
| - `RecursiveCharacterTextSplitter`: 递归字符文本分割器 | |
| - `tiktoken`: 基于BPE的编码器,用于精确计算token数量 | |
| - 分块策略: `chunk_size=250`, `chunk_overlap=50` | |
| - **应用场景**: | |
| - 将长文档分割成适合向量化的块 | |
| - 保持上下文连贯性(通过重叠) | |
| - **关键代码位置**: `document_processor.py` 的 `split_documents()` 方法 | |
| #### 3.3 向量嵌入 | |
| - **技术点**: | |
| - `HuggingFaceEmbeddings`: 使用HuggingFace的嵌入模型 | |
| - 模型: `sentence-transformers/all-MiniLM-L6-v2` (轻量级,384维) | |
| - 设备自动选择: GPU (CUDA) 或 CPU | |
| - 嵌入标准化: `normalize_embeddings=True` | |
| - **应用场景**: 将文本转换为向量表示,用于相似度搜索 | |
| - **关键代码位置**: `document_processor.py` 的 `__init__()` 方法 | |
| --- | |
| ### 4. 向量数据库层 | |
| #### 4.1 Milvus (向量数据库) | |
| - **技术点**: | |
| - **Milvus Lite**: 本地文件模式,适合开发和测试 | |
| - **Milvus Server**: Docker/K8s部署,支持分布式 | |
| - **Zilliz Cloud**: 云服务模式 | |
| - 索引类型: `HNSW` (高性能), `IVF_FLAT` (平衡), `AUTOINDEX` (自动) | |
| - 索引参数: `M=8`, `efConstruction=64` | |
| - 搜索参数: `ef=10` (搜索范围) | |
| - **应用场景**: | |
| - 存储文档向量 | |
| - 高效相似度搜索 | |
| - 支持百万级数据 | |
| - **关键代码位置**: `document_processor.py` 的 `initialize_vectorstore()` 方法 | |
| #### 4.2 连接管理 | |
| - **技术点**: | |
| - `pymilvus`: Milvus Python客户端 | |
| - 连接别名管理: `alias="default"` | |
| - 持久化存储: `drop_old=False` | |
| - **应用场景**: 管理向量数据库连接和集合 | |
| --- | |
| ### 5. 检索层 | |
| #### 5.1 基础向量检索 | |
| - **技术点**: | |
| - 余弦相似度搜索 | |
| - Top-K检索 (默认k=5) | |
| - 异步检索: `asimilarity_search()` | |
| - **应用场景**: 根据查询向量找到最相似的文档 | |
| #### 5.2 混合检索 (Hybrid Search) | |
| - **技术点**: | |
| - **向量检索**: 基于语义相似度 | |
| - **BM25检索**: 基于关键词匹配 | |
| - **权重融合**: `vector: 0.5, keyword: 0.5` | |
| - `rank-bm25`: BM25算法实现 | |
| - `CustomEnsembleRetriever`: 自定义集成检索器 | |
| - **应用场景**: | |
| - 结合语义和关键词匹配 | |
| - 提高检索召回率 | |
| - **关键代码位置**: `document_processor.py` 的 `CustomEnsembleRetriever` 类 | |
| #### 5.3 查询扩展 (Query Expansion) | |
| - **技术点**: | |
| - 使用LLM生成相关扩展查询 | |
| - 提示模板: `QUERY_EXPANSION_PROMPT` | |
| - 多查询并发检索 | |
| - 结果去重和合并 | |
| - **应用场景**: | |
| - 从不同角度探索查询主题 | |
| - 提高检索覆盖率 | |
| - **关键代码位置**: `document_processor.py` 的 `expand_query()` 方法 | |
| #### 5.4 多模态检索 | |
| - **技术点**: | |
| - `CLIP模型`: 图像-文本联合嵌入 | |
| - 模型: `openai/clip-vit-base-patch32` | |
| - 图像编码: 将图像转换为512维向量 | |
| - 跨模态检索: 文本查询图像,图像查询文本 | |
| - **应用场景**: | |
| - 支持图像和文本混合检索 | |
| - 图像相似度搜索 | |
| - **关键代码位置**: `document_processor.py` 的 `multimodal_retrieve()` 方法 | |
| #### 5.5 多跳检索 (Multi-hop Retrieval) | |
| - **技术点**: | |
| - 查询分解: 将复杂问题分解为子问题序列 | |
| - 桥接实体提取: 从上一跳结果中提取实体用于下一跳 | |
| - 上下文累积: 合并多跳检索结果 | |
| - 早期终止: 检查是否已获得足够信息 | |
| - **应用场景**: | |
| - 回答需要多步推理的复杂问题 | |
| - 例如: "A的作者在哪个大学工作?" → 分解为 "A的作者是谁?" + "该作者在哪个大学?" | |
| - **关键代码位置**: `workflow_nodes.py` 的 `decompose_query()`, `prepare_next_query()` 方法 | |
| --- | |
| ### 6. 重排序层 (Reranking) | |
| #### 6.1 CrossEncoder重排器 | |
| - **技术点**: | |
| - 模型: `cross-encoder/ms-marco-MiniLM-L-6-v2` | |
| - 联合编码: 查询和文档一起编码 | |
| - 准确率提升: 相比Bi-Encoder提升15-20% | |
| - 适用场景: 精排阶段 (Top 20-100文档) | |
| - **应用场景**: 对初始检索结果进行精确重排 | |
| - **关键代码位置**: `reranker.py` 的 `CrossEncoderReranker` 类 | |
| #### 6.2 其他重排策略 | |
| - **TF-IDF重排**: 基于词频-逆文档频率 | |
| - **BM25重排**: 基于BM25算法 | |
| - **语义重排**: 基于嵌入向量相似度 | |
| - **混合重排**: 融合多种策略 | |
| - **多样性重排**: MMR算法,避免结果重复 | |
| --- | |
| ### 7. 路由与评分层 | |
| #### 7.1 查询路由 (Query Routing) | |
| - **技术点**: | |
| - LLM-based路由决策 | |
| - 二进制选择: `web_search` 或 `vectorstore` | |
| - 基于查询内容语义分析 | |
| - **应用场景**: 决定使用本地知识库还是网络搜索 | |
| - **关键代码位置**: `routers_and_graders.py` 的 `QueryRouter` 类 | |
| #### 7.2 文档相关性评分 | |
| - **技术点**: | |
| - LLM-based评分 | |
| - 二进制评分: `yes` (相关) 或 `no` (不相关) | |
| - 逐文档评分和过滤 | |
| - **应用场景**: 过滤掉不相关的检索文档 | |
| - **关键代码位置**: `routers_and_graders.py` 的 `DocumentGrader` 类 | |
| #### 7.3 答案质量评分 | |
| - **技术点**: | |
| - LLM-based评分 | |
| - 评估答案是否解决了问题 | |
| - 二进制评分: `yes` (有用) 或 `no` (无用) | |
| - **应用场景**: 验证生成答案的质量 | |
| - **关键代码位置**: `routers_and_graders.py` 的 `AnswerGrader` 类 | |
| #### 7.4 答案可回答性评分 | |
| - **技术点**: | |
| - 评估当前检索文档是否足够回答问题 | |
| - 支持早期终止决策 | |
| - **应用场景**: 判断是否需要继续检索 | |
| - **关键代码位置**: `routers_and_graders.py` 的 `AnswerabilityGrader` 类 | |
| --- | |
| ### 8. 幻觉检测层 | |
| #### 8.1 NLI模型检测 | |
| - **技术点**: | |
| - 模型: `cross-encoder/nli-deberta-v3-xsmall` (轻量级) | |
| - 自然语言推理 (Natural Language Inference) | |
| - 三种关系: `entailment` (蕴含), `contradiction` (矛盾), `neutral` (中立) | |
| - 逐句检测 + 最大蕴含策略 | |
| - **应用场景**: 检测生成内容是否与源文档一致 | |
| - **关键代码位置**: `hallucination_detector.py` 的 `NLIHallucinationDetector` 类 | |
| #### 8.2 Vectara检测模型 | |
| - **技术点**: | |
| - 模型: `vectara/hallucination_evaluation_model` (HHEM) | |
| - 专门训练的幻觉检测模型 | |
| - 输出: `factuality_score`, `hallucination_score` | |
| - **应用场景**: 高精度幻觉检测 | |
| - **关键代码位置**: `hallucination_detector.py` 的 `VectaraHallucinationDetector` 类 | |
| #### 8.3 混合检测 | |
| - **技术点**: | |
| - 结合Vectara和NLI模型 | |
| - 投票机制: 多个模型结果综合判断 | |
| - 置信度计算 | |
| - **应用场景**: 提供最可靠的幻觉检测 | |
| - **关键代码位置**: `hallucination_detector.py` 的 `HybridHallucinationDetector` 类 | |
| --- | |
| ### 9. 查询优化层 | |
| #### 9.1 查询分解 (Query Decomposition) | |
| - **技术点**: | |
| - LLM-based分解 | |
| - 将复杂多跳问题分解为子问题序列 | |
| - JSON格式输出: `{"sub_queries": [...]}` | |
| - **应用场景**: 处理需要多步推理的复杂查询 | |
| - **关键代码位置**: `routers_and_graders.py` 的 `QueryDecomposer` 类 | |
| #### 9.2 查询重写 (Query Rewriting) | |
| - **技术点**: | |
| - LLM-based重写 | |
| - 基于上下文优化查询表述 | |
| - 提取桥接实体并注入到下一查询 | |
| - **应用场景**: | |
| - 改进检索效果 | |
| - 多跳检索中的查询优化 | |
| - **关键代码位置**: `routers_and_graders.py` 的 `QueryRewriter` 类 | |
| --- | |
| ### 10. 知识图谱层 (GraphRAG) | |
| #### 10.1 图谱构建 | |
| - **技术点**: | |
| - `NetworkX`: 图结构管理 | |
| - 实体提取: 使用LLM从文档中提取实体 | |
| - 关系提取: 提取实体间关系 | |
| - 图谱持久化: JSON格式存储 | |
| - **应用场景**: 构建结构化知识图谱 | |
| - **关键代码位置**: `knowledge_graph.py` 的 `KnowledgeGraph` 类 | |
| #### 10.2 社区检测 | |
| - **技术点**: | |
| - `python-louvain`: Louvain社区检测算法 | |
| - 其他算法: `greedy`, `label_propagation` | |
| - 社区摘要: 为每个社区生成摘要 | |
| - **应用场景**: | |
| - 发现知识图谱中的主题社区 | |
| - 支持全局查询 | |
| - **关键代码位置**: `knowledge_graph.py` 的社区检测相关方法 | |
| #### 10.3 图谱检索 | |
| - **技术点**: | |
| - 本地查询: 基于图遍历 (最大跳数: 2) | |
| - 全局查询: 基于社区摘要 | |
| - 实体链接: 将查询中的实体链接到图谱节点 | |
| - **应用场景**: 利用结构化知识进行检索 | |
| - **关键代码位置**: `graph_retriever.py` | |
| --- | |
| ### 11. 网络搜索层 | |
| #### 11.1 Tavily API | |
| - **技术点**: | |
| - `tavily-python`: Tavily搜索API客户端 | |
| - 实时网络搜索 | |
| - 结果数量: `WEB_SEARCH_RESULTS_COUNT=3` | |
| - **应用场景**: 获取最新信息和通用知识 | |
| - **关键代码位置**: `workflow_nodes.py` 的 `web_search()` 方法 | |
| --- | |
| ### 12. 评估与监控层 | |
| #### 12.1 检索评估 | |
| - **技术点**: | |
| - **Precision@K**: 前K个结果中相关文档的比例 | |
| - **Recall@K**: 前K个结果覆盖的相关文档比例 | |
| - **MAP (Mean Average Precision)**: 平均精度均值 | |
| - **MRR (Mean Reciprocal Rank)**: 平均倒数排名 | |
| - **NDCG**: 归一化折损累积增益 | |
| - **Latency**: 检索延迟 | |
| - **应用场景**: 评估检索系统性能 | |
| - **关键代码位置**: `retrieval_evaluation.py` 的 `RetrievalEvaluator` 类 | |
| #### 12.2 可视化 | |
| - **技术点**: | |
| - `matplotlib`: 绘制评估指标图表 | |
| - `seaborn`: 统计可视化 | |
| - `pandas`: 数据处理 | |
| - **应用场景**: 展示评估结果和性能分析 | |
| --- | |
| ### 13. 异步处理层 | |
| #### 13.1 异步检索 | |
| - **技术点**: | |
| - `asyncio`: Python异步编程 | |
| - `asimilarity_search()`: 异步相似度搜索 | |
| - `ainvoke()`: 异步调用 | |
| - 并发查询: `asyncio.gather()` | |
| - **应用场景**: | |
| - 提高系统响应速度 | |
| - 并发处理多个查询 | |
| - **关键代码位置**: `document_processor.py` 的 `async_enhanced_retrieve()` 方法 | |
| #### 13.2 线程池执行 | |
| - **技术点**: | |
| - `run_in_executor()`: 在线程池中执行CPU密集型任务 | |
| - 重排任务异步化 | |
| - **应用场景**: 避免阻塞主事件循环 | |
| --- | |
| ### 14. 配置管理层 | |
| #### 14.1 环境变量管理 | |
| - **技术点**: | |
| - `python-dotenv`: 加载.env文件 | |
| - `getpass`: 安全输入API密钥 | |
| - 环境变量验证 | |
| - **应用场景**: 安全管理API密钥和配置 | |
| - **关键代码位置**: `config.py` 的 `setup_environment()` 方法 | |
| #### 14.2 配置参数 | |
| - **技术点**: | |
| - 模型配置: `LOCAL_LLM`, `EMBEDDING_MODEL` | |
| - 分块配置: `CHUNK_SIZE`, `CHUNK_OVERLAP` | |
| - 向量库配置: `MILVUS_*` 参数 | |
| - 功能开关: `ENABLE_GRAPHRAG`, `ENABLE_HYBRID_SEARCH`, `ENABLE_QUERY_EXPANSION`, `ENABLE_MULTIMODAL` | |
| - **应用场景**: 集中管理系统配置 | |
| --- | |
| ## 🔄 工作流节点详解 | |
| ### 节点1: route_question | |
| - **功能**: 智能路由决策 | |
| - **技术**: LLM-based路由 | |
| - **输出**: `"web_search"` 或 `"vectorstore"` | |
| ### 节点2: decompose_query | |
| - **功能**: 查询分解 | |
| - **技术**: LLM-based分解 | |
| - **输出**: 子问题列表 | |
| ### 节点3: retrieve | |
| - **功能**: 文档检索 | |
| - **技术**: | |
| - 混合检索 (向量 + BM25) | |
| - 查询扩展 | |
| - 多模态检索 | |
| - 重排序 | |
| - **输出**: 检索到的文档列表 | |
| ### 节点4: grade_documents | |
| - **功能**: 文档相关性评分 | |
| - **技术**: LLM-based评分 | |
| - **输出**: 过滤后的相关文档 | |
| ### 节点5: decide_to_generate | |
| - **功能**: 决策是否生成答案 | |
| - **技术**: | |
| - 检查文档是否足够 | |
| - 检查是否还有子查询 | |
| - 早期终止判断 | |
| - **输出**: `"generate"`, `"prepare_next_query"`, `"transform_query"`, 或 `"web_search"` | |
| ### 节点6: prepare_next_query | |
| - **功能**: 准备下一个子查询 | |
| - **技术**: 查询重写 + 桥接实体提取 | |
| - **输出**: 优化后的下一个查询 | |
| ### 节点7: transform_query | |
| - **功能**: 查询转换 | |
| - **技术**: LLM-based重写 | |
| - **输出**: 改进后的查询 | |
| ### 节点8: generate | |
| - **功能**: 生成答案 | |
| - **技术**: RAG链 (Prompt + LLM) | |
| - **输出**: 生成的答案 | |
| ### 节点9: grade_generation_v_documents_and_question | |
| - **功能**: 答案质量检查 | |
| - **技术**: | |
| - 幻觉检测 | |
| - 答案质量评分 | |
| - **输出**: `"useful"`, `"not useful"`, 或 `"not supported"` | |
| ### 节点10: web_search | |
| - **功能**: 网络搜索 | |
| - **技术**: Tavily API | |
| - **输出**: 网络搜索结果 | |
| --- | |
| ## 📊 性能优化技术 | |
| ### 1. 索引优化 | |
| - **HNSW索引**: 高性能近似最近邻搜索 | |
| - **索引参数调优**: M=8, efConstruction=64 | |
| - **搜索参数调优**: ef=10 | |
| ### 2. 检索优化 | |
| - **混合检索**: 结合语义和关键词匹配 | |
| - **查询扩展**: 多角度检索 | |
| - **重排序**: 精确排序Top-K结果 | |
| ### 3. 异步处理 | |
| - **异步检索**: 提高并发性能 | |
| - **线程池**: CPU密集型任务异步化 | |
| ### 4. 缓存机制 | |
| - **向量库持久化**: 避免重复向量化 | |
| - **文档去重**: 避免重复处理 | |
| --- | |
| ## 🛡️ 质量保证机制 | |
| ### 1. 多层验证 | |
| - **文档相关性评分**: 过滤不相关文档 | |
| - **答案质量评分**: 验证答案有用性 | |
| - **幻觉检测**: 确保答案基于源文档 | |
| ### 2. 迭代改进 | |
| - **查询转换**: 改进检索效果 | |
| - **重试机制**: 最大重试次数限制 | |
| - **回退策略**: 网络搜索作为备选 | |
| ### 3. 早期终止 | |
| - **答案可回答性检查**: 避免不必要的检索 | |
| - **多跳检索优化**: 提前终止已完成的任务 | |
| --- | |
| ## 📦 依赖库总结 | |
| ### 核心框架 | |
| - `langchain>=0.1.0`: LLM应用编排 | |
| - `langgraph>=0.0.40`: 工作流管理 | |
| - `langchain-community>=0.0.20`: 社区集成 | |
| - `langchain-ollama>=0.1.0`: Ollama集成 | |
| ### 向量数据库 | |
| - `pymilvus[milvus_lite]>=2.4.2`: Milvus客户端 | |
| ### 嵌入模型 | |
| - `sentence-transformers>=2.2.0`: 嵌入模型 | |
| - `transformers>=4.30.0`: Transformer模型 | |
| ### 文档处理 | |
| - `tiktoken>=0.5.0`: Token编码 | |
| - `beautifulsoup4>=4.12.0`: HTML解析 | |
| - `rank-bm25>=0.2.2`: BM25检索 | |
| ### 网络搜索 | |
| - `tavily-python>=0.3.0`: Tavily API | |
| ### 图处理 | |
| - `networkx>=3.1`: 图结构 | |
| - `python-louvain>=0.16`: 社区检测 | |
| ### 评估与可视化 | |
| - `scikit-learn>=1.3.0`: 机器学习工具 | |
| - `matplotlib>=3.7.0`: 可视化 | |
| - `pandas>=2.0.0`: 数据处理 | |
| ### 工具库 | |
| - `python-dotenv>=1.0.0`: 环境变量 | |
| - `pydantic>=2.0.0`: 数据验证 | |
| - `numpy>=1.24.0,<2.0`: 数值计算 | |
| --- | |
| ## 🎯 核心技术亮点 | |
| 1. **自适应路由**: 智能选择信息源 | |
| 2. **混合检索**: 语义 + 关键词双重匹配 | |
| 3. **多跳检索**: 支持复杂推理查询 | |
| 4. **专业幻觉检测**: NLI + Vectara模型 | |
| 5. **查询优化**: 分解 + 扩展 + 重写 | |
| 6. **重排序**: CrossEncoder精确排序 | |
| 7. **多模态支持**: 文本 + 图像检索 | |
| 8. **异步处理**: 提高系统性能 | |
| 9. **质量保证**: 多层验证机制 | |
| 10. **GraphRAG**: 结构化知识检索 | |
| --- | |
| ## 📈 系统性能指标 | |
| - **检索准确率**: Precision@3, Recall@3, MAP | |
| - **响应延迟**: 检索延迟、生成延迟 | |
| - **幻觉检测准确率**: 85-95% (使用专业模型) | |
| - **支持数据规模**: 百万级文档 | |
| - **并发处理**: 异步架构支持 | |
| --- | |
| ## 🔮 技术演进方向 | |
| 1. **更强大的嵌入模型**: 支持更大规模的嵌入 | |
| 2. **更智能的路由**: 基于历史数据的路由优化 | |
| 3. **实时学习**: 从用户反馈中学习 | |
| 4. **多语言支持**: 扩展到更多语言 | |
| 5. **分布式部署**: 支持大规模分布式部署 | |
| --- | |
| ## 📝 总结 | |
| 本项目实现了一个功能完整、技术先进的自适应RAG系统,涵盖了从文档处理、向量化、检索、重排序、生成到质量保证的完整技术栈。系统采用了多种先进技术,包括混合检索、多跳检索、专业幻觉检测、查询优化等,确保了高质量、高准确率的答案生成。 |