Spring AI 使用 Elasticsearch 作為向量數據庫

前言

嗨,大家好,我是雪荷,最近在公司開發 AI 知識庫,同時學到了一些 AI 開發相關的技術,這期先與大家分享一下如何用 ES 當做向量數據庫。

安裝ES

第一步我們先安裝 Elasticsearch,這里建議 Elasticsearch 一定要在 8.13.x 以上,這里我選用的版本為 8.14.3。

下載 Docker Desktop

我使用 Docker 部署的 ES,所以需要先安裝 Docker Desktop,大家根據自己的系統下載。

Mac 安裝 Docker Desktop:Docker—蘋果Mac安裝Docker的兩種方式-CSDN博客

Windows 安裝 Docker Desktop:https://zhuanlan.zhihu.com/p/441965046

啟動 ES

打開命令行直接一條命令梭哈,ES 自從 8.0 版本就默認開啟安全認證了,這里我設置了關閉。

image-20250716215116133

docker run -d \--name elasticsearch \-p 9200:9200 -p 9300:9300 \-e "discovery.type=single-node" \-e "xpack.security.enabled=false" \-e "xpack.security.http.ssl.enabled=false" \elasticsearch:8.14.3

訪問 http://localhost:9200,出現以下界面代表 ES 啟動成功。

image-20250716215136310

部署本地大模型

前往 ollama 官網下載大模型本地部署工具,依舊根據自己系統進行選擇。

image-20250716220233449

下載完畢通過命令行下載大模型,大家可以根據電腦配置和需求下載不同的模型和模型參數,qwen、deepseek 都是可以的,我這里就是 8b 的 deepseek-r1

ollama run deepseek-r1:8b

image-20250716220427770

然后還要部署一個文本嵌入模型,主要將文本轉為向量化,這個模型僅 pull 就好,因為不是文本生成模型 run 不了。

ollama pull mxbai-embed-large:latest

搭建 Spring Boot 項目

搭建 Spring Boot 就不用我教了吧,相信各位佐助都會,建議 Spring Boot 版本要在 3.3.x 以上,我的為 3.5.3。

引入依賴

添加配置類

ES 配置類,主要配置 ES 連接地址、端口和向量數據的相關參數。

