尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

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

基于 Doris + LangChain 的 AI 助手升级:Embedding + BM25 混合检索改造
📅 发布时间:2026/7/3 2:50:39

一、为什么要做这次改造?

在之前的[《基于Doris+LangChain构建数据智能运营AI助手》]项目中,知识库检索采用的是典型的Embedding向量检索方案。

整体流程如下:

用户问题 ↓Embedding 向量化 ↓Doris 向量检索 ↓TopK知识召回 ↓LLM生成答案

这种方案能够很好地解决语义理解问题,但随着知识库规模不断扩大,我们逐渐发现,仅依赖向量检索并不能覆盖所有场景。

问题一:专业术语召回不稳定

在企业知识库中,经常会出现大量业务术语:

GMV支付转化率风控拒贷率授信通过率

这类问题往往要求精确匹配,而Embedding更擅长理解语义,对于专业名词、缩写词、指标编码的匹配能力相对有限。

问题二:表名、字段名检索效果较差

例如用户查询:

ods_user_login_dirisk_control_scoreloan_apply_cnt

这些内容本质上属于:

表名字段名指标编码枚举值

对于这种精确关键词场景,向量检索的优势并不明显。

问题三:单一路径检索存在天然盲区

检索方式优势
Embedding语义理解能力强,能够发现表达不同但含义相近的内容
BM25关键词匹配能力强,适合术语、指标名、表名、字段名等精确检索场景

二者解决的是不同类型的问题,如果仅依赖其中一种检索方式,都会出现召回盲区。

因此,我们希望同时利用Embedding的语义理解能力以及BM25的关键词匹配能力,构建一套更加稳定的混合检索方案。

二、改造目标

本次升级的核心目标:引入BM25关键词检索,与现有Embedding检索形成双路召回,通过融合排序提升知识库召回准确率。

最终实现:

✅ 提升专业术语召回能力

✅ 提升表名、字段名匹配能力

✅ 降低漏召率

✅ 提高大模型最终回答准确率

三、整体方案设计

本次改造采用业内主流的Hybrid Search(混合检索) 方案。

整体思路如下:

  1. 用户问题同时进入两条检索链路
  2. Embedding检索负责语义召回
  3. BM25检索负责关键词召回
  4. 双路结果通过RRF(Reciprocal Rank Fusion)融合排序
  5. 返回最终Top3结果供大模型生成答案

整体架构如下:

四、检索流程详解

五、核心代码实现

修改search_metric_definitions方法,新增_rrf_fusion方法:

def search_metric_definitions(self, query, types="document", kw="metric"): """搜索相关指标定义 / 表字段信息 — 混合检索版本""" if types == "document": ifnot self.vector_store: return ["未找到相关指标定义"] # === 1. Embedding检索 === query_vec = TextEmbedding.call( model=TextEmbedding.Models.text_embedding_v3, input=query, dimension=512 ).output['embeddings'][0]['embedding'] auth = AuthOptions( host=DORIS_CONFIG["host"], query_port=DORIS_CONFIG["port"], user=DORIS_CONFIG["user"], password="" ) client = DorisVectorClient(database=DORIS_CONFIG["database"], auth_options=auth) table = client.open_table("doris_vector_table") embedding_results = table.search(query_vec, metric_type="l2_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)), key=lambda i: bm25_scores[i], reverse=True )[: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_k=3) 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_k=3, k=60): """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(), key=lambda x: x[1], reverse=True) 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%免费】

相关新闻

  • 免费图床搭建指南:Gitee + PicGo + Typora + Obsidian 全流程
  • 周报总被退回重写?ChatGPT智能日报模板实战手册,含领导关注点自动匹配算法
  • Spring Boot实现百万级数据统计与Excel导出优化

最新新闻

  • mflac怎么快速转mp3格式?3步搞定无损转换
  • 【单片机毕业设计】基于 STM32 的指纹考勤打卡系统设计与实现,基于 ESP-01S 的物联网指纹考勤终端开发(015001)
  • RadiantQ jQuery Gantt Package
  • [Truchet节点]原理解析与实际应用
  • VFBOX网关实现和利时管理系统(OPC DA)数据转发至工控平台(OPC UA)项目案例
  • 嵌入式系统 VHDL 入门笔记:从语法到状态机

日新闻

  • JMeter接口测试实战:从核心元件到复杂场景构建
  • Java Applet版刽子手游戏源码:含完整项目结构、吊杆绘图与胜负逻辑
  • 使用Apache JMeter对RoadRunner PHP应用进行性能测试与调优指南

周新闻

  • Windows字体自定义终极方案:No!! MeiryoUI完全指南
  • Deepin Boot Maker:告别命令行,3分钟制作Linux启动盘的智能解决方案
  • Plain Craft Launcher 2:重新定义你的Minecraft游戏体验

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号