目錄
一、Spring AI Alibaba 的介紹
1.1?什么是 Spring AI Alibaba?
1.2?Spring AI 項目簡介
二、核心概念
2.1?模型
2.2?提示(Prompt)
2.3?提示詞模板(Prompt Template)
2.4?嵌入(Embedding)
2.5?Token
2.6?結構化輸出(Structured Output)
2.7?檢索增強生成(RAG)
2.8?函數調用(Function Calling)
一、Spring AI Alibaba 的介紹
1.1?什么是 Spring AI Alibaba?
Spring AI Alibaba 開源項目基于 Spring AI 構建,是阿里云通義系列模型及服務在 Java AI 應用開發領域的最佳實踐,提供高層次的 AI API 抽象與云原生基礎設施集成方案,幫助開發者快速構建 AI 應用。
Spring AI Alibaba 作為開發 AI 應用程序的基礎框架,定義了以下抽象概念與 API,并提供了 API 與通義系列模型的適配。
- 開發復雜 AI 應用的高階抽象 Fluent API — ChatClient
- 提供多種大模型服務對接能力,包括主流開源與阿里云通義大模型服務(百煉)等
- 支持的模型類型包括聊天、文生圖、音頻轉錄、文生語音等
- 支持同步和流式 API,在保持應用層 API 不變的情況下支持靈活切換底層模型服務,支持特定模型的定制化能力(參數傳遞)
- 支持 Structured Output,即將 AI 模型輸出映射到 POJOs
- 支持矢量數據庫存儲與檢索
- 支持函數調用 Function Calling
- 支持構建 AI Agent 所需要的工具調用和對話內存記憶能力
- 支持 RAG 開發模式,包括離線文檔處理如 DocumentReader、Splitter、Embedding、VectorStore 等,支持 Retrieve 檢索
以上框架功能可讓您實現常見 AI 應用的快速開發,例如 “通過文檔進行問答” 或 “通過文檔進行聊天” 等。
1.2?Spring AI 項目簡介
Spring AI?項目由 Spring 官方開源并維護的 AI 應用開發框架,該項目目標是簡化包含人工智能(AI)功能的應用程序的開發,避免不必要的復雜性。該項目從著名的 Python 項目(例如 LangChain 和 LlamaIndex)中汲取靈感,但 Spring AI 并非這些項目的直接移植,該項目的成立基于這樣的信念:下一波生成式 AI 應用將不僅面向 Python 開發人員,還將遍及多種編程語言。從本質上講,Spring AI 解決了 AI 集成的基本挑戰:Connecting your enterprise Data and APIs with the AI Models。
二、核心概念
2.1?模型
AI 模型是旨在處理和生成信息的算法,通常模仿人類的認知功能。通過從大型數據集中學習模式和見解,這些模型可以做出預測、文本、圖像或其他輸出,從而增強各個行業的各種應用。
AI 模型有很多種,每種都適用于特定的用例。雖然 ChatGPT 及其生成 AI 功能通過文本輸入和輸出吸引了用戶,但許多模型和公司都提供不同的輸入和輸出。在 ChatGPT 之前,許多人都對文本到圖像的生成模型著迷,例如 Midjourney 和 Stable Diffusion。
Spring AI 目前支持以語言、圖像和音頻形式處理輸入和輸出的模型。上表中的最后一行接受文本作為輸入并輸出數字,通常稱為嵌入文本(Embedding Text),用來表示 AI 模型中使用的內部數據結構。Spring AI 提供了對 Embedding 的支持以支持開發更高級的應用場景。
GPT 等模型的獨特之處在于其預訓練特性,正如 GPT 中的“P”所示——Chat Generative Pre-trained Transformer。這種預訓練功能將 AI 轉變為通用的開發工具,開發者使用這種工具不再需要廣泛的機器學習或模型訓練背景。
2.2?提示(Prompt)
Prompt 作為語言基礎輸入的基礎,指導 AI 模型生成特定的輸出。對于熟悉 ChatGPT 的人來說,Prompt 似乎只是輸入到對話框中的文本,然后發送到 API。然而,它的內涵遠不止于此。在許多 AI 模型中,Prompt 的文本不僅僅是一個簡單的字符串。
ChatGPT 的 API 包含多個文本輸入,每個文本輸入都有其角色。例如,系統角色用于告知模型如何行為并設定交互的背景。還有用戶角色,通常是來自用戶的輸入。
分享 Prompt 已成為一種共同的實踐,且正在進行積極的學術研究。例如,最近的一篇研究論文發現,最有效的 Prompt 之一可以以“深呼吸一下,分步進行此任務”開頭。這表明語言的重要性之高。我們尚未完全了解如何充分利用這一技術的前幾代版本,例如 ChatGPT 3.5,更不用說正在開發的新版本了。
2.3?提示詞模板(Prompt Template)
創建有效的 Prompt 涉及建立請求的上下文,并用用戶輸入的特定值替換請求的部分內容。這個過程使用傳統的基于文本的模板引擎來進行 Prompt 的創建和管理。Spring AI 采用開源庫 StringTemplate 來實現這一目的。
Tell me a {adjective} joke about {content}.
在 Spring AI 中,Prompt 模板可以類比于 Spring MVC 架構中的“視圖”。一個模型對象,通常是 java.util.Map,提供給 Template,以填充模板中的占位符。渲染后的字符串成為傳遞給 AI 模型的 Prompt 的內容。
傳遞給模型的 Prompt 在具體數據格式上有相當大的變化。從最初的簡單字符串開始,Prompt 逐漸演變為包含多條消息的格式,其中每條消息中的每個字符串代表模型的不同角色。
2.4?嵌入(Embedding)
嵌入(Embedding)是文本、圖像或視頻的數值表示,能夠捕捉輸入之間的關系,Embedding 通過將文本、圖像和視頻轉換為稱為向量(Vector)的浮點數數組來工作。這些向量旨在捕捉文本、圖像和視頻的含義,Embedding 數組的長度稱為向量的維度。
通過計算兩個文本片段的向量表示之間的數值距離,應用程序可以確定用于生成嵌入向量的對象之間的相似性。
Embedding 在實際應用中,特別是在檢索增強生成(RAG)模式中,具有重要意義。它們使數據能夠在語義空間中表示為點,這類似于歐幾里得幾何的二維空間,但在更高的維度中。這意味著,就像歐幾里得幾何中平面上的點可以根據其坐標的遠近關系而接近或遠離一樣,在語義空間中,點的接近程度反映了意義的相似性。關于相似主題的句子在這個多維空間中的位置較近,就像圖表上彼此靠近的點。這種接近性有助于文本分類、語義搜索,甚至產品推薦等任務,因為它允許人工智能根據這些點在擴展的語義空間中的“位置”來辨別和分組相關概念。
2.5?Token
token 是 AI 模型工作原理的基石。輸入時,模型將單詞轉換為 token。輸出時,它們將 token 轉換回單詞。
在英語中,一個 token 大約對應一個單詞的 75%。作為參考,莎士比亞的全集總共約 90 萬個單詞,翻譯過來大約有 120 萬個 token。
也許更重要的是 “token = 金錢”。在托管 AI 模型的背景下,您的費用由使用的 token 數量決定。輸入和輸出都會影響總 token 數量。
此外,模型還受到 token 限制,這會限制單個 API 調用中處理的文本量。此閾值通常稱為“上下文窗口”。模型不會處理超出此限制的任何文本。
例如,ChatGPT3 的 token 限制為 4K,而 GPT4 則提供不同的選項,例如 8K、16K 和 32K。Anthropic 的 Claude AI 模型的 token 限制為 100K,而 Meta 的最新研究則產生了 1M token 限制模型。
2.6?結構化輸出(Structured Output)
即使您要求回復為 JSON ,AI 模型的輸出通常也會以?java.lang.String
?的形式出現。它可能是正確的 JSON,但它可能并不是你想要的 JSON 數據結構,它只是一個字符串。此外,在提示詞 Prompt 中要求 “返回 JSON” 并非 100% 準確。
這種復雜性導致了一個專門領域的出現,涉及創建 Prompt 以產生預期的輸出,然后將生成的簡單字符串轉換為可用于應用程序集成的數據結構。
2.7?檢索增強生成(RAG)
一種稱為檢索增強生成 (RAG) 的技術已經出現,旨在解決為 AI 模型提供額外的知識輸入,以輔助模型更好的回答問題。
該方法涉及批處理式的編程模型,其中涉及到:從文檔中讀取非結構化數據、對其進行轉換、然后將其寫入矢量數據庫。從高層次上講,這是一個 ETL(提取、轉換和加載)管道。矢量數據庫則用于 RAG 技術的檢索部分。
在將非結構化數據加載到矢量數據庫的過程中,最重要的轉換之一是將原始文檔拆分成較小的部分。將原始文檔拆分成較小部分的過程有兩個重要步驟:
- 將文檔拆分成幾部分,同時保留內容的語義邊界。例如,對于包含段落和表格的文檔,應避免在段落或表格中間拆分文檔;對于代碼,應避免在方法實現的中間拆分代碼。
- 將文檔的各部分進一步拆分成大小僅為 AI 模型令牌 token 限制的一小部分的部分。
RAG 的下一個階段是處理用戶輸入。當用戶的問題需要由 AI 模型回答時,問題和所有“類似”的文檔片段都會被放入發送給 AI 模型的提示中。這就是使用矢量數據庫的原因,它非常擅長查找具有一定相似度的“類似”內容。
2.8?函數調用(Function Calling)
大型語言模型 (LLM) 在訓練后即被凍結,導致知識陳舊,并且無法訪問或修改外部數據。
Function Calling機制解決了這些缺點,它允許您注冊自己的函數,以將大型語言模型連接到外部系統的 API。這些系統可以為 LLM 提供實時數據并代表它們執行數據處理操作。
Spring AI 大大簡化了您需要編寫的代碼以支持函數調用。它為您處理函數調用對話。您可以將函數作為提供,@Bean
然后在提示選項中提供該函數的 bean 名稱以激活該函數。此外,您可以在單個提示中定義和引用多個函數。