总体流程概览
graph LR
A[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 --> J
H --> J
I --> J
J --> 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算法: 倒数排名融合 (无需训练的排序算法)
作者:Work Hard Work Smart
出处:http://www.cnblogs.com/linlf03/
欢迎任何形式的转载,未经作者同意,请保留此段声明!
浙公网安备 33010602011771号