Day19 有兩個 Advisor 還沒說,分別是 VectorStoreChatMemoryAdvisor 及 QuestionAnswerAdvisor,由於兩者都需要向量資料庫,今天就先教大家透過 docker 安裝向量資料庫
向量資料庫是一種專門用於存儲和管理高維向量的資料庫,這些向量是數據特徵或屬性的數學表示。向量資料庫的核心功能是基於相似性進行查詢,這在機器學習和人工智慧應用中尤為重要,因為它們能夠快速識別和檢索相似的數據點。
向量資料庫通常採用 k-最近鄰 (k-NN) 索引技術,並使用 Hierarchical Navigable Small World (HNSW) 和 Inverted File Index (IVF) 等算法來實現高效的查詢和檢索。這些技術使得資料庫能夠在快速找到最接近的向量,從而提高查詢的速度和準確性。
簡單的說向量資料庫能夠用演算法來計算資料的相似程度並儲存在資料庫中,查詢時一樣使用演算法列出前幾筆相似資料,他不像傳統查詢需要關鍵字完全一樣才能查出內容
凱文大叔的電腦是 Windows 10,安裝 Docker Desktop 是最快速方便的,下面是下載路徑以及原廠的安裝教學
以前我們需要先透過 docker 指令安裝及啟動 docker 環境,不過 Spring Boot 3 加入了 Docker Compose Support 套件,只要引入這個 starter,Spring 就能跟 docker 整合,在啟動及結束程式都會執行 docker 指令幫我們開關 docker 容器,另外使用資料庫還需要驅動程式,可以在 AI 模組下找到 Neo4j Vector Database
如果已經有專案也可以直接在 pom.xml 加入下面兩個依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-docker-compose</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-neo4j-store-spring-boot-starter</artifactId>
</dependency>
接著就能設定 docker compose 的設定檔了,如果建立專案時勾選 Docker Compose Support,這樣專案目錄下就會自動產生一個 compose.yaml,手動修改 pom.xml 就要自己增加這個檔案
注意!是在專案目錄下,不是 resources 目錄下
支援向量儲存的資料庫非常多,下面這些是 Spring AI 支援的
之後大家有興趣也可以測試不同的向量資料庫,程式基本上不用改變,只要更改設定就能切換不同資料庫
至於凱文大叔為何挑選 Neo4j 呢?Neo4j 是一種以 Graph 為資料結構的 NoSQL 資料庫,有沒有覺得很眼熟?沒錯,前幾個月微軟發表的 Graph RAG 正是以 Graph 為資料結構建立 RAG 的知識圖譜,不過鐵人賽凱文大叔只會講到一般的 RAG,未來看有沒有神人將程式搬到 java,我們就可以直接使用了
接著簡單介紹 compose.yaml 的參數
services:
neo4j:
image: 'neo4j:latest' #docker image,冒號後是版本,若要使用最新版就打lastest
environment:
- 'NEO4J_AUTH=neo4j/password' #登入Neo4j的帳號密碼
ports:
#開放的port,冒號前是對外的port,冒號後是容器內部的port
- '7474:7474' #7474是管理工具使用的 port
- '7687:7687' #7687是程式要連線的 port
volumes:
#將容器內的檔案儲存在本機端,一來容易修改設定檔,二來方便傳移到其他環境
#冒號前是本機存放路徑,冒號後是容器內部路徑
- d:/docker/neo4j/data:/data
- d:/docker/neo4j/logs:/logs
- d:/docker/neo4j/import:/import
- d:/docker/neo4j/plugins:/plugins
- d:/docker/neo4j/conf:/conf
接著就是見證奇蹟的時刻,啟動 Spring 專案就會看到 log 中顯示 docker 檔案下載的進度條
然後更神奇的事情發生了,凱文大叔並沒有設定 datasource,Spring 竟可以自己建立連線
原來 Spring 會自動抓 compose.yaml 的設定作為 datasource,不過只有測試時比較方便,實際使用還是設定在 application.yml 比較好
我們就先將 Neo4j 的設定加入吧
spring:
ai:
openai:
api-key: ${OPENAI_KEY}
chat:
options:
model: gpt-4o-mini
neo4j:
authentication:
password: password
username: neo4j
uri: neo4j+s://localhost
要看 Neo4j 是否能連線還可以透過瀏覽器進入管理工具確認,只要在瀏覽器輸入下面網址
http://localhost:7474
Neo4j 正常啟動的話就能出下面網頁
今天學到了甚麼?
最後提醒一下要啟動 Docker 容器前時記得先把 Docker Desktop 啟動
程式碼下載: https://github.com/kevintsai1202/SpringBoot-AI-Day19.git
凱文大叔使用 Java 開發程式超過 20 年,對於 Java 生態非常熟悉,曾使用反射機制開發 ETL 框架,對 Spring 背後的原理非常清楚,目前以 Spring Boot 作為後端開發框架,前端使用 React 搭配 Ant Design
下班之餘在 Amazing Talker 擔任程式語言講師,並獲得學員的一致好評
最近剛成立一個粉絲專頁-凱文大叔教你寫程式 歡迎大家多追蹤,我會不定期分享實用的知識以及程式開發技巧
想討論 Spring 的 Java 開發人員可以加入 FB 討論區 Spring Boot Developer Taiwan
我是凱文大叔,歡迎一起加入學習程式的行列