基于 Doris + LangChain 的 AI 助手升级:Embedding + BM25 混合检索改造

📅 2026/7/3 2:41:41
基于 Doris + LangChain 的 AI 助手升级:Embedding + BM25 混合检索改造
一、为什么要做这次改造在之前的[《基于DorisLangChain构建数据智能运营AI助手》]项目中知识库检索采用的是典型的Embedding向量检索方案。整体流程如下用户问题 ↓Embedding 向量化 ↓Doris 向量检索 ↓TopK知识召回 ↓LLM生成答案这种方案能够很好地解决语义理解问题但随着知识库规模不断扩大我们逐渐发现仅依赖向量检索并不能覆盖所有场景。问题一专业术语召回不稳定在企业知识库中经常会出现大量业务术语GMV支付转化率风控拒贷率授信通过率这类问题往往要求精确匹配而Embedding更擅长理解语义对于专业名词、缩写词、指标编码的匹配能力相对有限。问题二表名、字段名检索效果较差例如用户查询ods_user_login_dirisk_control_scoreloan_apply_cnt这些内容本质上属于表名字段名指标编码枚举值对于这种精确关键词场景向量检索的优势并不明显。问题三单一路径检索存在天然盲区检索方式优势Embedding语义理解能力强能够发现表达不同但含义相近的内容BM25关键词匹配能力强适合术语、指标名、表名、字段名等精确检索场景二者解决的是不同类型的问题如果仅依赖其中一种检索方式都会出现召回盲区。因此我们希望同时利用Embedding的语义理解能力以及BM25的关键词匹配能力构建一套更加稳定的混合检索方案。二、改造目标本次升级的核心目标引入BM25关键词检索与现有Embedding检索形成双路召回通过融合排序提升知识库召回准确率。最终实现✅ 提升专业术语召回能力✅ 提升表名、字段名匹配能力✅ 降低漏召率✅ 提高大模型最终回答准确率三、整体方案设计本次改造采用业内主流的Hybrid Search混合检索 方案。整体思路如下用户问题同时进入两条检索链路Embedding检索负责语义召回BM25检索负责关键词召回双路结果通过RRFReciprocal Rank Fusion融合排序返回最终Top3结果供大模型生成答案整体架构如下四、检索流程详解五、核心代码实现修改search_metric_definitions方法新增_rrf_fusion方法def search_metric_definitions(self, query, typesdocument, kwmetric): 搜索相关指标定义 / 表字段信息 — 混合检索版本 if types document: ifnot self.vector_store: return [未找到相关指标定义] # 1. Embedding检索 query_vec TextEmbedding.call( modelTextEmbedding.Models.text_embedding_v3, inputquery, dimension512 ).output[embeddings][0][embedding] auth AuthOptions( hostDORIS_CONFIG[host], query_portDORIS_CONFIG[port], userDORIS_CONFIG[user], password ) client DorisVectorClient(databaseDORIS_CONFIG[database], auth_optionsauth) table client.open_table(doris_vector_table) embedding_results table.search(query_vec, metric_typel2_distance).limit(10).select([content]).to_list() # 2. BM25检索 corpus [row[1] for row in self.vector_store] tokenized_corpus [list(jieba.cut(doc)) for doc in corpus] bm25 BM25Okapi(tokenized_corpus) tokenized_query list(jieba.cut(query)) bm25_scores bm25.get_scores(tokenized_query) top_bm25_indices sorted( range(len(bm25_scores)), keylambda i: bm25_scores[i], reverseTrue )[:10] bm25_results [{content: corpus[i]} for i in top_bm25_indices if bm25_scores[i] 0] # 3. RRF融合 return self._rrf_fusion(embedding_results, bm25_results, top_k3) elif types table: return search_by_table(kw.strip()) elif types column: return search_by_column(kw.strip()) else: return [未找到相关指标定义]def _rrf_fusion(self, embedding_results, bm25_results, top_k3, k60): Reciprocal Rank Fusion 融合两路检索结果 scores {} for rank, item in enumerate(embedding_results): content item[content] if isinstance(item, dict) else str(item) scores[content] scores.get(content, 0) 1.0 / (k rank 1) for rank, item in enumerate(bm25_results): content item[content] if isinstance(item, dict) else str(item) scores[content] scores.get(content, 0) 1.0 / (k rank 1) sorted_results sorted(scores.items(), keylambda x: x[1], reverseTrue) return [{content: content} for content, _ in sorted_results[:top_k]]学AI大模型的正确顺序千万不要搞错了2026年AI风口已来各行各业的AI渗透肉眼可见超多公司要么转型做AI相关产品要么高薪挖AI技术人才机遇直接摆在眼前有往AI方向发展或者本身有后端编程基础的朋友直接冲AI大模型应用开发转岗超合适就算暂时不打算转岗了解大模型、RAG、Prompt、Agent这些热门概念能上手做简单项目也绝对是求职加分王给大家整理了超全最新的AI大模型应用开发学习清单和资料手把手帮你快速入门学习路线:✅大模型基础认知—大模型核心原理、发展历程、主流模型GPT、文心一言等特点解析✅核心技术模块—RAG检索增强生成、Prompt工程实战、Agent智能体开发逻辑✅开发基础能力—Python进阶、API接口调用、大模型开发框架LangChain等实操✅应用场景开发—智能问答系统、企业知识库、AIGC内容生成工具、行业定制化大模型应用✅项目落地流程—需求拆解、技术选型、模型调优、测试上线、运维迭代✅面试求职冲刺—岗位JD解析、简历AI项目包装、高频面试题汇总、模拟面经以上6大模块看似清晰好上手实则每个部分都有扎实的核心内容需要吃透我把大模型的学习全流程已经整理好了抓住AI时代风口轻松解锁职业新可能希望大家都能把握机遇实现薪资/职业跃迁这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】