iT邦幫忙

2024 iThome 鐵人賽

DAY 20
0
自我挑戰組

與 AI 共舞:打造更高效的日常系列 第 20

打造 RAG 基礎:Spring AI 中的 Embedding 與 Vector Store 整合

  • 分享至 

  • xImage
  •  

引言

在上一篇文章中,我簡單介紹了如何使用 Spring AI 的 Chat Mode,並建立了兩組 API 端點。其中一個是用於基本的聊天模型對話,另一個則是以串流的方式回傳回應內容。在實際應用中,我們傾向使用串流的方式,讓回應內容逐步回傳給使用者,藉此提升使用者體驗。

今天,我計畫新增 Embedding Model 和 Vector Store,為未來實作 RAG(Retrieval-Augmented Generation)應用奠定基礎。

設置 Embedding Model

設定 Embedding Model 非常簡單,因為我們已經完成 OpenAI 的連線設定,包含 API 金鑰的設置。接下來只需要指定要使用的 Embedding Model 即可。在這裡,我選擇了 text-embedding-3-small,這個模型在繁體中文的表現相當出色,而且性價比很高。

想進一步了解繁體中文 Embedding 的評測,可以參考 ihower 的一篇詳細文章:

選擇 Qdrant 作為 Vector Store

在向量資料庫方面,我選擇了 Qdrant。主要原因有兩個:

  1. 「大魔術熊貓工程師」在去年的 iT 鐵人賽中,強力推薦 Qdrant 作為向量資料儲存方案。
  2. Qdrant 提供線上免費版本,其功能足以滿足個人專案的需求。

使用 Qdrant 的步驟如下:

  1. 前往 Qdrant 官方網站申請一個免費的 Cloud instance。
  2. 在 Spring Properties 中設定對應的 Host、Port、API Key 等連線資訊。
  3. 在 Spring Properties 中設定欲使用的 Collection Name。

完成以上步驟後,理論上即可於 Spring 專案中開始使用 Qdrant。

建立 Embedding 的 API 端點

為了展示 Embedding 的效果,我建立了一個簡單的 API 端點 /ai/embedding。在 Spring Framework 中,我們可以利用 @Autowired 讓框架自動完成依賴注入(Dependency Injection),如此一來就不需要手動實例化 Embedding Model 或 Vector Store,相關參數都已在 Properties 中設定完畢。

對於初次接觸 Spring Framework 的開發者來說,這樣的做法或許會感到有些陌生,但熟悉之後就會發現它相當便利。透過框架的依賴注入功能,我們不再需要煩惱建構子的設計以及物件之間的依賴關係,這正是 Spring Framework 強大的優勢所在。

以下是 API 的程式碼範例:

@GetMapping("/ai/embedding")
fun embed(
    @RequestParam(
        value = "message",
        defaultValue = "Tell me a joke"
    ) message: String
): Map<*, *> {
    val embeddingResponse: EmbeddingResponse = embeddingModel.embedForResponse(listOf(message))
    return java.util.Map.of("embedding", embeddingResponse)
}

這個 API 只做一件事:接收一個名為 message 的請求參數,預設值為 "Tell me a joke"。函式中,將 message 轉換為單元素的 List,然後使用 Embedding Model 的 embedForResponse 方法進行嵌入,最終回傳包含嵌入結果的 Map。

解決依賴關係的工具:IntelliJ IDEA 的 Bean Graph

如果您想深入了解 Spring Framework 中 @Autowired 如何將 Spring Beans 注入到其他 Beans,可以使用 IntelliJ IDEA 的 Spring Tools 生成 Bean Graph。這個工具可以協助我們分析應用程式中的依賴關係,生成的 Bean Graph 也可以匯出成圖檔,方便理解每個物件的相依性。我強烈推薦這個小工具給大家使用。

https://ithelp.ithome.com.tw/upload/images/20240930/201682883ChgP1NyGy.png

https://ithelp.ithome.com.tw/upload/images/20240930/201682888l6VCBeCGo.png

面臨的挑戰

原本我還建立了一個 API endpoint,預期將 Embedding 的結果存入 Qdrant 向量資料庫。然而,今天在使用時遇到了一些小問題,花費較多時間仍然無法順利解決。因此,這篇文章無法展示如何將 Embedding 結果存入 Vector Store。這部分的工作就留待明天處理,希望屆時能夠順利解決。

總結

雖然今天的進度沒有達到預期目標,但至少我們分享了如何在 Spring AI 中設定 Embedding Model,以及如何利用 IntelliJ IDEA 的 Bean Graph 功能來理解 Spring Beans 的相依性。相信這些技巧能幫助大家提升開發效率,更深入地理解 Spring 框架的運作原理。

感謝各位的閱讀,我們明天再會!


上一篇
Spring AI 初探:從專案初始化到 OpenAI 聊天模型應用的實現
下一篇
Spring AI 驅動的 ETL 流程:構建文本上傳工作流並實現 RAG
系列文
與 AI 共舞:打造更高效的日常30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言