adaptive_rag / README.md
lanny xu
Force rebuild: Change Python version and metadata
05e46dd
metadata
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.pyload_documents() 方法

3.2 文本分块

  • 技术点:
    • RecursiveCharacterTextSplitter: 递归字符文本分割器
    • tiktoken: 基于BPE的编码器,用于精确计算token数量
    • 分块策略: chunk_size=250, chunk_overlap=50
  • 应用场景:
    • 将长文档分割成适合向量化的块
    • 保持上下文连贯性(通过重叠)
  • 关键代码位置: document_processor.pysplit_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.pyinitialize_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.pyCustomEnsembleRetriever

5.3 查询扩展 (Query Expansion)

  • 技术点:
    • 使用LLM生成相关扩展查询
    • 提示模板: QUERY_EXPANSION_PROMPT
    • 多查询并发检索
    • 结果去重和合并
  • 应用场景:
    • 从不同角度探索查询主题
    • 提高检索覆盖率
  • 关键代码位置: document_processor.pyexpand_query() 方法

5.4 多模态检索

  • 技术点:
    • CLIP模型: 图像-文本联合嵌入
    • 模型: openai/clip-vit-base-patch32
    • 图像编码: 将图像转换为512维向量
    • 跨模态检索: 文本查询图像,图像查询文本
  • 应用场景:
    • 支持图像和文本混合检索
    • 图像相似度搜索
  • 关键代码位置: document_processor.pymultimodal_retrieve() 方法

5.5 多跳检索 (Multi-hop Retrieval)

  • 技术点:
    • 查询分解: 将复杂问题分解为子问题序列
    • 桥接实体提取: 从上一跳结果中提取实体用于下一跳
    • 上下文累积: 合并多跳检索结果
    • 早期终止: 检查是否已获得足够信息
  • 应用场景:
    • 回答需要多步推理的复杂问题
    • 例如: "A的作者在哪个大学工作?" → 分解为 "A的作者是谁?" + "该作者在哪个大学?"
  • 关键代码位置: workflow_nodes.pydecompose_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.pyCrossEncoderReranker

6.2 其他重排策略

  • TF-IDF重排: 基于词频-逆文档频率
  • BM25重排: 基于BM25算法
  • 语义重排: 基于嵌入向量相似度
  • 混合重排: 融合多种策略
  • 多样性重排: MMR算法,避免结果重复

7. 路由与评分层

7.1 查询路由 (Query Routing)

  • 技术点:
    • LLM-based路由决策
    • 二进制选择: web_searchvectorstore
    • 基于查询内容语义分析
  • 应用场景: 决定使用本地知识库还是网络搜索
  • 关键代码位置: routers_and_graders.pyQueryRouter

7.2 文档相关性评分

  • 技术点:
    • LLM-based评分
    • 二进制评分: yes (相关) 或 no (不相关)
    • 逐文档评分和过滤
  • 应用场景: 过滤掉不相关的检索文档
  • 关键代码位置: routers_and_graders.pyDocumentGrader

7.3 答案质量评分

  • 技术点:
    • LLM-based评分
    • 评估答案是否解决了问题
    • 二进制评分: yes (有用) 或 no (无用)
  • 应用场景: 验证生成答案的质量
  • 关键代码位置: routers_and_graders.pyAnswerGrader

7.4 答案可回答性评分

  • 技术点:
    • 评估当前检索文档是否足够回答问题
    • 支持早期终止决策
  • 应用场景: 判断是否需要继续检索
  • 关键代码位置: routers_and_graders.pyAnswerabilityGrader

8. 幻觉检测层

8.1 NLI模型检测

  • 技术点:
    • 模型: cross-encoder/nli-deberta-v3-xsmall (轻量级)
    • 自然语言推理 (Natural Language Inference)
    • 三种关系: entailment (蕴含), contradiction (矛盾), neutral (中立)
    • 逐句检测 + 最大蕴含策略
  • 应用场景: 检测生成内容是否与源文档一致
  • 关键代码位置: hallucination_detector.pyNLIHallucinationDetector

8.2 Vectara检测模型

  • 技术点:
    • 模型: vectara/hallucination_evaluation_model (HHEM)
    • 专门训练的幻觉检测模型
    • 输出: factuality_score, hallucination_score
  • 应用场景: 高精度幻觉检测
  • 关键代码位置: hallucination_detector.pyVectaraHallucinationDetector

8.3 混合检测

  • 技术点:
    • 结合Vectara和NLI模型
    • 投票机制: 多个模型结果综合判断
    • 置信度计算
  • 应用场景: 提供最可靠的幻觉检测
  • 关键代码位置: hallucination_detector.pyHybridHallucinationDetector

9. 查询优化层

9.1 查询分解 (Query Decomposition)

  • 技术点:
    • LLM-based分解
    • 将复杂多跳问题分解为子问题序列
    • JSON格式输出: {"sub_queries": [...]}
  • 应用场景: 处理需要多步推理的复杂查询
  • 关键代码位置: routers_and_graders.pyQueryDecomposer

9.2 查询重写 (Query Rewriting)

  • 技术点:
    • LLM-based重写
    • 基于上下文优化查询表述
    • 提取桥接实体并注入到下一查询
  • 应用场景:
    • 改进检索效果
    • 多跳检索中的查询优化
  • 关键代码位置: routers_and_graders.pyQueryRewriter

10. 知识图谱层 (GraphRAG)

10.1 图谱构建

  • 技术点:
    • NetworkX: 图结构管理
    • 实体提取: 使用LLM从文档中提取实体
    • 关系提取: 提取实体间关系
    • 图谱持久化: JSON格式存储
  • 应用场景: 构建结构化知识图谱
  • 关键代码位置: knowledge_graph.pyKnowledgeGraph

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.pyweb_search() 方法

12. 评估与监控层

12.1 检索评估

  • 技术点:
    • Precision@K: 前K个结果中相关文档的比例
    • Recall@K: 前K个结果覆盖的相关文档比例
    • MAP (Mean Average Precision): 平均精度均值
    • MRR (Mean Reciprocal Rank): 平均倒数排名
    • NDCG: 归一化折损累积增益
    • Latency: 检索延迟
  • 应用场景: 评估检索系统性能
  • 关键代码位置: retrieval_evaluation.pyRetrievalEvaluator

12.2 可视化

  • 技术点:
    • matplotlib: 绘制评估指标图表
    • seaborn: 统计可视化
    • pandas: 数据处理
  • 应用场景: 展示评估结果和性能分析

13. 异步处理层

13.1 异步检索

  • 技术点:
    • asyncio: Python异步编程
    • asimilarity_search(): 异步相似度搜索
    • ainvoke(): 异步调用
    • 并发查询: asyncio.gather()
  • 应用场景:
    • 提高系统响应速度
    • 并发处理多个查询
  • 关键代码位置: document_processor.pyasync_enhanced_retrieve() 方法

13.2 线程池执行

  • 技术点:
    • run_in_executor(): 在线程池中执行CPU密集型任务
    • 重排任务异步化
  • 应用场景: 避免阻塞主事件循环

14. 配置管理层

14.1 环境变量管理

  • 技术点:
    • python-dotenv: 加载.env文件
    • getpass: 安全输入API密钥
    • 环境变量验证
  • 应用场景: 安全管理API密钥和配置
  • 关键代码位置: config.pysetup_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系统,涵盖了从文档处理、向量化、检索、重排序、生成到质量保证的完整技术栈。系统采用了多种先进技术,包括混合检索、多跳检索、专业幻觉检测、查询优化等,确保了高质量、高准确率的答案生成。