Elasticsearch + Milvus 构建高效知识库问答系统《一》

🔍 Elasticsearch + Milvus 构建高效知识库问答系统(RAG 技术实战)

📌 目录

  1. 背景介绍
  2. Elasticsearch 在知识库检索中的作用
  3. Milvus 在知识库检索中的作用
  4. 混合检索:Elasticsearch + Milvus
  5. 完整代码实现
  6. 部署建议与优化方向
  7. 总结

背景介绍

在构建基于大语言模型(LLM)的知识增强型生成系统(RAG)中,知识库检索是整个流程的核心环节。它决定了模型是否能从庞大的文档中快速定位到相关上下文信息。

传统的 RAG 系统通常采用以下两阶段流程:

[Query] → [Retriever] → [Top-k Docs] → [LLM] → [Answer]

其中 Retriever 可以是稀疏检索(如 BM25)、稠密检索(如 Milvus),也可以是两者的混合。

本文将详细介绍如何使用 ElasticsearchMilvus 来构建一个高效的多模态检索系统,并提供可运行的 Python 示例代码。


Elasticsearch 在知识库检索中的作用

功能概述:

  • 基于关键词匹配的稀疏检索
  • 支持倒排索引和 TF-IDF/BM25 模型
  • 快速召回高相关性文档
  • 支持中文分词、拼音搜索、近义词扩展等功能

适用场景:

  • 中文医疗问答系统
  • 法律条文检索
  • 小规模 FAQ 库
  • 对语义理解要求不高的冷启动阶段

示例代码(Python)

from elasticsearch import Elasticsearch
from sentence_transformers.util import cos_sim# 初始化 ES 客户端
es = Elasticsearch(hosts=["http://localhost:9200"])# 插入文档
doc1 = {"content": "大模型训练需要大量高质量数据"}
doc2 = {"content": "RAG 系统通过外部知识提升回答能力"}
es.index(index="medical_kb", document=doc1)
es.index(index="medical_kb", document=doc2)# 查询
query_body = {"match": {"content": "如何提升问答系统的准确性?"}
}
response = es.search(index="medical_kb", body=query_body)# 输出结果
print("Elasticsearch 回答结果:")
for hit in response['hits']['hits']:print(f" - {hit['_source']['content']}")

Milvus 在知识库检索中的作用

功能概述:

  • 支持高维向量存储与相似度检索(ANN)
  • 可与 BERT、Sentence-BERT、BGE 等句向量模型结合
  • 实现语义级别的相似度计算
  • 支持大规模数据检索(亿级向量)

适用场景:

  • 大规模知识库
  • 高精度语义匹配
  • 图像/文本混合检索
  • LLM + 向量数据库联合部署

示例代码(Python + Milvus)

pip install pymilvus sentence-transformers
from sentence_transformers import SentenceTransformer
from pymilvus import connections, Collection# 加载语义编码器
model = SentenceTransformer('paraphrase-MiniLM-L6-v2')# 连接 Milvus
connections.connect(host='localhost', port='19530')
collection = Collection("faq_collection")# 插入向量(假设你已建立好 collection 并导入了知识库向量化内容)# 查询
query_text = "如何提升问答系统的准确性?"
query_vec = model.encode([query_text])collection.load()
results = collection.search(data=query_vec, anns_field="embedding", param={"metric_type": "IP", "offset": 0}, limit=3)# 输出结果
print("Milvus 语义检索结果:")
for result in results:for hit in result:print(f" - ID: {hit.id} Distance: {hit.distance}")

混合检索:Elasticsearch + Milvus

你可以采用如下流程来构建一个高效的 RAG 问答系统:

[用户问题]↓
Elasticsearch → [Top-50 粗召回文档] ↓
Milvus → [Top-10 语义相似文档]↓
Reranker → [Top-3 最佳匹配段落]

✅ 混合优势:

优点描述
冷启动友好利用 ES 快速上线
语义准确Milvus 提升召回质量
高效排序结合 reranker 进一步优化输出
支持中文可选择支持中文的 embedding 模型

完整代码实现(Python 示例)

以下是一个完整的混合检索流程示例:

from elasticsearch import Elasticsearch
from sentence_transformers import SentenceTransformer
from pymilvus import connections, Collection# 初始化组件
es = Elasticsearch(hosts=["http://localhost:9200"])
model = SentenceTransformer('paraphrase-MiniLM-L6-v2')
connections.connect(host='localhost', port='19530')
milvus_col = Collection("faq_collection")def hybrid_retrieval(query, k=3):# Step 1: Elasticsearch 粗召回es_result = es.search(index="medical_kb", body={"match": {"content": query}})es_docs = [hit["_source"]["content"] for hit in es_result["hits"]["hits"]]# Step 2: Milvus 语义精排query_vec = model.encode([query])milvus_results = milvus_col.search(data=query_vec, anns_field="embedding", param={"metric_type": "IP"}, limit=k)# Step 3: 返回 top-k 文档final_docs = []for result in milvus_results:for hit in result:final_docs.append(es_docs[hit.id])return final_docs[:k]

