章节三十:智库——检索与多路搜索

一、检索数据图定义

检索流程的整体架构设计采用"自顶向下"的开发模式:先搭骨架,再串流程,验证通畅后填充业务逻辑。

状态定义

检索流程中所有节点共享一个状态对象(State),用来存储用户问题、商品名、检索结果、答案等数据,各节点通过读写这个状态来传递信息。

节点基类

所有检索节点都继承同一个基类(NodeBase),基类提供了日志记录、配置读取等公共能力,避免每个节点重复写。

主图定义

检索流程定义了8个核心节点,按顺序串联:

  1. 产品确认节点(node_item_name_confirm):确定用户问的是哪个产品
  2. 向量检索节点(node_search_embedding):在向量库里搜相关文档
  3. HyDE假设检索节点(node_search_embedding_hyde):先生成假答案再搜
  4. 网络搜索节点(node_web_search_mcp):联网搜索补充信息
  5. RRF倒排融合节点(node_rrf):合并多路检索结果
  6. Rerank重排序节点(node_rerank):对结果精细打分排序
  7. 答案生成节点(node_answer_output):生成最终回答

主图通过LangGraph将各节点按业务流转规则串联,支持条件分支(比如产品未确认时直接返回追问)。

二、产品确认节点

产品确认节点的作用是根据用户问题,初步确定要查的是哪个产品,以便在知识库中精准定位手册。

核心流程

第一步:参数校验。检查状态中的用户问题和会话ID是否有效。

第二步:读取历史会话。从MongoDB中获取最近10条聊天记录,用于构建上下文,帮助理解当前问题的意图。

第三步:保存当前问题。将用户提问存入数据库,保证对话历史完整。

第四步:意图理解与改写。调用大模型完成两件事:一是提取商品名(支持多个),二是把模糊问题改写成完整独立的精准问题。比如"这个怎么用"改写成"HAK180烫金机的操作方法"。改写的目的是把用户口语化、模糊的原始问题转化为精准的检索语句。

第五步:向量化评分。把提取出的商品名用BGE-M3生成双向量,在Milvus中进行混合搜索(稠密权重0.8,稀疏权重0.2),与知识库中已有的标准商品名比对,获取相似度评分。

第六步:商品名对齐。根据评分结果分三种情况处理:

  • 评分大于0.85:直接确认该商品,系统认为匹配度极高。
  • 评分在0.6到0.85之间:作为候选商品,生成反问让用户确认。
  • 评分低于0.6:认为不相关,直接丢弃。

第七步:分支处理

  • 已确认商品:更新状态,回填历史消息中缺失的商品名关联,进入后续检索流程。
  • 有候选但未确认:生成澄清话术返回给用户,中断流程等用户回复。
  • 无任何结果:生成通用回复返回给用户。

第八步:持久化。把交互数据写入MongoDB历史记录。

三、向量搜索

向量搜索节点负责根据改写后的问题,在限定商品范围内,从Milvus向量库中召回最相关的知识切片。

第一步:获取查询上下文。从状态中提取改写后的问题和确认的商品名列表。

第二步:文本向量化。调用BGE-M3模型将问题转换为稠密向量和稀疏向量。

第三步:构建混合检索请求。如果有确定的商品名,就构造过滤条件限定搜索范围。同时结合稠密向量(余弦距离)和稀疏向量(内积)进行多路召回。

第四步:执行检索。连接Milvus的切片集合,用0.8/0.2的权重对稠密和稀疏得分加权融合,返回Top 5最相关的文档切片。

第五步:更新状态。把检索到的切片列表存入状态,供后续节点使用。

四、HyDE搜索

什么是HyDE

HyDE(Hypothetical Document Embeddings)是一种让检索更聪明的技巧。当用户只给了一句短问题(比如"HAK180烫金机怎么用"),直接搜可能效果不好,因为问题太短、语义信息太少。

HyDE的做法是:先让大模型"脑补"一段可能的答案或说明文档,这段文字通常更具体、包含更多关键词和专业术语。然后用这段"假想文档"去做向量检索,效果往往比直接用原始问题好得多。

实现流程

第一步:获取假设性答案。把用户的问题发给大模型,让它生成一段假想的答案文档。这段文档会更详细,包含操作步骤、专业术语等。

第二步:向量化检索。把"改写后的问题 + 假设性答案"一起生成向量,到Milvus向量库中检索相关切片。因为假设答案的语义更饱满,更容易命中知识库中的相关内容。

HyDE的缺点是也可能"脑补过头",生成的假设文本带偏方向。所以通常配合过滤、重排或多路检索一起用,不全靠它。

五、网络搜索

网络搜索节点负责调用百炼MCP联网搜索服务,获取互联网上的实时信息,作为本地知识库的补充。

准备工作

使用MCP服务需要先在阿里云百炼平台开通:

  • 注册阿里云账号并完成实名认证
  • 在百炼MCP广场搜索并选择目标搜索服务
  • 配置API Key、选择部署模式和计费模式
  • 获取MCP服务的Streamable HTTP Endpoint地址

处理流程

第一步:建立MCP连接。通过OpenAI SDK连接百炼MCP服务,使用配置好的API Key和Endpoint。

第二步:调用搜索工具。通过 call_tool() 调用百炼的 bailian_web_search 搜索工具,传入用户查询内容。

第三步:解析与格式化。从MCP流式响应中提取有效数据,保留标题、链接、摘要三个核心字段,清洗空值和无效结果,封装为统一的文档列表格式。

第四步:资源清理。无论搜索成功还是失败,都关闭MCP连接释放资源。

第五步:更新状态。将格式化后的网络搜索结果存入状态的 web_search_docs 字段,供后续重排序和答案生成使用。


名词解释

HyDE:一种搜索技巧,先让AI生成假答案再用它去搜向量库,提高检索准确率。
RRF:倒数排名融合算法,不看具体分数只看排名,把多路搜索结果合并排序。
Rerank:重排序,对初筛结果用模型精细打分,把最相关的放前面。
MCP:模型上下文协议,一种让AI调用外部工具的标准接口。
混合检索:同时用稠密向量(语义匹配)和稀疏向量(关键词匹配)搜索,取长补短。
召回:先从数据库里快速找出一批候选结果,不要求很精准。
State:LangGraph里的状态对象,整个工作流中各节点共享的数据容器。
节点:工作流里的一个处理步骤,比如调用模型、处理数据、判断分支。
改写:把用户口语化、模糊的原始问题改写成精准的检索语句。

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