adaptive_rag / README.md
lanny xu
Force rebuild: Change Python version and metadata
05e46dd
---
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系统,涵盖了从文档处理、向量化、检索、重排序、生成到质量保证的完整技术栈。系统采用了多种先进技术,包括混合检索、多跳检索、专业幻觉检测、查询优化等,确保了高质量、高准确率的答案生成。