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
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/84018.shtml
英文地址,請注明出處:http://en.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 章衍生品知識點總結?

一、衍生品的定義與本質 衍生品,作為一種金融工具,其價值并非獨立存在,而是緊密依賴于其他資產,如常見的股票、債券、商品,或者市場變量,像利率、匯率、股票指數等。這意味著衍生品的價格波動,…