@Configuration
public class EsRagConfig {@Beanpublic RestClient restClient() {return RestClient.builder(new HttpHost("localhost", 9200, "http")) // 配置 ES 地址和端口.build();}@Beanpublic VectorStore vectorStore(RestClient restClient, EmbeddingModel embeddingModel) {ElasticsearchVectorStoreOptions options = new ElasticsearchVectorStoreOptions();options.setIndexName("custom-index"); // 設置索引名稱options.setSimilarity(SimilarityFunction.cosine);options.setDimensions(1024); // 設置向量維度return ElasticsearchVectorStore.builder(restClient, embeddingModel).options(options).initializeSchema(true) // 沒有索引時自動創建索引.batchingStrategy(new TokenCountBatchingStrategy()).build();}}

Ollama 配置類

將本地大模型注冊為 Spring Bean,以后通過 ChatClient 來調用,這樣更加自由、定制化。

@Configuration
public class OllamaConfig {@Resourceprivate ChatModel ollamaChatModel;@Resourceprivate LoggerAdvisor loggerAdvisor;@Beanpublic ChatClient chatClient() {return ChatClient.builder(ollamaChatModel).defaultAdvisors(loggerAdvisor).build();}}

排除自動配置類

在 Spring Boot類上排除 Elasticsearch 向量存儲的自動配置類,不然會打架。

配置文件和知識庫文件

主要指定 ollama 地址和本地模型,以及端口號和請求前綴

spring:ai:ollama:base-url: http://localhost:11434chat:model: deepseek-r1:8b
server:address: 0.0.0.0port: 8888servlet:context-path: /api

添加 Markdown 讀取工具和 Markdown 文件

在 resources 目錄放一個要存到向量數據庫的文件。

image-20250716223134562

Markdown 文件內容如下:

image-20250716225147974

新建一個 RagController

@RestController
@RequestMapping("/rag")
public class RagController implements CommandLineRunner {@Resourceprivate ChatClient chatClient;@Resourceprivate ElasticsearchVectorStore vectorStore;@Resourceprivate MyMarkdownReader myMarkdownReader;@Overridepublic void run(String... args) throws Exception {List<Document> documents = myMarkdownReader.loadMarkdown();vectorStore.add(documents);System.out.println("文檔寫入 ES 成功");}@GetMapping("/completion")public String completion(@RequestParam String question) {return chatClient.prompt().user(question).advisors(new QuestionAnswerAdvisor(vectorStore)).call().content();}}
到這基本就 OK 了,隨后啟動項目,查看文件已經寫入成功沒,再通過 ES 調接口,查看是不是真的存儲成功,可以看到真的成了。

image-20250716223208461

image-20250716224214356

調用結果如下:

image-20250716224152260

總結

本文只是實現的一個小 demo,適合小文本場景,對于大文本場景通常需要 ETL (提取

轉換和加載)、token 切分,Rag 相似度匹配,條件過濾,而對于有圖片的文件還需要實現 OCR。如果覺得文章不錯的話,就給我點個贊吧,嘿嘿😋。Spring 官方還提供了各種文件的 reader,可以根據需求和場景選擇合適的 reader,例如 tika 能實現 html、doc、ppt 和 pdf 多種文件的讀取,但是對于 pdf 文件個人不太建議使用 tika 庫,要想學習更多知識就請關注我吧??。

image-20250716225000509

個人項目

厚米匹配

網址:厚米匹配系統

前端倉庫:https://github.com/dnwwdwd/homieMatching-fronted

后端倉庫:https://github.com/dnwwdwd/homieMatching

靈犀 BI

網址:魚智能 BI

前端倉庫:https://github.com/dnwwdwd/Lingxi-BI-fronted

后端倉庫:https://github.com/dnwwdwd/Lingxi-BI

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/89377.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/89377.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/89377.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

TypeScript 配置全解析:tsconfig.json、tsconfig.app.json 與 tsconfig.node.json 的深度指南

前言在現代前端和后端開發中&#xff0c;TypeScript 已經成為許多開發者的首選語言。然而&#xff0c;TypeScript 的配置文件&#xff08;特別是多個配置文件協同工作時&#xff09;常常讓開發者感到困惑。本文將深入探討 tsconfig.json、tsconfig.app.json 和 tsconfig.node.j…

讀書筆記(學會說話)

1、一個人只有會說話&#xff0c;才會有好人緣&#xff0c;做事才會順利。會說話的人容易成功。善于說話的人易成功&#xff0c;而不善說話的人往往寸步難行。我們要把話說得好聽&#xff0c;同時更要把事做得漂亮。或許一句話&#xff0c;一件事&#xff0c;就可能使人生的旅途…

私有服務器AI智能體搭建-大模型選擇優缺點、擴展性、可開發

以下是主流 AI 框架與模型的對比分析&#xff0c;涵蓋其優缺點、擴展性、可開發性等方面。 文章目錄一、AI 框架對比二、主流大模型對比三、擴展性對比總結四、可開發性對比總結五、選擇建議&#xff08;按場景&#xff09;六、未來趨勢一、AI 框架對比 框架優點缺點擴展性可開…

OpenCV直線段檢測算法類cv::line_descriptor::LSDDetector

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 該類用于實現 LSD (Line Segment Detector) 直線段檢測算法。LSD 是一種快速、準確的直線檢測方法&#xff0c;能夠在不依賴邊緣檢測的前提下直接從…

Go語言流程控制(if / for)

分支結構package mainimport ("fmt""strconv" )/* 1.順序結構 2.分支結構 3.循環結構 *//* if 條件1 {// 條件1為真時執行的代碼 } else if 條件2 {// 條件1為假但條件2為真時執行的代碼 } else {// 所有條件均為假時執行的代碼 }一種特殊的條件分支結構if…

wx小程序設置沉浸式導航文字高度問題

第一步&#xff1a;在app.json中設置"navigationStyle": "custom"第二步驟&#xff1a;文件的home.js中// pages/test/test.js Page({/*** 頁面的初始數據*/data: {statusBarHeight: 0,navBarHeight: 44 // 自定義導航內容區高度(單位px)},/*** 生命周期函…

C++算法競賽篇:DevC++ 如何進行debug調試

C算法競賽篇&#xff1a;DevC 如何進行debug調試前言一、準備工作&#xff1a;編譯生成可執行程序二、核心步驟&#xff1a;設置斷點與啟動調試1. 設置斷點2. 啟動調試模式三、調試操作&#xff1a;逐步執行與變量監控1. 逐步執行代碼2. 監控變量值變化四、調試結束前言 在算法…

語音大模型速覽(三)- cosyvoice2

CosyVoice 2: Scalable Streaming Speech Synthesis with Large Language Models 論文鏈接&#xff1a;https://arxiv.org/pdf/2412.10117代碼鏈接&#xff1a;https://github.com/FunAudioLLM/CosyVoice 一句話總結 CosyVoice 2 是一款改進的流式語音合成模型&#xff0c;其…

-lstdc++與-static-libstdc++的用法和差異

CMakeLists.txt 里寫了&#xff1a; target_link_libraries(${PROJECT_NAME} PRIVATEgccstdc ) target_link_options(${PROJECT_NAME} PRIVATE -static-libstdc)看起來像是“鏈接了兩次 C 標準庫”&#xff0c;其實它們的作用完全不同&#xff1a;1. target_link_libraries(...…

Redis學習其二(事務,SpringBoot整合,持久化RDB和AOF)

文章目錄5,事務5.1Redis 事務不保證原子性的原因5.2事務操作過程5.3監控6,SpringBoot整合Redis6.1Redis客戶端6.1.1Jedis簡單使用6.1.2Lettuce&Jedis6.2配置相關6.3使用6.3.1使用RedisTemplate6.3.2Redis工具類7,持久化RDB7.1RDB持久化原理7.2觸發機制save命令flushall命令…

springboot項目部署到K8S

java后臺 創建harbor鏡像拉取Secret&#xff1a;kubectl create secret docker-registry harbor-regcred \--docker-server \ #harbor倉庫地址--docker-username \ #harbor 賬號--docker-password \ #harbor密碼-n productionDockerfile FROM *harbor地址*/library/custom-jdk…

【FPGA開發】一文輕松入門Modelsim的基本操作

Modelsim仿真的步驟 &#xff08;1&#xff09;創建新的工程。 &#xff08;2&#xff09;在彈出的窗口中&#xff0c;確定項目名和工作路徑&#xff0c;庫保持為work不變(如有需要可以根據需求進行更改)。 &#xff08;3&#xff09;添加已經存在的文件&#xff08;rtl代碼和t…

服務攻防-Java組件安全FastJson高版本JNDI不出網C3P0編碼繞WAF寫入文件CI鏈

服務攻防-Java組件安全&FastJson&高版本JNDI&不出網C3P0&編碼繞WAF&寫入文件CI鏈26天 原創 朝陽 Sec朝陽 2025年07月18日 09:23 湖北 標題已修改 演示環境&#xff1a; https://github.com/lemono0/FastJsonParty FastJson全版本Docker漏洞環境(涵蓋1.…

【Python】DRF核心組件詳解:Mixin與Generic視圖

在 Django REST Framework (DRF) 中&#xff0c;mixins.CreateModelMixin、mixins.ListModelMixin、GenericAPIView 和 GenericViewSet 是構建 API 視圖的核心組件。以下是對這些組件的主要方法及其職責的簡要說明&#xff0c;內容清晰且結構化&#xff1a;1. mixins.CreateMod…

HTML+CSS+JS基礎

文章目錄&#xff08;一&#xff09;html1.常見標簽&#xff08;1&#xff09;注釋&#xff08;2&#xff09;標題 h1~h6&#xff08;3&#xff09;段落 p&#xff08;4&#xff09;換行與空格 br \ &#xff08;5&#xff09;格式化標簽 b i s u&#xff08;6&#xff09;…

Vue導出Html為Word中包含圖片在Microsoft Word顯示異常問題

問題背景 碰到一個問題&#xff1a;將包含圖片和SVG數學公式的HTML內容導出為Word文檔時&#xff0c;將圖片都轉為ase64格式導出&#xff0c;在WPS Word中顯示正常&#xff0c;但是在Microsoft Word中出現圖片示異常。具體問題表現 WPS兼容性&#xff1a;在WPS中顯示正常&#…

橢圓曲線密碼學 Elliptic Curve Cryptography

密碼學是研究在存在對抗行為的情況下還能安全通信的技術。即算法加密信息&#xff0c;再算法解密出信息。加密分為兩類 1. Symmetric-key Encryption (secret key encryption) 即一種密鑰&#xff0c;加密和解密使用同一密鑰&#xff0c;可相互轉換 2. Asymmetric-key Encry…

wedo牛-----第47節(免費分享圖紙)

夸克網盤&#xff1a;https://pan.quark.cn/s/4b40a8d18979 高清圖紙源文件&#xff0c;需要的請自取

Unity | AmplifyShaderEditor插件基礎(第十集:噪聲的種類+火焰制作-下)

目錄 一、&#x1f44b;&#x1f3fb;前言 二、圓火焰 三、制作梯度 梯度成品預覽 1.GradientSample節點 2.gradient的用法 3.time節點 四、添加顏色 Color節點 五、火焰搖擺 1.X方向的移動 2.Y方向的移動 3.Z方向的移動 4.把xyz組合起來 Panner節點 六、擺放和…

黑馬Node.js全套入門教程,nodejs新教程含es6模塊化+npm+express+webpack+promise等_ts對象筆記

1.1 什么是運行環境&#xff1f; 運行環境是指代碼正常運行所需的必要環境&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; V8引擎負責解析和執行JavaScript代碼。內置API是由運行環境提供的特殊接口&#xff0c;只能在所屬的運行環境中被調用 1.2 JavaScrip…