adaptive_rag / README.md
lanny xu
Initial commit
399f3c6
|
raw
history blame
5 kB

自适应检索增强生成系统

📋 项目描述

本项目实现了一个自适应检索增强生成(Adaptive RAG)系统,能够智能地在本地向量数据库检索和网络搜索之间路由用户查询。系统使用复杂的工作流程,通过自适应选择最佳信息源并通过文档评分和查询转换持续改进响应质量,以提供准确、上下文相关的答案。

✨ 核心功能

🔄 智能查询路由

  • 根据查询内容自动判断是使用本地向量存储还是网络搜索
  • 将关于LLM智能体、提示工程和对抗性攻击的问题路由到向量存储
  • 对于一般查询回退到网络搜索

📚 高级文档处理

  • 使用tiktoken编码器进行网络内容加载和分块
  • 使用Nomic嵌入(本地推理)进行向量嵌入
  • Chroma向量数据库实现高效相似性搜索

🎯 质量保证流水线

  • 文档相关性评分:过滤与查询相关的检索文档
  • 答案质量评估:评估生成的答案是否解决了问题
  • 幻觉检测:确保回答基于源文档
  • 查询转换:改进未产生满意结果的查询

🌐 混合信息检索

  • 用于特定领域知识的本地向量数据库
  • 通过Tavily API集成网络搜索获取最新信息
  • 需要时无缝结合两种信息源

🛠️ 技术栈

核心框架

  • LangChain:LLM应用程序编排框架
  • LangGraph:复杂工作流的状态图实现

语言模型

  • Ollama:本地LLM推理(Mistral模型)
  • ChatOllama:Ollama的LangChain集成

向量数据库与嵌入

  • Chroma:用于文档存储和检索的向量数据库
  • Nomic Embeddings:本地文本嵌入模型(nomic-embed-text-v1.5)

文档处理

  • WebBaseLoader:网络内容提取
  • RecursiveCharacterTextSplitter:使用tiktoken的智能文本分块

外部API

  • Tavily API:网络搜索功能
  • Nomic API:嵌入服务

工作流管理

  • StateGraph:管理复杂RAG工作流状态
  • TypedDict:类型安全的状态管理

🏗️ 系统架构

系统实现了一个包含以下组件的复杂状态机:

用户查询 → 路由器 → [向量存储 | 网络搜索]
              ↓            ↓
          检索文档      网络搜索
              ↓            ↓
          文档评分 --------→ 生成答案
              ↓               ↓
      [足够|不足够]      质量检查
              ↓        ↓    ↓    ↓
          生成答案   [有用] [无用] [不支持]
              ↓        ↓     ↓      ↓
          质量检查   [结束] 转换查询  重新生成
              ↓              ↓      ↓
      [有用|无用|不支持]     重新检索  ↑
              ↓              ↓      |
          [最终答案]     ←----------

工作流节点

  1. retrieve:从向量存储获取相关文档
  2. web_search:搜索网络获取最新信息
  3. grade_documents:评估文档相关性
  4. generate:使用RAG链创建答案
  5. transform_query:改进查询表述

决策点

  • route_question:在向量存储和网络搜索之间选择
  • decide_to_generate:判断文档是否足够
  • grade_generation:验证答案质量和基础性

📖 功能模块

1. 环境设置

  • 安全的API密钥管理
  • 本地LLM模型配置

2. 知识库创建

  • 从指定URL加载网络内容
  • 文档预处理和向量化
  • 向量数据库初始化

3. 查询处理

  • 基于内容分析的智能路由
  • 文档检索和相关性评分
  • 查询优化和转换

4. 答案生成

  • 上下文感知的响应生成
  • 多源信息综合
  • 质量验证和改进

5. 质量控制

  • 幻觉检测
  • 答案相关性评分
  • 迭代改进机制

🚀 使用示例

系统通过自适应工作流处理查询:

# 查询处理示例
inputs = {"question": "AlphaCodium论文讲的是什么?"}
for output in app.stream(inputs):
    for key, value in output.items():
        print(f"节点 '{key}':")

📊 数据源

默认知识库

  • LLM智能体(Lilian Weng的博客)
  • 提示工程技术
  • LLM对抗性攻击

动态数据源

  • 实时网络搜索结果
  • 上下文相关的文档检索

🔧 配置说明

必需的API密钥

  • TAVILY_API_KEY:用于网络搜索功能
  • NOMIC_API_KEY:用于嵌入服务

本地模型

  • 模型:Mistral(通过Ollama)
  • 温度:0(确定性响应)
  • 格式:结构化输出的JSON

💡 核心创新

  1. 自适应路由:基于查询语义的动态源选择
  2. 多层验证:文档相关性、答案质量和幻觉检查
  3. 自我改进查询:自动查询转换以获得更好结果
  4. 混合架构:本地和基于网络的信息源无缝集成

这个自适应RAG系统代表了信息检索和生成的先进方法,通过智能工作流管理和持续质量评估确保高质量、相关的响应。