部署建议与优化方向

1. 数据预处理建议:

  • 使用 jiebaHanLP 对中文进行分词
  • 清洗无意义符号、HTML、乱码
  • 构建统一的数据格式(如 JSON)

2. 索引构建建议:

  • Elasticsearch
    • 使用 ik-analyzer 中文分词插件
    • 设置字段类型为 textkeyword
  • Milvus
    • 使用 HNSW 或 IVF-PQ 索引加速查询
    • 设置合适的维度(如 768 / 1024)
    • 开启 GPU 加速(如支持)

3. 性能调优建议:

组件调优方式
Elasticsearch分片策略、索引合并、关闭不必要的日志
Milvus使用 ANN 索引、调整 nprobe、批量插入
Embedding 模型使用轻量模型(如 bge-small, gte-base
缓存机制Redis 缓存高频问题与答案
异步检索使用 Celery 或 FastAPI 异步接口

4. 可选高级功能:

  • Reranking:使用 BAAI/bge-reranker-base 等交叉编码器进一步打分排序
  • 向量更新机制:定期更新 Milvus 中的知识库向量
  • 混合评分融合:对 ES 和 Milvus 的结果做加权得分排序

总结

方法是否理解语义是否需训练是否支持中文是否适合大规模是否适合冷启动
Elasticsearch❌ 否❌ 否✅ 是✅ 是✅ 是
Milvus✅ 是✅ 是✅(模型决定)✅ 是❌ 否
FAISS✅ 是✅ 是✅(模型决定)⭐ 有限❌ 否
混合检索(ES+Milvus)✅ 是✅ 是✅ 是✅ 是✅ 是

✅ 推荐组合方案

方案一:纯稀疏检索(仅使用 ES)

适合冷启动或无语义模型的场景,无需 GPU 资源。

Query → Elasticsearch → Top-k Docs

方案二:纯稠密检索(仅使用 Milvus)

适合有预训练语义模型(如 BGE、Jina、OpenAI embeddings)的场景。

Query → Dense Encoder → Milvus → Top-k Docs

方案三:混合检索(ES + Milvus)

适合企业级 RAG 系统,兼顾效率与精度。

Query → Elasticsearch → Top-50 Docs↓Milvus → Top-10 Docs↓Reranker → Top-3 最终输出

📌 欢迎点赞、收藏,并关注我,我会持续更新更多关于 AI、LLM、视觉-语言模型等内容!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/pingmian/84018.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

10万QPS高并发请求,如何防止重复下单

1. 前端拦截 首先因为是10万QPS的高并发请求,我们要保护好系统,那就是尽可能减少用户无效请求。 1.1 按钮置灰 很多用户抢票、抢购、抢红包等时候,为了提高抢中的概率,都是疯狂点击按钮。会触发多次请求,导致重复下…

基于单片机的病房呼叫系统(源码+仿真)

该系统由以 STM32F4 为平台的监控终端以及以 CC2530 为平台的无线传感网组成。系统上电后自动完成 ZigBee 网络的组建、终端节点的加入,病人可利用便携式的病人终端发出呼叫求助请求信息、节点在线信息以及对护士的服务评价信息等,这些信息通过路由节点发…

使用WebSocket实时获取印度股票数据源(无调用次数限制)实战

使用WebSocket实时获取印度股票数据源(无调用次数限制)实战 一、前置准备 1. 获取API密钥 登录 StockTV开发者平台 → 联系客服获取测试Key(格式MY4b781f618e3f43c4b055f25fa61941ad),该密钥无调用次数限制且支持实时…

kafka消息积压排查

kafka监控搭建:https://insights.blog.csdn.net/article/details/139129552?spm1001.2101.3001.6650.1&utm_mediumdistribute.pc_relevant.none-task-blog-2%7Edefault%7Ebaidujs_baidulandingword%7EPaidSort-1-139129552-blog-132216491.235%5Ev43%5Econtrol…

Matlab回归预测大合集又更新啦!新增2种高斯过程回归预测模型,已更新41个模型!性价比拉满!

Matlab回归预测大合集又更新啦!新增2种高斯过程回归预测模型,已更新41个模型!性价比拉满! 目录 Matlab回归预测大合集又更新啦!新增2种高斯过程回归预测模型,已更新41个模型!性价比拉满&#xf…

6套bootstrap后台管理界面源码

后端管理系统是指一种用于管理和监控网站、应用程序或系统的后台管理界面。它通常由一组后端代码和数据库组成,用于处理和存储数据,提供给前端用户界面展示和操作数据。 后端管理系统的功能和特点可以包括: 用户权限管理:可以设…

JavaScript性能优化实战:从核心原理到工程实践的全流程解析

下面我给出一个较为系统和深入的解析,帮助你理解和实践“JavaScript 性能优化实战:从核心原理到工程实践的全流程解析”。下面的内容不仅解释了底层原理,也结合实际工程中的最佳模式和工具,帮助你在项目中贯彻性能优化理念&#x…

ELK日志管理框架介绍

在小铃铛的毕业设计中涉及到了ELK日志管理框架,在调研期间发现在中文中没有很好的对ELK框架进行介绍的文章,因此拟在本文中进行较为详细的实现的介绍。 理论知识 ELK 框架介绍 ELK 是一个流行的开源日志管理解决方案堆栈,由三个核心组件组…

2025.6.4总结

工作:今天效率比较高,早上回归4个问题,下午找了3个bug,晚上二刷了科目一(贪吃蛇系统),写了四个点,唯一没达标的就是两自动化没完成。美中不足的是电脑上下载不了PC版的番茄工作软件。…

【vue3学习】vue3入门

目录 1、vue2选项式API 2、Vue3 组合式 API (1)setup 函数​ 基本实现​编辑 补充方法 setup语法糖 (2)响应式数据​ ref reactive: 大家好啊,我是jstart千语。好久没更新咯,因为最近一…

【Linux基础知识系列】第八篇-基本网络配置

网络配置是Linux系统维护中重要的一部分,正确配置网络能够确保系统与其他设备的有效连接。在本篇文章中,我们将探讨Linux系统中的基本网络配置,包括网络接口的管理、IP地址的设置,以及使用ping和traceroute命令进行网络诊断。通过…

React从基础入门到高级实战:React 高级主题 - React设计模式:提升代码架构的艺术

React设计模式:提升代码架构的艺术 引言 在React开发中,设计模式是构建可维护、可扩展和高性能应用的关键。随着应用复杂性的增加,掌握高级设计模式不仅是技术上的挑战,更是打造优雅架构的艺术。对于有经验的开发者而言&#xf…

Chrome书签的导出与导入:步骤图

Chrome书签的导出与导入:步骤图 步骤一:打开 Chrome。点击右上角的“更多”图标。依次选择书签 接着 书签管理器。 步骤二:在管理器中,点击“整理”菜单。 步骤三:选择导出书签。 步骤四:Chrome 会将您的…

PPO和GRPO算法

verl 是现在非常火的 rl 框架,而且已经支持了多个 rl 算法(ppo、grpo 等等)。 过去对 rl 的理解很粗浅(只知道有好多个角色,有的更新权重,有的不更新),也曾硬着头皮看了一些论文和知…

PyTorch——优化器(9)

优化器根据梯度调整参数,以达到降低误差 import torch.optim import torchvision from torch import nn from torch.nn import Sequential, Conv2d, MaxPool2d, Flatten, Linear from torch.utils.data import DataLoader# 加载CIFAR10测试数据集,设置tr…

c++学习-this指针

1.基本概念 非静态成员函数都会默认传递this指针(静态成员函数属于类本身,不属于某个实例对象),方便访问对象对类成员变量和 成员函数。 2.基本使用 编译器实际处理类成员函数,this是第一个隐藏的参数,类…

【Oracle】数据仓库

个人主页:Guiat 归属专栏:Oracle 文章目录 1. 数据仓库概述1.1 为什么需要数据仓库1.2 Oracle数据仓库架构1.3 Oracle数据仓库关键技术 2. 数据仓库建模2.1 维度建模基础2.2 星形模式设计2.3 雪花模式设计2.4 缓慢变化维度(SCD)处…

css-塞贝尔曲线

文章目录 1、定义2、使用和解释 1、定义 cubic-bezier() 函数定义了一个贝塞尔曲线(Cubic Bezier)语法:cubic-bezier(x1,y1,x2,y2) 2、使用和解释 x1,y1,x2,y2,表示两个点的坐标P1(x1,y1),P2(x2,y2)将以一条直线放在范围只有 1 的坐标轴中,并…

函数式接口实现分页查询

你提供的 PageResult 类是一个非常完整、功能齐全的分页结果封装类,它包含了: 当前页数据(list)总记录数(totalCount)总页数(totalPage)当前页码(pageNo)每页…

Global Security Markets 第 10 章衍生品知识点总结​

一、衍生品的定义与本质 衍生品,作为一种金融工具,其价值并非独立存在,而是紧密依赖于其他资产,如常见的股票、债券、商品,或者市场变量,像利率、汇率、股票指数等。这意味着衍生品的价格波动,…