当前位置: 首页 > news >正文

RAG学习笔记2--系统查询流程

RAG学习笔记2--系统查询流程

Posted on 2026-05-04 22:54  work hard work smart  阅读(0)  评论(0)    收藏  举报

总体流程概览

graph LRA[1.用户提问] --> B[2.商品确认<br/>qwen-flash]B --> C{2.是否有答案?}C -->|是/反问| D[8.答案输出]C -->|否| E[3.多路搜索]E --> F[3.1 向量检索<br/>BGE-M3本地]E --> G[3.2 HyDE检索<br/>qwen-flash+BGE-M3]E --> H[3.3 网络搜索<br/>百炼MCP]E --> I[3.4 知识图谱<br/>Neo4j未启用]F --> J[4.结果合并]G --> JH --> JI --> JJ --> K[5.RRF融合排序]K --> L[6.重排序<br/>BGE-Reranker本地]L --> M[7.答案生成<br/>qwen-flash]M --> D

详细流程说明

1. 用户查询阶段

  • 前端页面: 用户输入查询问题
  • 历史对话: 从 MongoDB 加载近期对话历史
  • API调用: POST /query 接口 (支持流式SSE输出)

2. 商品名称确认节点 (node_item_name_confirm)

  • 历史加载: 从 MongoDB 获取最近对话记录
  • LLM提取: 调用大模型提取商品名称并重写问题 (qwen-flash 语言模型, JSON模式)
  • 向量化检索: 对提取的商品名进行向量检索 (BGE-M3 Embedding模型 - 本地)
  • 评分对齐: 根据 Milvus 检索评分确认商品名
    • 规则A: 单个高置信度 (>0.85) → 直接确认
    • 规则B: 多个高置信度 → 优先精确匹配
    • 规则C: 中等置信度 (0.6-0.85) → 生成候选列表
  • 条件分支:
    • 若无法确认唯一商品 → 生成反问/拒绝回答 → 跳到答案输出
    • 若确认商品 → 继续多路搜索流程

3. 多路并发搜索 (四路并行)

3.1 向量检索节点 (node_search_embedding)

  • 问题向量化: 对重写后的问题生成向量 (BGE-M3 Embedding模型 - 本地)
  • 混合检索: 在 Milvus 中执行稠密+稀疏混合检索
  • 商品过滤: 使用 item_name in [...] 过滤检索范围
  • 返回结果: Top 5 最相关文档片段

3.2 HyDE检索节点 (node_search_embedding_hyde)

  • 假设文档生成: 调用LLM生成假设性答案文档 (qwen-flash 语言模型)
  • 文本拼接: 将"原问题 + 假设文档"合并
  • 向量化检索: 对合并文本生成向量并检索 (BGE-M3 Embedding模型 - 本地)
  • 核心优势: 解决短查询语义稀疏问题,提升召回率
  • 返回结果: Top 5 最相关文档片段

3.3 网络搜索节点 (node_web_search_mcp)

  • MCP调用: 通过百炼 MCP 协议调用网络搜索工具
  • 搜索参数: count=5 (返回5条搜索结果)
  • 结果解析: 解析返回的JSON格式搜索结果
  • 返回结果: 网页标题、摘要、URL列表

3.4 知识图谱节点 (node_query_kg) - 当前未启用

  • Neo4j查询: 预留的知识图谱查询接口
  • 状态: 功能未启用,返回空结果

4. 结果合并节点 (node_join)

  • 虚拟节点: 无实际业务逻辑,仅作为多路搜索的合并点
  • 数据汇聚: 等待四路搜索结果全部完成
  • 状态传递: 将各路结果汇总到 state 中

5. RRF融合排序节点 (node_rrf)

  • 结果标准化: 将不同来源的结果统一格式
  • RRF算法: 使用 Reciprocal Rank Fusion 倒数排名融合
    • 公式: score = weight × (1 / (k + rank))
    • 参数: k=60 (经典常数), weight=1.0 (各路权重相等)
  • 融合来源: Embedding检索 + HyDE检索 (当前配置)
  • 返回结果: Top 10 融合排序后的文档

6. 重排序节点 (node_rerank)

  • 文档合并: 将本地知识库结果 + 网络搜索结果合并
  • 重排序计算: 调用重排序模型计算相关性得分 (BGE-Reranker-Large - 本地)
    • 输入: (查询问题, 候选文档) 对
    • 输出: 相关性分数 (越高越相关)
  • 动态TopK: 智能截断策略
    • 最大保留: 10条
    • 断崖检测: 分数差距 >25% 或 >0.5 时截断
  • 返回结果: 最终重排序后的文档列表

7. 答案生成节点 (node_answer_output)

  • 阶段1 - 答案检查: 检查 state 中是否已有答案 (如反问/拒绝回答)
  • 阶段2 - Prompt构建: 组织问题、历史对话、重排后的文档内容为最终Prompt
  • 阶段3 - LLM生成: 调用大模型生成最终答案 (qwen-flash 语言模型)
    • 支持流式输出 (SSE推送)
    • 支持非流式输出 (一次性返回)
  • 阶段4 - 历史记录: 将答案写入 MongoDB 历史
  • 阶段5 - 图片提取: 从检索结果中提取图片URL
  • 前端推送: 发送最终结果 (含答案+图片URL)

8. 状态监控

  • 任务状态: pending → processing → completed/failed
  • 节点进度: 实时记录已完成和运行中的节点
  • 流式推送: 通过 SSE 实时推送生成进度

数据流转示意

用户问题 + 历史对话↓
商品名称确认 (qwen-flash + BGE-M3)↓
重写问题 + 确认商品名↓
四路并行搜索 (Embedding + HyDE + 网络 + 知识图谱)↓
多路检索结果合并↓
RRF融合排序 (Embedding + HyDE)↓
重排序 (BGE-Reranker + 网络结果)↓
最终答案生成 (qwen-flash)↓
MongoDB历史记录 + 前端SSE推送

技术栈说明

  • Web框架: FastAPI + SSE流式输出
  • 工作流引擎: LangGraph (支持并发分支)
  • 向量数据库: Milvus (稠密+稀疏混合检索)
  • Embedding模型: BGE-M3 (1024维稠密 + 稀疏向量) - 本地部署
  • 语言模型 (LLM): qwen-flash (阿里云通义千问) - 商品识别、HyDE生成、答案生成
  • 重排序模型: BGE-Reranker-Large - 本地部署
  • 网络搜索: 百炼 MCP (Model Context Protocol)
  • 知识图谱: Neo4j (预留接口,当前未启用)
  • 历史存储: MongoDB (对话历史)
  • 对象存储: MinIO (图片URL提取)
  • RRF算法: 倒数排名融合 (无需训练的排序算法)